翻译 Cg Program in Unity - 1.3 Debug (二)

来源:互联网 发布:js定时刷新 编辑:程序博客网 时间:2024/05/20 18:18

上半段的文章讲到了在UnityCg.cginc中预定义了一些vertex input的结构体.接来下就要进入正题啦.

怎么去分析我们弄出来的False-Color Image

当我们要看懂它时,很重要一点就是要集中在单一颜色上面. 举例子来说, 这里有一个球体, 他的shader中的输入参数texcoord绑定了TEXCOORD0, 我们将这个texcoord的值赋值给fragment中的color, 然后球体上面红色的部分就是texcoord中的x部分可视化了. 要注意的是不管它是纯红色, 还是很黄很黄的颜色或者说品红色, 在这所有颜色的red值都是1. 反着说就是, 不管是蓝色, 绿色, 或者蓝绿色, 这些颜色中,red的值都是0. 如果你从来没有学习过只关注一个颜色部分, 想这样做可能对你很困难.  因此, 你可以考虑一次只看一个颜色. 那么我们可以在vertex shader代码中这样做:
output.col = float4(input.texcoord.x, 0.0, 0.0, 1.0);
这个设置以后, texcoord的x就是红色,而蓝色和绿色都被设置成了0,也就不会干扰我们的观察;
当你这样设置以后,你再去围绕着去观察球体上的红色,可以看到值都是从0到1变化的. 而360°到0°颜色又重置到最初的颜色. 分界线看起来就像星球表面上的一个经线一样.(在球体坐标中, x对应的参数叫做方位角 - azimuth).
我们看到texcoord中的x的变化对应了精度, 而y的变化就对应着维度(球体坐标中称之为倾角 - inclination). 不管怎么说, 我们应该注意texture coordinate的值总是 0 到 1之间的; 因此, 0 这个值在底部(南半球) , 1 在上面(北半球).  然后我们将其他颜色去掉, 只留绿色:
output.col = float4(0.0, input.texcoord.y, 0.0, 1.0);
Texture coordinate非常容易观察,因为他的值就是0到1的,和我们颜色的标示一样.同样的,单位向量(比如说normal的值通常就是单位向量)也非常容易观察, 因为他的值是从-1到1.我们可以轻松的将值映射成为0到1.只需要加1,然后除以2.0即可.
output.col = float4((input.normal + float3(1.0, 1.0, 1.0)) / 2.0, 1.0);
注意,normal向量是三维向量, 我们将他的三维值都加+1 再除以2.
如果以后你要管擦的值的范围不是0到1或者-1到1,那么你需要自己想办法将他的范围转化为0到1, 这样才能用颜色来表示他的结果. 当你自己都不确定哪个值是我们想要的时候,你可以自己多试试. 当然在Unity中,如果你给出的颜色的值不在0到1这个范围, Unity也会自动的截取这个值,保证他在0到1之间. 也就是说小于0的值会被当成0, 大于1的值会被当成1.所以说知道你要调试的值的范围很重要.知道它的范围之后, 你可以尝试的创建出一个映射关系出来,保证他的值在0到1之间.

实践

为了去实践我们这张讲到的这堆东西,  这里给出一些代码, 都是一些在vertex shader给col赋值的代码. 你的任务就是分析每一行代码在为什么会得到一个黑色的结果. 在最后, 你可以去试试将你不确定的值可视化, 分析他的范围, 映射到0到1的范围. 下面代码里的很多知识会在很多讲到:
<pre name="code" class="cpp">output.col = input.texcoord - float4(1.5, 2.3, 1.1, 0.0);output.col = float4(input.texcoord.z);output.col = input.texcoord / tan(0.0);output.col = dot(input.normal, float3(input.tangent)) * input.texcoord;output.col = dot(cross(input.normal, float3(input.tangent)), input.normal) * input.texcoord;output.col = float4(cross(input.normal, input.normal), 1.0);output.col = float4(cross(input.normal, float3(input.vertex)), 1.0);// only for a sphere!output.col = radians(input.texcoord);

总结

恭嘿咧! 你又读完了一章! 你学到了:
  • 内置的inpu parameter
  • 如果将shader里面的值可视化
0 0
原创粉丝点击