顶点着色器和片元着色器的传值理解

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"

fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;//纹理的缩放和平移值
fixed4 _Specular;
float _Gloss;

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

struct v2f
{
	float4 pos : SV_POSITION;
	float3 worldNormal :TEXCOORD0;
	float3 worldPos :TEXCOORD1;
	float2 uv : TEXCOORD2;
};

v2f vert(a2v v)
{
	v2f o;
	o.pos = UnityObjectToClipPos(v.vertex);
	o.worldNormal = UnityObjectToWorldNormal(v.normal);
	o.worldPos = mul(unity_ObjectToWorld,v.vertex).xzy;
	o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
	return o;
}

fixed4 frag(v2f i) :SV_Target
{
	fixed3 worldNormal = normalize(i.worldNormal);
	fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
	fixed3 albedo = tex2D(_MainTex,i.uv).rgb *_Color.rgb;
	float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz *albedo;
	fixed3 diffuse = _LightColor0.rgb*albedo*max(0,dot(worldNormal,worldLightDir));
	fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
	fixed3 halfDir = normalize(worldLightDir+viewDir);
	fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);
	return fixed4(ambient+diffuse+specular,1.0);
}

ENDCG

结构体 a2v种的float4 texcoord :TEXCOORD0

官方解释是该顶点的第一组纹理坐标

在顶点着色器方法 vert 种就行 缩放和偏移量的加成

o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

然后在片元着色器frag中就能获得到每个像素点的纹理UV坐标。

 

那么问题来了,三角形只有三个顶点,但是像素点却多的多,那么这三个顶点的纹理坐标如何够所有像素点用呢?这里传值究竟是怎么样的。

本人的理解:shader种片元着色器中的 fixed3 albedo = tex2D(_MainTex,i.uv).rgb *_Color.rgb;

这个i.uv 是根据三角形三个顶点的uv纹理坐标 进行的插值计算,算出的该像素点的uv纹理坐标,这仅仅是本人的猜想,欢迎大佬进行指正。

你可能感兴趣的:(读书笔记)