当前位置: 首页 > news >正文

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

相关文章:

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

1. kanzi studio设置 1.1 创建一个纹理贴图&#xff0c;起名Render Target Texture 1.2 创建一个Image节点&#xff0c;使用该贴图 2. 代码设置 2.1 创建一个自定义节点类 class mynode2d : public Node2D { public: virtual void renderOverride(Renderer3D& renderer…...

IDEA中通义灵码的使用技巧

大家好&#xff0c;我是 V 哥。在日常写代码的过程中&#xff0c;通过 AI 工具辅助开发已是当下程序员惯用的方式&#xff0c;V 哥在使用了众多的 AI 工具后&#xff0c;多数情况下&#xff0c;选择通义灵码来辅助开发&#xff0c;尤其是解释代码和生成单元测试功能甚是好用&am…...

JS中let var 和const区别

在JavaScript中&#xff0c;let、var 和 const 都是用来声明变量的关键字&#xff0c;但它们之间有几个关键的区别&#xff1a; 作用域&#xff08;Scope&#xff09;: var 声明的变量拥有函数作用域&#xff08;function scope&#xff09;&#xff0c;这意味着如果 var 变量在…...

ansible详细介绍和具体步骤

Ansible简介 1.1 Ansible的基本概念 Ansible是一款开源的自动化工具&#xff0c;旨在简化IT操作的复杂性。它由Michael DeHaan创建&#xff0c;并于2012年发布&#xff0c;随后在2015年被Red Hat收购。Ansible的核心理念是“简单即美”&#xff0c;它通过使用YAML&#xff08…...

利用LangChain与LLM打造个性化私有文档搜索系统

我们知道LLM&#xff08;大语言模型&#xff09;的底模是基于已经过期的公开数据训练出来的&#xff0c;对于新的知识或者私有化的数据LLM一般无法作答&#xff0c;此时LLM会出现“幻觉”。针对“幻觉”问题&#xff0c;一般的解决方案是采用RAG做检索增强。 但是我们不可能把…...

linux中的软、硬链接

目录 引言 简单介绍 如何理解软硬链接 链接的应用 环路问题 引言 在Linux操作系统的广阔天地中&#xff0c;文件管理是其核心功能之一。而软链接和硬链接作为Linux文件系统中的两种特殊链接方式&#xff0c;它们为用户提供了灵活的文件访问途径和高效的磁盘空间利用手段。…...

Ubuntu 系统、Docker配置、Docker的常用软件配置(下)

前言 书接上文&#xff0c;现在操作系统已经有了&#xff0c;作为程序的载体Docker也安装配置好了&#xff0c;接下来我们需要让Docker发挥它的法力了。 Docker常用软件的安装 1.Redis 缓存安装 1.1 下载 docker pull redis:7.4.1 #可改为自己需要的版本 1.2 创建本地目录存储…...

jdk,openjdk,oraclejdk

Java是开发语言&#xff0c;不是软件。JDK是软件&#xff0c;使用OpenJDK是免费的&#xff0c;一直免费。而且OpenJDK正儿巴经的Java社区推出来的JDK。 Oracle JDK主要是面向付费能力强的企业用户&#xff0c;收费已经好多年了&#xff0c;不是一两年的事&#xff0c;JDK8是JDK…...

Docker Hub 镜像加速器

零、参考资料 https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6Daemon proxy configuration | Docker Docs 一、解决方案 1、问题现象 Error response from daemon: Get "https://index.docker.io/v1/search?qcarlasim%2Fcarla&n25": dia…...

DevOps赋能:优化业务价值流的实战策略与路径(上)

上篇&#xff1a;价值流引领与可视化体系构建 一、前言 在快速迭代的软件项目和产品开发生态中&#xff0c;我们始终围绕两个核心目标&#xff1a;一是确保每一项工作都能为客户创造实际价值&#xff0c;这是产品团队的核心使命&#xff1b;二是确保这些有价值的工作能够高效…...

int的取值范围

原码&#xff08;True form&#xff09;&#xff1a;原码是一种计算机中对数字的二进制表示方法&#xff0c;数码序列中最高位为符号位&#xff0c;符号位为0表示正数&#xff0c;符号位为&#xff11;表示负数&#xff1b;其余有效值部分用二进制的绝对值表示。 反码&#xf…...

图文检索(16):IDC: Boost Text-to-Image Retrieval via Indirect and Direct Connections

IDC: Boost Text-to-Image Retrieval via Indirect and Direct Connections 摘要3 方法3.1 直接连接3.2 间接连接3.3 DLB 正则化 结论 发布时间&#xff08;2024 LREC-COLING&#xff09; 标题&#xff1a;IDC&#xff1a;通过间接和直接连接增强文本到图像的检索 摘要 本文&…...

企业数字化转型:重识、深思、重启新征程-亿发

在当下这个日新月异的时代&#xff0c;企业数字化转型已然成为众多企业竞相追逐的发展方向&#xff0c;可真正能将其领悟透彻并有效落地实施的企业&#xff0c;却并非比比皆是。此刻&#xff0c;亿发软件针对企业数字化转型展开一次更为深入的重识、全面的深思&#xff0c;进而…...

仓颉刷题录-字符串数字转换(一)

文章目录 背景题目&#xff1a;交换后字典序最小的字符串个人感受 这是双子专栏&#xff1a; Cangjie仓颉程序设计-个人总结 本专栏还在持续更新&#xff1a; 仓颉编程cangjie刷题录 背景 报名了一个仓颉的比赛&#xff0c;感觉条件要求挺低的&#xff0c;就想上。哈哈哈。但…...

