使用NVIDIA FX Composer验证多纹理合成效果

news2024/11/25 20:41:49

最近项目上有一个需求,需要将4张带透明通道纹理合成为一张,并且每张纹理指定一个全局透明度。由于纹理过多,合成效果无法保证,为了减少项目的风险,领导希望我先快速验证一下我们讨论的方法是否能完成项目的要求。因此我花了几天时间研究了一下NVIDIA FX Composer工具的使用,并且通过此工具简单验证了一下4张纹理的合成效果。

NVIDIA FX Composer工具安装包的下载地址

NVIDIA FX Composer工具使用说明书下载地址

下面我们先简单介绍一下NVIDIA FX Composer工具的使用,NVIDIA FX Composer打开以后会弹出一个向导窗口提示你新建工程,向导窗口如下:

你点击“New Project”按钮新建一个工程,然后会弹出如下窗口:

这里我把工程命名为“FadeInOutComposite”,工程路径指定为“F:\KStudy\NVIDIA FX Composer\Projects”。你可以按你自己的需求指定工程名称和路径。点击“OK”按钮以后,工程就新建好了,会弹出工具的主界面。主界面如下图所示:

图中已经大概对每个区域有个简单的介绍。

下面我们就一步一步来实现我们需要的4张纹理合成效果,步骤如下:

  • 添加一个平面对象到场景中,我们需要把我们最终合成的纹理通过平面对象呈现出来。

点击一下工具栏的图标“”,此时我们的左边的资源管理列表和右下角渲染窗口里面会多出一些东西,如下图:

  • 为了让我们更方便的观察这个平面的图像,我们需要把右下角渲染窗口的视图改为顶视图。操作如下图:

此时可以清楚的看到平面显示的内容。

  • 添加一个新的材质和Effect对象,来实现我们想要的4张纹理合成效果。

在资源管理列表窗口的“Effects”栏目上右键,会弹出如下窗口:

点击“Add Effect...”菜单,会弹出如下窗口:

勾选“HLSL FX”.然后点击"Next"按钮,弹出如下窗口:

按上图框选的方式填写,然后点击"next"按钮,弹出如下图:

点击"Finish"按钮完成材质和Effect的添加。然后删除原本自带的默认材质和Effect,将新创建的材质“FadeInOutComposite_Material”拖动到渲染窗口的平面上,此时工程显示的效果如下图:

  • 修改Effect的内容,使其支持4张纹理和多个透明通道的输入。

修改Effect的代码如下:

/*
keywords: material classic

date: 2023-07-17

*/

//#define NOT_INCLUDE_FOREIMAGE

texture BackTexture <
    string UIName =  "Back Texture";
    string ResourceType = "2D";
>;

texture FadeOutTexture <
    string UIName =  "Fade-out Texture";
    string ResourceType = "2D";
>;

texture FadeInTexture <
    string UIName =  "Fade-in Texture";
    string ResourceType = "2D";
>;

texture ForeTexture <
    string UIName =  "Fore Texture";
    string ResourceType = "2D";
>;

sampler2D BackSampler = sampler_state {
    Texture = <BackTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};  
sampler2D FadeOutSampler = sampler_state {
    Texture = <FadeOutTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};  
sampler2D FadeInSampler = sampler_state {
    Texture = <FadeInTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};  
sampler2D ForeSampler = sampler_state {
    Texture = <ForeTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};  

float FadeInAlpha;
float FadeOutAlpha;
float BackAlpha;
float ForeAlpha;

float4x4 WorldViewProj : WorldViewProjection;

/* data from application vertex buffer */
struct appdata {
    float3 Position	: POSITION;
    float4 UV		: TEXCOORD0;
};

/* data passed from vertex shader to pixel shader */
struct vertexOutput {
    float4 HPosition	: POSITION;
    float2 UV		: TEXCOORD0;
};

vertexOutput mainVS(appdata IN){
	vertexOutput OUT = (vertexOutput)0;
	OUT.HPosition = mul(float4(IN.Position, 1.0), WorldViewProj);
	OUT.UV = IN.UV;
	return OUT;
}

