博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.3 使用包装数组
阅读量:6999 次
发布时间:2019-06-27

本文共 1172 字,大约阅读时间需要 3 分钟。

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.3节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.3 使用包装数组

简单来讲,着色器中的代码需要在屏幕的每一个像素上执行,这也是为什么GPU现在都需要优化成并行计算的。同样的道理,在Cg中的标准变量类型和操作符也得考虑这些优化。理解这些原理不仅有助于正确使用着色器,而且可以帮助我们写出更优的代码。

2.3.1 操作步骤

在Cg中有两种类型的变量:单一值变量和包装数组。后者很容易通过名字识别出来,因为通常会在名字后面加一个数,比如float3或者int4。顾名思义,这种包装数组类型的变量类似于结构体,每一个数组包含数个单一值。Cg将其称为包装数组,尽管这种结构并不是传统意义上的数组。

包装数组的元素可以作为一个普通结构访问到,一般称之为x、y、z和w。然而Cg还给这些元素提供了一些其他的名字,比如r、g、b、a等。使用xyzw和rgba是没有区别的,但是对于读者而言却有很大差异,因此应该选择合适的方式让代码更加表义。其实着色器编码通常是处理一些位置和颜色的计算。你可能已经在标准着色器中见过了:

24d48e4b73120b0d958c6b5fe2cca54e5c168186
在这一行代码中,o是一个结构体,_Color是一个包装数组。这也是为什么Cg不允许将两种方式混着用:比如不能使用_Color.xgz。
包装数组的另外一个不同于C#的重要功能是调和(swizzling)。Cg也可以通过简单一行代码来处理和重新排序包装数组中的元素。再看一个标准着色器中的例子:

8e302c8e41a12d95d3d511d39d20064b87b2a9da
Albedo是fixed3类型的,也就是说其包含三个fixed类型的值。然而_Color是定义为fixed4类型的,如果直接将Color赋值给Albedo会出现编译错误,因为类型不匹配。C#中的实现方式会是这样的:

4fdd0f6bf07fd3727600d82c73fb617bb4276329
但是在Cg中可以使用一种简化方式:

a867ee7c721a41e54fadc91bb68307ac349c5d65
Cg还可以对元素重新排序,比如写成_Color.bgr可以将红色成分和蓝色成分进行对调。
最后,如果将单一值赋给包装数组,则这个单一值会 填充数组的每一个元素:

a867ee7c721a41e54fadc91bb68307ac349c5d65
这一特性又称为涂抹(smearing)。
调和也可以用在表达式的左边,以重写包装数组的部分元素:

0f9e71fbe7e3035a2a740d7f77d4a6590c027290
这种情况称为遮罩(masking)。
包装矩阵
调和特性真正大显身手的地方是用在包装矩阵上。Cg接受矩阵类型的声明,比如float4×4表示一个浮点型数据构成的4行4列的矩阵。你可以通过_mRC标注来访问矩阵的某个具体元素,其中R表示行号,C表示列号:

6a9acc4b3df364831897ee34e5242a43e6b0fdec
_mRC标注可以链式调用:

20c5d6cb6b12dd539c1045470f66b8e9c6b54d8e
使用中括号可以选择一整行:

4943d4ffa113892f8dee4ec3e15255cd46ebf173

2.3.2 参考

包装数组可以说是Cg中最酷炫的特性之一,你可以访问下列网址查看关于包装数组的更多内容:。

转载地址:http://wgdvl.baihongyu.com/

你可能感兴趣的文章
EntityType 'UserInfo' has no key defined. Define the key for this EntityType.
查看>>
Merge PDF File using itextsharp library
查看>>
使用微软的TFS云服务
查看>>
[已解]如何设置xib 中 ipad 的开发模式为横屏
查看>>
Repeater控件使用
查看>>
[Android] 华为荣耀2制作fastboot线刷包[海思平台]
查看>>
慢慢 的变老
查看>>
高效能TCP通讯基础组件Beetle.Express
查看>>
MyEclipse内存不足配置
查看>>
四舍五入网络Java保留两位小数
查看>>
MFC 循环界面假死的解决(MFC 按钮终止循环)
查看>>
详细解说九宫图比较常用的多控件布局
查看>>
程序员的出路在哪里?挣钱的机会来了续-福利来了,仿QQ界面,放出全部源码,打造创业框架及实现思路...
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
DIV固定在页面某个位置,不随鼠标滚动而滚动
查看>>
android 根据SD卡中图片路径读取并显示SD中的图片——源代码
查看>>
浅析Android线程模型一 --- 转
查看>>
Cocos2d-x PluginX (二)增加新的Plugin
查看>>
python-django开发学习笔记四
查看>>
cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)...
查看>>