2015-07-28 57 views
1

它是Unity3D着色器的一部分。爲什麼不能直接乘(0.0,0.0,1.0),但必須使用o.normal = float3(0.0,0.0,1.0)?

我使用填充顏色的法線貼圖(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

@anderas它的工作原理!非常感謝你!但爲什麼? –

回答

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

這樣,你構建float3類型的兩個對象與構造函數的參數各自的值。然後,選擇適當版本的dot函數,並獲得您所需的結果。

相關問題