1. 程式人生 > >[UnityShader2]頂點片段著色器基礎

[UnityShader2]頂點片段著色器基礎

官方文件:http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

1.語義

SV_Traget:如果頂點/片段程式只輸出一個值,那麼可以使用這個

fixed4 frag (v2f i) : SV_Target

SV_POSITION:儲存裁剪空間中的位置,float4型別,這個是頂點程式必須輸出的一個值

TEXCORD0,TEXCORD1:儲存高精度資料,例如紋理座標、位置等

COLOR0,COLOR1:低精度,0到1範圍(對於顏色,使用低精度的fixed4就足夠了)

VPOS:螢幕空間中的畫素位置

2.變數

a.型別

_MyColor ("Some Color", Color) = (1,1,1,1) 
_MyVector ("Some Vector", Vector) = (0,0,0,0) 
_MyFloat ("My float", Float) = 0.5 
_MyTexture ("Texture", 2D) = "white" {} 
_MyCubemap ("Cubemap", CUBE) = "" {} 

fixed4 _MyColor; // low precision type is usually enough for colors
float4 _MyVector;
float _MyFloat; 
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
對應關係:

Color & Vector :float4、half4、fixed4

Range & Float :float、half、fixed

2D :sample2D

CUBE:sampleCUBE


b.特殊的紋理屬性:

{TextureName}_ST:float4型別,x存tiling的x值、y存tiling的y值、z存offset的x值、w存offset的y值(tiling和offset是紋理的兩個屬性)

例如,如果shader有一個屬性_MainTex,那麼tiling和offset的資訊就會存放在_MainTex_ST中。

3.

struct appdata_base {
	float4 vertex : POSITION;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
};

struct appdata_tan {
	float4 vertex : POSITION;
	float4 tangent : TANGENT;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
};

struct appdata_full {
	float4 vertex : POSITION;
	float4 tangent : TANGENT;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
	float4 texcoord1 : TEXCOORD1;
	float4 texcoord2 : TEXCOORD2;
	float4 texcoord3 : TEXCOORD3;
#if defined(SHADER_API_XBOX360)
	half4 texcoord4 : TEXCOORD4;
	half4 texcoord5 : TEXCOORD5;
#endif
	fixed4 color : COLOR;
};


對於一個四元數,w預設值為1。對於一個2D的紋理座標,如果用一個float4來接收,那麼值為(x,y,0,1)

法線x,y,z三個變數的範圍為(-1,1),紋理座標x,y兩個變數的範圍為(0,1)