为什么不能直接乘(0.0,0.0,1.0)而要用o.normal =float3(0.0,0.0,1.0)?

Why can not directly multiply (0.0,0.0,1.0) but have to use o.normal =float3(0.0,0.0,1.0)?

它是Unity3D中shader的一部分。

我使用填充颜色 (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.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 函数,您将获得所需的结果。