float4 mainPS(vertexOutput IN) : COLOR {
	float4 BackColor=tex2D(BackSampler,IN.UV);
	float4 FadeInColor=tex2D(FadeInSampler,IN.UV);
	float4 FadeOutColor=tex2D(FadeOutSampler,IN.UV);
	float FadeInAlpha1=FadeInAlpha*FadeInColor.a;	//compute FadeIn Alpha
	float FadeOutAlpha1=FadeOutAlpha*FadeOutColor.a;//compute FadeOut Alpha
	float BackAlpha1=BackColor.a * BackAlpha;		//compute BackImage Alpha;
	float3 BackColor1=BackColor.xyz * BackAlpha1;	//compute BackImage Color
	float BackAlpha2=max(0.0f,1.0f-(FadeInAlpha1+FadeOutAlpha1));//compute FadeIn-Out BackImage Alpha
	float3 color=FadeInColor.xyz * FadeInAlpha1 + FadeOutColor.xyz * FadeOutAlpha1 + BackColor1 * BackAlpha2;//Calculate the resultant color of the following 3 textures
	#ifdef NOT_INCLUDE_FOREIMAGE
	return float4(color,1.0f);
	#else
	float4 ForeColor=tex2D(ForeSampler,IN.UV);
	float ForeAlpha1=ForeAlpha * ForeColor.a;//compute ForeImage Alpha;
	float Follow3TexAlpha=max(0,1.0f - ForeAlpha1);
	float3 color1 = ForeColor.xyz * ForeAlpha1 + color * Follow3TexAlpha;
	return float4(color1,1.0f);
	//return float4(1.0f,1.0f,0.0f,1.0f);
	#endif
}

technique technique0 {
	pass p0 {
		CullMode = None;
		AlphaBlendEnable = True;
		SrcBlend = SRCALPHA;
		DestBlend = INVSRCALPHA;
		VertexShader = compile vs_3_0 mainVS();
		PixelShader = compile ps_3_0 mainPS();
	}
}

 点击工具的“”按钮,会重新编译Effect代码。此时选中资源管理列表中的材质对象。此时右边属性窗口会显示选中材质的输入参数,如下图:

  • 给FadeInOutComposite_Material材质指定对应的输入参数。

给选中的材质指定对应的背景,淡入,淡出,前景纹理图像和指定的Alpha值,最终右下角渲染窗口中会实时显示你指定参数的效果,如下图:

此时你可以通过修改属性窗口中输入参数查看右下角渲染窗口的实时效果。

最后给上整个工程的下载路径:https://download.csdn.net/download/xiaoyafang123/88059384

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GO语言泛型

set一般没什么不方便的 但是使用GET 需要使用类型断言,将取出来的数据转为预期数据, 空接口本身是一个装箱,会产生内存逃逸和多一部分空间. 于是1.17GO使用泛型. 泛型实现: 分析可执行文件后:发现 也就是泛型会为每个数据类型都生产一套代码,导致可执行文件大小增加,并且使用…

在企业使用jmeter开展实际的接口自动化测试工具

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

关于AES 和 BASE64 的理解

BASE64 首先 base64 是一种编码方式&#xff0c;它的字符集由64个不同字符组成&#xff08;A-Z、a-z、0-9和两个额外字符/&#xff09;&#xff0c;因此每个Base64字符都占用6个比特&#xff08;2^6 64&#xff09; Base64编码后的数据长度 4 * ceil(原始数据长度 / 3) 其中…

echarts 横向柱状图 刻度标签

echarts 横向柱状图 刻度标签 怎么调试都不左对齐 将width去掉固定宽度 echarts会自适应

如何录音转文字:探寻声音的文字之舞

随着科技的飞速进步&#xff0c;人们对于信息的传递和记录变得越发便捷。在这个数字化时代&#xff0c;录音转文字技术无疑是一颗璀璨的明珠&#xff0c;它让声音和文字在交织中跳跃&#xff0c;为我们带来了新的感知和体验。在这篇文章中&#xff0c;我们将深入探讨录音转文字…

DCDC芯片选型

一、BUCK芯片选型 最初MP2307特别好用&#xff0c;是由美国MPS公司推出

信息摘要 秘钥签名 数字签名 数字证书 数字验证 这都是什么东西?

