【问题标题】:Why can not directly multiply (0.0,0.0,1.0) but have to use o.normal =float3(0.0,0.0,1.0)?为什么不能直接乘 (0.0,0.0,1.0) 而必须使用 o.normal =float3(0.0,0.0,1.0)?
【发布时间】:2015-07-28 16:14:26
【问题描述】:

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

【问题讨论】:

  • @anderas 它有效!非常感谢!但为什么呢?

标签: unity3d shader


【解决方案1】:

问题在于(0.0,0.0,1.0) 只是floats 的列表。 dot 函数将两个floatNvectors 作为参数,其中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 函数并获得所需的结果。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 2011-02-25
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多