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