每个片段着色失败
问题描述:
我为每个顶点着色和其他每片段着色都写了两个着色器,这两个着色器都模拟点光漫射照明,两个着色器都在不弹出错误的情况下工作,但渲染的per-frag模型着色器看起来与每个顶点的结果相同,我的意思是顶点之间的per-frag平滑效果看起来与每个顶点线性内插结果相同的百分之百。每个片段着色失败
所以,,,,我的代码出了什么问题,或者我误解了一些东西,是否有任何区别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"
}
答
有所述texcoords之间没有差异。
闪电看起来多么依赖于你用来计算的正常值。在这两种情况下,您都会预先计算法线顶点,因此您会对整个三角形使用相同的法线,因此会得到相同的结果。
如果您改为在片段中进行计算,那么每个像素都会得到一个法线,从而得到更平滑的结果。
的每个像素着色器
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 = float4(normal,0);
return t;
}
float4 frag(tex t):COLOR
{
float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0);
float4 normal = normalize(mul(_Object2World,float4(t.tex1,0)));
float4 col = float4(1,1,1,1)*dot(normal, lightDir);
return col;
}