信息摘要 秘钥签名 数字签名 数字证书 数字验证 这都是什么东西&#xff1f; 一下遇见这么多相近的名词&#xff0c;实在是难以区分理解&#xff0c;还是从这些概念产生的缘由理解吧 先看需求&#xff1a;如何保证 数据 在网络中传输时正确的&#xff1f;有没有被篡改&#x…

【算法 -- LeetCode】(022) 括号生成

1、题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a; 输入…

软件测试测试用例

等价类&#xff1a;把输入的数据可以分为有效的数据和无效的数据 被测试的对象输入的数据&#xff1a; 1、有效的数据 2、无效的数据 测试一个产品&#xff0c;需要考虑它的正确场景&#xff0c;也需要考虑它的异常场景 边界值:边界值测试用例是针对等价类测试用例方法的补…

7月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年7月10日-7月16日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

【基于 GitLab 的 CI/CD 实践】04、GitLab Pipeline 实践(中)

目录 cache 缓存 cache:paths cache:key 缓存标记 cache:key:files 文件变化自动创建缓存 cache:key:prefix 组合生产 SHA 校验和 cache:policy 缓存策略 综合实例(一) 全局缓存 Pipeline 日志分析 Runner 缓存 综合实例&#xff08;二&#xff09; artifacts 制品…

NOTA P2 RM26,拮抗剂,与NOTA螯合剂偶联,结构式及相关应用介绍

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 英文名称&#xff1a;NOTA-P2-RM26 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;N/A 分子式&#xff1a;C73H110N18O19 分子量&#xff1a;1543.8NOTA-P2-RM26结构式&#xff1a; 反应机理&#xff1a; NOTA-P2-RM26&…

八股总结(七)MySQL与Redis

文章目录 MySQL基础概念数据库三大范式是什么&#xff1f; 索引 Redis基本概念1、为什么用Redis作为MySQL的缓存&#xff1f; 数据结构2、Redis包含哪些数据类型&#xff1f;使用场景是什么&#xff1f;3、五种场景的Redis数据类型底层都是怎么实现的&#xff1f; Redis线程网络…

Mysql如何查询出两个日期之间的所有日期?

问题&#xff1a; 有时我们在生成一些时间轴类似的数据时&#xff0c;要求数据库不管有没有指定天的数据&#xff0c;都要生成该时间节点&#xff0c;可用mysql.help_topic来解决此类问题&#xff0c;通过序列和日期函数相结合来满足我们的业务需求。 例如&#xff1a;查询20…

ASUS华硕ROG幻14 2021款GA401QM原厂Win10系统工厂模式带ASUS Recovery恢复功能

自带恢复分区、所有驱动、出厂主题壁纸LOGO、Office办公软件、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘(非必需) 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;11.34GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

Kotlin开发笔记:类型安全和转换

Kotlin开发笔记:类型安全 类型安全是编程中非常重要的内容&#xff0c;在实际编程中我们总是会遇到许许多多的空指针异常&#xff0c;类型错误等异常。因此解决好类型安全的问题可以大大提升程序的健壮性。同时Kotlin针对类型安全就引入了许多有用的机制&#xff0c;它将帮助我…

pytorch 2.0初探:和pytorch 1.13的速度对比

看到pytorch2.0出来了&#xff0c;而且宣传提速明显&#xff0c;一行代码即可提速43%左右&#xff1a; compiled_model torch.compile(model) We then measure speedups and validate accuracy across these models. Since speedups can be dependent on data-type, we measu…

Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的

一般情况下&#xff0c;开发一个系统都需要前端和后端&#xff0c;仅靠一个人几乎无法胜任&#xff0c;需要考虑的特性和功能非常多&#xff0c;比如&#xff1a; 需要一个数据库来存放数据&#xff1b;需要一个文件存储来存放各种文件&#xff0c;比如图片文件&#xff1b;后…

旅行社优惠卡app软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

0基础学习VR全景平台篇 第65篇:VR直播-如何创建VR直播

开启一次VR直播只需简单三步&#xff1a;VR直播相机连接网线并开机>新建一个直播活动>将直播活动的推流地址填入直播相机。 1、将鼠标移至【开始创作】菜单&#xff0c;点击【全景直播】。 2、进入VR直播活动的创建页面&#xff0c;根据国家互联网相关政策&#xff0c;创…