SpringBoot【实用篇】- 配置高级

文章目录 目标&#xff1a;1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标&#xff1a; ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…...

liunx CentOs7安装MQTT服务器(mosquitto)

查找 mosquitto 软件包 yum list all | grep mosquitto出现以上两个即可进行安装&#xff0c;如果没有出现则需要安装EPEL软件库。 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm查看 mosquitto 信息 yum info mosquitto安装 mosquitt…...

【银河麒麟高级服务器操作系统】虚拟机lvm分区丢失现象分析及解决建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 环境描述 系统环境 物理机/虚拟机/云/容器 虚拟…...

Android 原子性类型都有哪些

1. 基本类型原子类 AtomicInteger&#xff1a;用于对整数进行原子操作&#xff0c;如incrementAndGet()方法可以原子地将当前值加1并返回新值&#xff0c;getAndSet()方法可以原子地设置新值并返回旧值。AtomicLong&#xff1a;和AtomicInteger类似&#xff0c;用于长整型的原…...

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…...

ffplay 实现视频流中音频的延迟

ffplay -rtsp_transport tcp -i rtsp://admin:1234qwer192.168.1.64:554/Streaming/Channels/101 -vn -af "adelay5000|5000"在这个命令中&#xff1a; -vn 参数表示只播放音频。 -af "adelay5000|5000" 参数表示将音频延迟5000毫秒&#xff08;即5秒&…...

终极指南:如何在Mac上免费实现NTFS读写功能

终极指南&#xff1a;如何在Mac上免费实现NTFS读写功能 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for NTFS dri…...

乡村智慧民宿系统|提质增收!巨有科技打造乡村旅居新模式

乡村旅居、民宿康养已经成为乡村文旅主流消费趋势。但大量乡村民宿依旧处于散户经营状态&#xff0c;预定混乱、管控松散、对账困难、同质化严重。巨有科技贴合乡村民宿分散、小规模、本土化的特点&#xff0c;搭建智慧民宿管理系统&#xff0c;用数字化手段规范经营、优化体验…...

Linux密钥权限检查排查方法

Linux密钥权限检查排查方法本文面向具备一定 Linux 基础的技术人员&#xff0c;围绕密钥权限检查展开&#xff0c;重点讨论授权文件、私钥权限和登录失败。在中级运维和系统管理工作中&#xff0c;这类主题常常与配置变更、资源状态、权限边界、自动化任务和业务影响交织在一起…...

LabVIEW虚拟仪表:数据流编程与测控应用的核心交互范式

1. 项目概述&#xff1a;为什么虚拟仪表是LabVIEW的灵魂如果你用过LabVIEW&#xff0c;或者哪怕只是看过它的界面&#xff0c;第一印象大概率是那些花花绿绿的旋钮、开关、仪表盘和波形图。很多人觉得这就是LabVIEW的“皮肤”&#xff0c;一个为了让程序看起来像真实仪器而做的…...

SaaS ERP和传统ERP,到底差在哪?

这几年&#xff0c;ERP这个词越来越火。但有意思的是&#xff0c;很多企业老板、管理层&#xff0c;甚至已经在用ERP的人&#xff0c;其实都没真正分清&#xff1a;“SaaS ERP”和“传统ERP”&#xff0c;到底差在哪。很多人会觉得&#xff1a;“不都是ERP吗&#xff1f;不就是…...

换背景照片怎么制作?一篇全网最全的AI抠图工具对比指南

最近经常有朋友问我&#xff1a;"怎样才能快速换背景照片啊&#xff1f;"确实&#xff0c;随着自媒体时代的到来&#xff0c;无论是做电商展示产品、准备证件照&#xff0c;还是制作社交媒体内容&#xff0c;都离不开换背景这个需求。今天我就把这两年用过的所有抠图…...

【NotebookLM戏剧研究辅助实战指南】:20年戏剧学者亲授AI赋能文本细读的5大黄金工作流

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM戏剧研究辅助的底层逻辑与学科适配性 NotebookLM 以“语义锚点驱动”为核心机制&#xff0c;将用户上传的原始文本&#xff08;如莎士比亚手稿影印本OCR结果、梅兰芳口述史转录稿、《奥尼尔书…...

从零到一:基于Kettle(PDI)构建企业级数据集成管道

1. 企业级数据集成为何选择Kettle&#xff1f; 第一次接触Kettle&#xff08;现在官方称为Pentaho Data Integration&#xff09;是在2013年一个银行数据迁移项目上。当时客户需要将分散在20多个业务系统中的客户数据整合到新建的数据仓库&#xff0c;项目组评估了多个ETL工具后…...

告别仿真报错!手把手教你用Quartus II 21.1和ModelSim 2022.1创建Testbench(附完整代码)

Quartus II与ModelSim联合仿真实战&#xff1a;从零构建高可靠性Testbench 在数字电路设计领域&#xff0c;仿真验证环节往往决定着项目成败。据统计&#xff0c;超过60%的FPGA开发时间消耗在功能验证阶段&#xff0c;而其中近半问题源于Testbench编写不当或仿真环境配置错误。…...

基础知识丨JAVA序列化与反序列化漏洞

今天在学习的时候又接触到了JAVA反序列化漏洞。一直只知道JAVA反序列化就是利用反序列化工具进行攻击&#xff0c;在目标系统中执行命令&#xff0c;利用的就是传输对象时采用JAVA序列化。但是也只知道这么多了。所以&#xff0c;就想着今天再了解一下反序列化漏洞。顺便&#…...