它是Unity3D中着色器的一部分。
我使用填充颜色的法线贴图(128,128,255),因此它代表(0.0,0.0,1.0)。
我怀疑为什么会这样?
void surf (Input IN, inout SurfaceOutput o)
{
float3 normals = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
o.Normal = float3(0.0,0.0,1.0);
float2 litSphereUV;
litSphereUV.x = dot(IN.tan1, o.Normal);
litSphereUV.y = dot(IN.tan2, o.Normal);
half4 c = tex2D (_MainTex, litSphereUV*0.5+0.5);
o.Albedo = c.rgb * _MainTint;
o.Alpha = c.a;
}
这是错的?
litSphereUV.x = dot(IN.tan1, (0.0,0.0,1.0));
litSphereUV.y = dot(IN.tan2, (0.0,0.0,1.0));
答案 0 :(得分:2)
问题是(0.0,0.0,1.0)
只是float
的列表。 dot
函数将两个floatN
向量作为参数,其中1<=N<=4
(IIRC)。在您的情况下,您必须构造一个float3
对象以传递给dot
函数。
请尝试使用它:
litSphereUV.x = dot(IN.tan1, float3(0.0,0.0,1.0));
litSphereUV.y = dot(IN.tan2, float3(0.0,0.0,1.0));
这样,您可以构造2个类型为float3
的对象,并将相应的值作为构造函数参数。然后,选择适当版本的dot
函数,您将获得所需的结果。