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

1. kanzi studio设置

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

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

在这里插入图片描述

2. 代码设置

2.1 创建一个自定义节点类

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

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


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 设置离屏渲染到目标纹理上

 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. 动态创建节点

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作为贴图显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音频中sample rate是什么意思?

‌sample rate‌在数字信号处理中&#xff0c;指的是‌采样频率‌&#xff0c;即每秒钟从连续信号中抽取的样本数量。采样频率越高&#xff0c;信号的还原度越高&#xff0c;但同时也会增加计算负担和存储需求‌。 实际应用场景 在音频处理中&#xff0c;设置合适的采样率可以…

杨辉三角形

大家好&#xff0c;今天给大家分享一下杨辉三角形是如何打印的&#xff0c;首先我们来看看它的原理。 我们先来看结果 1.如果把它看为一个二维数组&#xff08;包括后面的空格&#xff09;&#xff0c;那么它数字的这边是一个直角三角形&#xff0c;它的第一列和对角线都为1&a…

详解ARM64可执行程序的生成过程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ ARM64可执行程序的生成过程 根据 ARM64 可执行程序生成的四个主要步骤&#xff1a;预处理、编译、汇编、链接&#xff0c;我们可以详细分解整个过程如下 1. …

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目&#xff0c;其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型&#xff08;例如 GPT&#xff09;能够直接与数据库进行交互&#xff0c;从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

升序数组两两不相等

题目&#xff1a;给定一个排好升序的数组A[1],A[2],… A[n]&#xff0c;其元素的值两两都不相等。请设计一个高效算法&#xff0c;找出其中所有A[]i的下标&#xff0c;并分析其复杂度。 算法分析&#xff1a;一个升序且值都不相等的数组&#xff0c;如果第一个数大于右下标&…

基于vue框架的的乐守护儿童成长记录系统b65tg(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,成长指标,疫苗接种,学业档案,课外活动,旅游经历,交流论坛 开题报告内容 基于Vue框架的乐守护儿童成长记录系统开题报告 一、研究背景与意义 随着科技的飞速发展和家庭对子女成长关注度的不断提升&#xff0c;如何科学、系统地记…

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

使用Git LFS管理大型文件

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Git LFS管理大型文件 引言 Git LFS 简介 安装 Git LFS 安装 Git 安装 Git LFS 配置 Git LFS 初始化 Git 仓库 指定需要使用…

RHCE的练习(10)

实验1&#xff1a;反向解析 准备工作 [rootserver ~]# setenforce 0[rootserver ~]# systemctl stop firewalld# 服务端安装bind软件 [rootserver ~]# dnf install bind -y DNS配置 第一步&#xff1a;服务端操作&#xff0c;编辑bind主配置文件 [rootbogon ~]# cat /e…

Redis-结构化value对象的类型

文章目录 一、Redis的结构化value对象类型的介绍二、Redis的这些结构化value对象类型的通用操作查看指定key的数据类型查看所有的key判断指定key是否存在为已存在的key进行重命名为指定key设置存活时间pexpire与expire 查看指定Key的存活时间为指定key设置成永久存活 三、Redis…

产品结构设计(六):结构设计全过程

参考引用 产品结构设计实例教程 1. ID 图及 PCB 堆叠分析 1.1 产品说明及相关资料 1、新产品开发指令单 2、ID 图 3、产品功能规格书 1.2 ID 图分析 ID&#xff08;Industrial Design&#xff0c;工业设计&#xff09;是以工业产品为主要对象&#xff0c;综合运用工学、…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

webGlL变量的声明与使用

抢先观看&#xff1a; 变量的声明格式&#xff1a;<存储限定符><类型限定符><变量名> 存储限定符&#xff1a;const, attribute, uniform, varying, buffer。 类型限定符&#xff1a;void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…

免费送源码:Java+CSS+springboot Springboot高校医务室管理系统 计算机毕业设计原创定制

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

CDN加速实战:使用七牛云CDN加速阿里云OSS资源访问

今天是双11搞活动,在阿里云1元注册了个域名,想着在学CDN,想使用CDN做个加速项目,但是阿里的要收费,上网查了下七牛云的不收费,想着将七牛云的CDN结合阿里的DNS做个访问加速,刚好看到了阿里的一个文章,照着改了改,实践成功了。 阿里文章:使用CDN加速OSS资源访问_对象…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

笔记本电脑买i7还是i9?i7和i9处理器区别详细介绍

i7和i9处理器都是英特尔&#xff08;Intel&#xff09;公司生产的高性能处理器&#xff0c;但它们有一些显著的区别。为了帮助你做出明智的选择&#xff0c;下面我们详细介绍一下i7和i9处理器的区别&#xff0c;以及如何根据你的需求来选择合适的处理器。 一、i7处理器的特点…

51c大模型~合集12

我自己的原文哦~ https://blog.51cto.com/whaosoft/11564858 #ProCo 无限contrastive pairs的长尾对比学习 , 个人主页&#xff1a;https://andy-du20.github.io 本文介绍清华大学的一篇关于长尾视觉识别的论文: Probabilistic Contrastive Learning for Long-Tailed Visua…

【数据结构篇】探索堆的算法的巧妙

须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1f;别忘了点…

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…