[Unity3D][Shader]PANCgShader--第一章 基础--02 RGB方块(vertex输出参数)

Shader内容

Shader "My/RGBCube"
{ 
    SubShader
    {         
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

			struct vertexOutput{
				float4 pos:SV_POSITION;
				
				//TEXCOORD0,TEXCOORD1,TEXCOORD2,etc,can be used for all kinds of parameters
				//nointerpolation can make sure fragment shader receives one exact,non-interpolated value by vertex shader
				//nointerpolation  float4 col:TEXCOORD0;
			    float4 col:TEXCOORD0;
			};


            vertexOutput vert (float4 vertexPos:POSITION)
            {                			   
			   vertexOutput output;
			   output.pos=UnityObjectToClipPos(vertexPos);
			   output.col=vertexPos+float4(0.5,0.5,0.5,0);
			   //for the coordinates of the cube are between -0.5 and 0.5,
			   //by plus 0.5,the result is between 0 and 1
			   return output;
            }

            fixed4 frag (vertexOutput input) : COLOR
            {
               return input.col;
            }
            ENDCG
        }
    }
}

被语义POSITION标识的参数vertexPos的坐标范围为[-0.5,0.5]

out修饰语

上述shader中使用结构体封装了vertexOutput,在vertex阶段为其赋值,并返回。在farament阶段,传入vertex阶段返回的结构体。
也可以选择使用out修饰语的方式代替结构体。如下:

         void vert(float4 vertexPos : POSITION,
            out float4 pos : SV_POSITION,
            out float4 col : TEXCOORD0)  
         {
            pos =  mul(UNITY_MATRIX_MVP, vertexPos);
            col = vertexPos + float4(0.5, 0.5, 0.5, 0.0);
            return;
         }
 
         float4 frag(float4 pos : SV_POSITION, 
            float4 col : TEXCOORD0) : COLOR 
         {
            return col; 
         }

颜色灰化

0.21 red+0.72 green+0.07 blue
补充:
RGB color model
HSL and HSV

Vertex输出插值

物体三角面的顶点会调用vertex shader。并在输出到frament前进行三角面内部的插值。
若不需要插值,需要使用nointerpolation(上文已经提到)对参数进行修饰。
三角面插值更多内容参考:Rasterization

发布了198 篇原创文章 · 获赞 23 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/iningwei/article/details/100568283