【发布时间】:2014-08-27 08:11:47
【问题描述】:
我编写了两个着色器,一个用于每个顶点着色,另一个用于每个片段着色,都模拟点光漫射照明,两个着色器都可以正常工作而不会弹出错误,但是每个片段着色器的渲染模型似乎有与逐顶点的结果相同,我的意思是顶点之间的逐片段平滑效果看起来与逐顶点线性插值结果只有 100% 相同。
所以,,,, 我的代码出了什么问题或者我误解了什么,texcoord set 0 1 2 3 4 之间有什么区别吗?
逐顶点着色器:
Shader "Custom/neo2" {
Properties {
_LightPosX("lightposx",float) = 14
_LightPosY("lightposy",float) = 14
_LightPosZ("lightposz",float) = 14
}
SubShader {
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float _LightPosX;
float _LightPosY;
float _LightPosZ;
struct tex{
float4 tex0:TEXCOORD0;
float4 tex1:TEXCOORD1;
};
struct col{
float4 col;
};
col vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){
oPos = mul(UNITY_MATRIX_MVP,pos);
col c;
float3 normalDir = normalize((mul(_Object2World,float4(normal,0))).xyz);
float3 lightDir = normalize(float4(_LightPosX,_LightPosY,_LightPosZ,1) - mul(_Object2World,pos));
c.col = float4(1,1,1,1)*dot(normalDir,lightDir);
return c;
}
float4 frag(col c):COLOR{
return c.col;
}
ENDCG
}
}
FallBack "Diffuse"
}
每片段着色器:
Shader "Custom/neo3" {
Properties {
_LightPosX("lightposx",float) = 14
_LightPosY("lightposy",float) = 14
_LightPosZ("lightposz",float) = 14
}
SubShader {
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float _LightPosX;
float _LightPosY;
float _LightPosZ;
struct tex{
float4 tex0:TEXCOORD0;
float4 tex1:TEXCOORD1;
};
tex vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){
oPos = mul(UNITY_MATRIX_MVP,pos);
tex t;
t.tex0 = mul(_Object2World,pos);
t.tex1= normalize(mul(_Object2World,float4(normal,0)));
return t;
}
float4 frag(tex t):COLOR{
float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0);
float4 col = float4(1,1,1,1)*dot(t.tex1,lightDir);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
【问题讨论】: