为什么不能直接乘法(0.0,0.0,1.0)但必须使用o.normal = float3(0.0,0.0,1.0)?

时间:2015-07-28 07:36:21

标签: unity3d shader

它是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));

1 个答案:

答案 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函数,您将获得所需的结果。