在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作为贴图显示
相关推荐
一丝晨光3 分钟前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
愚润求学15 分钟前
【Linux】简单设计libc库
linux·运维·开发语言·c++·笔记
刚入坑的新人编程19 分钟前
C++STL——map和set的使用
开发语言·c++
洛克希德马丁26 分钟前
QLineEdit增加点击回显功能
c++·qt·ui
Darkwanderor41 分钟前
c++STL-list的使用和迭代器
c++·list
似水এ᭄往昔1 小时前
【数据结构】——栈和队列OJ
c语言·数据结构·c++
双叶8362 小时前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
格林威3 小时前
Baumer工业相机堡盟工业相机的工业视觉是否可以在室外可以做视觉检测项目
c++·人工智能·数码相机·计算机视觉·视觉检测
追烽少年x3 小时前
C++11异步编程 --- async
c++
虾球xz4 小时前
游戏引擎学习第277天:稀疏实体系统
c++·学习·游戏引擎