在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作为贴图显示
相关推荐
2401_8920709818 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei18 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
不爱吃炸鸡柳18 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发18 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎19 小时前
STL 栈 队列
开发语言·c++
2401_8920709819 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生19 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿19 小时前
vector
c语言·开发语言·数据结构·c++·算法
cccyi719 小时前
【C++ 脚手架】etcd 的介绍与使用
c++·服务发现·etcd·服务注册
liu****19 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