Shader_七彩球
0x00 准备工作
如上篇文章中所说创建shader,赋给材质球,把材质球赋给物体。下面我会简单再说一下,详细可看上一篇文章Unity Shader(一)_初识Shader
- 创建一个Unity Shader,并且命名为RGBSphere。(自己可以随意啊,我暂时是这么起的)
- 创建一个材质,把它命名为RGBSphereMat,并把步骤1中的shader赋给该材质。
- 创建一个球体,位置调整好以便在Game窗口处能看到,并把步骤2中的材质赋给该球体。
打开刚刚创建的shader,并且把里面的代码删掉改为下面的代码:
Shader "Aiting_Cg/RGBSphere" { SubShader{ Pass{ CGPROGRAM #pragma vertex vert //编译 顶点 vert(vert 功能顶点着色器) #pragma fragment frag //编译 片段 frag(frag功能片段着色器) //对于多个顶点输出参数。 //定义一个输出参数结构体 struct vertexOutput{ float4 pos : SV_POSITION; float4 col : TEXCOORDO; }; vertexOutput vert(float4 vertexPos:POSITION) //顶点着色器 { vertexOutput output; //不需要再这里输入结构体 output.pos=UnityObjectToClipPos(vertexPos); output.col=vertexPos+float4(0.5,0.5,0.5,0.0); /* 这里顶点着色器将输出数据 * 写入输出结构体。在x,y,z坐标上加0.5,因为立方体的坐标介于-0.5和0.5之间 * 我们需要介于0.0~1.0之间 */ return output; } float4 frag (vertexOutput input):COLOR //frag功能片段着色器 { return input.col; /* 这里片段着色器返回带有语义TEXTCOOROO的“col” * 输入参数作为无名 * 输出参数和语义COLOR. */ } ENDCG } } }
实现效果如下:
结构体的格式如下: struct StructName{ TypeName : Semantic; (自起):(语义) TypeName : Semantic; ... };
0x01 Out限定符
可以使用顶点着色器函数的参数和out限定符来替代输出结构的方法,如下:
void vert(float4 vertexPos:POSITION,out float4 pos:SV_POSITION,out float4 col :TEXCOORDO) { pos=UnityObjectToClipPos(vertexPos); col=vertexPos+float4(0.5,0.5,0.5,0.0); return; } float4 frag(float4 pos:SV_POSITION,float4 col:TEXCOORDO):COLOR { return col; }
但是,输出结构的使用在实践中更常见,更好确保顶点输出参数和片段输入参数具有匹配的语义。
0x02 顶点输出参数的插值
关于顶点输出参数和片段输入参数的还没有完全结束。如果选择立方体游戏对象,在“场景视图”中看到它仅包含12个三角形和8个顶点。因此,顶点着色器可能仅被调用八次,并且只有八个不同的输出被写入顶点输出参数。但是,立方体上还有更多颜色。那是怎么发生的?
实际上,只为每个三角形的每个顶点调用顶点着色器。但是,不同顶点的顶点输出参数的不同值在三角形内插。然后,对于由三角形覆盖的每个像素调用片段着色器,并接收顶点输出参数的内插值作为片段输入参数。
如果要确保片段着色器通过顶点着色器接收一个精确的非插值值,您可以确保顶点着色器将相同的值写入三角形的所有顶点的顶点输出参数,或者您可以使用HLSL存储类修饰符nointerpolation。
0x03 摘要
在这一篇中主要给出了一个小例子,用到的就是顶点与片元之间的通信,顶点输出参数的插值这些知识。理论不是太会讲述,有什么意见随时欢迎各位大佬提出!!!小例子有需要的就拿去使用吧。共同学习共同进步!!!☺☺☺
网站推荐:
本作品由A_AiTing采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。