在kanzi 3.9.8里使用API创建自定义材质

1. kanzi studio设置

1.1 创建一个纹理贴图,起名Render Target Texture

1.2 创建一个Image节点,使用该贴图

2. 代码设置

2.1 创建一个自定义节点类

c++ 复制代码
class mynode2d : public Node2D
{
public:
virtual void renderOverride(Renderer3D& renderer, CompositionStack& compositionStack, const optional< Matrix3x3 >& baseTransform);
}

2.2 实现函数renderOverride,创建shader和材质

c++ 复制代码
const char* shaderCodeVertex = "attribute vec3 kzPosition;\n\
attribute vec2 kzTextureCoordinate0;\n\
varying vec2 vTexCoord;\n\
varying vec4 ParticleColor;\n\
uniform highp mat4 projectMatrix;\n\
uniform highp mat4 modelMatrix;\n\
uniform vec2 offset;\n\
uniform vec4 color;\n\
uniform float scale;\n\
void main()\n\
{\n\
    precision mediump float;\n\
    //float scale = 10.0f;\n\
    vTexCoord = kzTextureCoordinate0;\n\
    ParticleColor = color;\n\
    gl_Position =  vec4(kzPosition.xyz, 1.0);\n\
}";

const char* shaderCodeFragment = "\n\
uniform sampler2D Texture;\n\
uniform int hasTexture;\n\
varying vec2 vTexCoord;\n\
varying vec4 ParticleColor;\n\
void main()\n\
{\n\
    precision lowp float;\n\
    //vec2 uv = vTexCoord * 2.0 - 1.0;\n\
    if(1==hasTexture){\n\
        vec4 color = texture2D(Texture, vTexCoord);\n\
        gl_FragColor.rgba = color * ParticleColor;\n\
    }\n\
    else{\n\
        gl_FragColor.rgba = ParticleColor;\n\
    }\n\
    gl_FragColor.rgba = vec4(1.0, 1.0, 0.0, 1.0);\n\
}";

ShaderProgram::CreateInfoShaderSourc
es createInfoShaderSources(shaderCodeVertex, shaderCodeFragment);
        ShaderAttributeCollection shaderAttributeCollection;
        ShaderVertexAttribute kzPosition("kzPosition", VertexAttribute::SemanticPosition, 0, GraphicsElementTypeFLOAT, 1, 3, 0, 0);
        ShaderVertexAttribute kzTextureCoordinate0("kzTextureCoordinate0", VertexAttribute::SemanticTextureCoordinate, 0, GraphicsElementTypeFLOAT, 1, 2, 1, 0);

        shaderAttributeCollection.push_back(kzPosition);
        shaderAttributeCollection.push_back(kzTextureCoordinate0);

        createInfoShaderSources.vertexFormat = shaderAttributeCollection;
        //createInfoShaderSources.addUniform(DynamicPropertyType<Matrix4x4>("kzProjectionCameraWorldMatrix"),  ShaderProgram::UniformTransformationPassThrough);

        ShaderProgram::CreateInfo::Status status = createInfoShaderSources.validate(*m_renderer);

        if (status == ShaderProgram::CreateInfo::StatusValid) {
           // m_shaderProgram = new ShaderProgram(getDomain(), createInfoShaderSources, "shaderProgram");
        }
        else {
            printf("status error=%d\n", status);
            return;
        }
        
  ShaderProgramSharedPtr m_shaderProgram = ShaderProgram::create(getDomain(), createInfoShaderSources, "shaderProgram");
        m_shaderProgramP = m_shaderProgram.get();

		//创建材质
        MaterialSharedPtr material = Material::create(getDomain(), "Example material", m_shaderProgram);

		//创建材质画刷
        MaterialBrushSharedPtr mm = MaterialBrush::create(getDomain(), "mm");
        mm->setMaterial(material);
		//设置背景刷
        setProperty(Node2D::BackgroundBrushProperty, mm);

2.3 设置离屏渲染到目标纹理上

c++ 复制代码
 kanzi::TextureSharedPtr m_texture = getResourceManager()->acquireResource<Texture>("kzb://mtk_demo/Textures/Render Target Texture");
    NativeFramebufferHandle NativeFramebufferHandle1 = m_texture->getNativeFramebufferHandle();

    if (NativeFramebufferHandle1 != 0) {
        m_renderer->setActiveFramebuffer(NativeFramebufferHandle1);

        unsigned int oldshader = m_renderer->getActiveShaderHandle();
        
        m_shaderProgramP->bind();
        
        m_renderer->setClearColor(ColorRGBA(1.0, 1.0, 0.0, 0.0));
        m_renderer->addClearTarget(GraphicsClearTargetColor0);
        m_renderer->addClearTarget(GraphicsClearTargetDepth);

        m_renderer->clear();

        m_renderer->flush();

        m_renderer->bindFramebuffer(0);

        m_renderer->setActiveFramebuffer(old);

    }
    else {
        kzLogDebug(("render NativeFramebufferHandle1={}", NativeFramebufferHandle1));
    }

3. 动态创建节点

c++ 复制代码
virtual void onProjectLoaded() KZ_OVERRIDE
{
mynode2dSharedPtr n = mynode2d::create(getDomain(), "mynode");
Node2DSharedPtr r = getRoot();
if (r) {
r->addChild(n);
}
}

4. 运行效果

  • 自定义节点mynode使用了自定义材质作为背景刷
  • Image使用Render Target Texture作为贴图显示
相关推荐
2601_956121976 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-8 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场10 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑10 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ11 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海12 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu12313 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`15 小时前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子16 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray