【图形学】15 UnityShader语义(三)

来源:《UNITY SHADER入门精要》

1、三种基本类型

  在CG/HLSL中,有3种精度的数值类型:float、half、fixed。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CczOYdOl-1659408023835)(assets/image-20220617173821809.png)]

2、Shader Target

  如果我们在Unity中进行了过多的运算,使得需要的临时寄存器数目或者指令数目超过了当前可支持的数目。我们可以通过指定更高等级的 Shader Target 来消除这些错误,下表给出了当前支持的 Shader Target:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLnN8vVL-1659408023836)(assets/image-20220617174838790.png)]

3、Shader Model

  Shader Model 是微软提出的一套规范,就是它们决定了 Shader 中各个特性的能力(capability)。这些特性和能力体现在 Shader 能使用的运算指令数目、寄存器个数等各个方面。Shader Model等级越高,Shader 的能力越大。

4、Mesh相关概念

Unity怎么知道如何绘制一个物体呢?这得了解网格(Mesh)的相关概念
Mesh:模型的网格,包括顶点坐标法线纹理坐标三角形绘制序列等其他有用属性和功能。
Mesh Filter:网格过滤器,它包含一个Mesh组件,并且会将这个Mesh传递给Mesh Renderer组件进行渲染。
Mesh Renderer:网格渲染器,获取Mesh Filter传过来的Mesh,按照所在游戏物体变换组件(Transform,用来更改网格的位置、方向和大小)定义的位置渲染Mesh
也就是说,Unity通过Mesh Filter获取物体的Mesh,并且将该Mesh传递给Mesh Renderer进行绘制。

5、输入\输出和语义绑定

​ Cg中不存在指针的概念,所有数据通常都是暂存在寄存器中。

​ Cg中s的关键字很多都是照搬C\C++中的关键字。

in、out、inout用来表示函数输入参数的传递方式。这里先提一下形参和实参的区别,形参是指定义函数名和函数体时使用的参数,目的是接收调入参数时传入的参数;实参是指调用函数时,传入的参数。参数的传递分为值传递和引用传递,值传递时,函数处理的是传入实参的拷贝,不会影响实参的原值;引用传递时,函数处理的是实参的地址(C\C++使用指针,CG中使用in、out、inout关键字),会影响原有实参的值。in修饰形参,表示形参只用于输入,典型的值传递。out修饰形参,表示形参只用于函数的输出,也可以用return代替out修饰符使用。inout修饰形参,表示形参即用于输入也用于输出,典型的引用传递。

​ const和uniform是独立的,可同时使用也可单独使用。

uniform用来修饰只能由外部应用程序传入的变量。在Cg中输入的数据流分为两类:第一类Varying inputs表示输入数据流中图元信息的各种组成要素,包括顶点位置、法向量以及纹理坐标数据等。第二类Uniform数据由外部应用程序初始化并传入,不会随着图元信息的变化而变化。

const用来修饰变量为常量变量。表示const修饰的变量初始化之后,其值不会改变。

6、顶点和片元着色器的输入/输出语义

顶点着色程序的输入语义:

​ POSITION:四元向量,最后一元数据为1,表示模型空间内的顶点位置坐标,在OpenGL中对应接收应用程序传递顶点数据的寄存器上。

​ NORMAL:四元向量,最后一元数据为0,表示模型空间中顶点法向量坐标,在OpenGL中对应接收应用程序传递顶点法向量的寄存器上。

顶点着色程序的输出语义及片段着色程序的输入语句:

​ 顶点着色程序的输出语义会被传入到片段着色程序中。

​ 语义包括POSITION、PSIZE、FOG、COLOR0-COLOR1,TEXCOORD0-TEXCOORD7。

​ 顶点着色程序中必须绑定一个输出语义POSITION,作为裁剪空间中的顶点坐标,该数据只被用于光栅化。

​ 为了保持顶点着色程序输出语义和片段着色程序输入语义的一致性,推荐使用struct类型数据作为两者之间的传递。例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jYwjKDDb-1659408023837)(assets/img)]

​ 这里值得注意的地方是,在顶点着色程序中,输入语义和输出语义中都包括一个POSITION语义。两者是不同的,前者是应用程序中模型空间中的顶点坐标,是用来顶点着色程序对顶点坐标进行处理的。后者是顶点着色程序输出的裁剪空间顶点坐标,是用来给片段程序做光栅化处理的。两者都为POSITION语义,但作用是不一样的。

片段着色程序的输出语义

​ 片段着色程序的输出语义通常只有一个,COLOR作为该片段的最终颜色值。

猜你喜欢

转载自blog.csdn.net/qq_40891541/article/details/126117574