当前位置: 首页 > 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秒&…...

LLM 笔记:Speculative Decoding 投机采样

1 基本介绍 投机采样&#xff08;Speculative Sampling&#xff09;是一种并行预测多个可能输出&#xff0c;然后快速验证并采纳正确部分的加速策略 在不牺牲输出质量的前提下&#xff0c;减少语言模型生成 token 所需的时间 传统的语言模型生成是 串行 的 必须生成一个&…...

【深度学习新浪潮】如何入门三维重建?

入门三维重建算法技术需要结合数学基础、计算机视觉理论、编程实践和项目经验,以下是系统的学习路径和建议: 一、基础知识储备 1. 数学基础 线性代数:矩阵运算、向量空间、特征分解(用于相机矩阵、变换矩阵推导)。几何基础:三维几何(点、线、面的表示)、射影几何(单…...

iview中的table组件点击一行中的任意一点选中本行

<Table border ref"selection" size"small" on-row-click"onClickRow"></Table>// table组件点击一行任意位置选中onClickRow(row, index) {this.$refs.selection.toggleSelect(index)}写上toggleSelect(index)方法即可&#xff0c;…...

leetcode刷题日记——1.组合总和

解答&#xff1a; class Solution { public:void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {if(idxcandidates.size()){//遍历完的边界return;}if(target0){//找完了能组成和…...

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...

每日Prompt:双重曝光

提示词 新中式&#xff0c;这幅图像将人体头像轮廓与山水中式建筑融为一体&#xff0c;双重曝光&#xff0c;体现了反思、内心平静以及人与自然相互联系的主题&#xff0c;靛蓝&#xff0c;水墨画&#xff0c;晕染&#xff0c;极简...

C# 中替换多层级数据的 Id 和 ParentId,保持主从或父子关系不变

在C#中替换多层级数据的Id和ParentId&#xff0c;同时保持父子关系不变&#xff0c;可以通过以下步骤实现&#xff1a; 创建旧Id到新Id的映射&#xff1a;遍历所有节点&#xff0c;为每个旧Id生成唯一的新Id&#xff0c;并存储在字典中。 替换节点的Id和ParentId&#xff1a;…...

git commit 执行报错 sh: -/: invalid option

目录 目录 1. 检查 Git 钩子脚本&#xff08;核心步骤&#xff09;2. 临时绕过钩子&#xff08;快速提交&#xff09;3. 修复钩子依赖环境4. 重新初始化 Husky&#xff08;如适用&#xff09;5. 验证用户配置 Tips&#xff1a; 如果是 clone 下来的新项目直接进行 步骤 4 。…...

RabbitMQ 在解决数据库高并发问题中的定位和核心机制

RabbitMQ 在解决数据库高并发问题中的定位和核心机制 它是间接但极其有效的解决方案&#xff0c;以下内容聚焦如何最大化发挥 RabbitMQ 的潜力&#xff1a; 一、核心机制落地强化方案 1. 精准的异步化切割 关键原则&#xff1a;区分 “必须同步” 和 “可异步” 操作 #merma…...

如何从零开始建设一个网站?

当你没有建站的基础和建站的知识&#xff0c;那么应该如何开展网站建设和网站管理。而今天的教程是不管你是为自己建站还是为他人建站都适合的。本教程会指导你如何进入建站&#xff0c;将建站的步骤给大家分解&#xff1a; 首先我们了解一下&#xff0c;建站需要那些步骤和流程…...