为什么不能直接乘(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
函数,您将获得所需的结果。
它是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
函数,您将获得所需的结果。