2015-03-08 70 views
0

由於侷限性,我必須計算幾何着色器中的頂點法線。由於這種限制,法線是按面進行的,而不是在頂點上的面之間進行插值,這意味着每個像素的定向照明只是一種浪費。由於法線僅從幾何着色器開始才知道,因此我無法在頂點着色器中進行任何照明數學運算。使用幾何着色器的定向每人臉照明?

在幾何着色器中計算的法線是在屏幕空間中,但它們從我完成的一些測試中正確。

我可以提供世界空間中的光的方向或乘以視圖/投影/轉置/倒置矩陣。

以下代碼一些-什麼工作,但在照相機/ lightdirection角度的變化:

void FlipFaceGS(triangle PS_IN input[3], inout TriangleStream<PS_IN> OutputStream) 
{ 
    PS_IN v1 = input[0]; 
    PS_IN v2 = input[1]; 
    PS_IN v3 = input[2]; 

    float3 faceEdgeA = v2.pos - v1.pos; 
    float3 faceEdgeB = v3.pos - v1.pos; 
    float3 faceNormal = normalize(cross(faceEdgeA, faceEdgeB)); 

    v1.norm = faceNormal; 
    v2.norm = faceNormal; 
    v3.norm = faceNormal; 

    float4 newColor = (v1.color * Light1Color * max(0, dot(v1.norm, Light1Direction))); 
    newColor.a = v1.color.a;//we don't want to affect the alpha levels 

    v1.color = newColor; 
    v2.color = newColor; 
    v3.color = newColor; 

    OutputStream.Append(v1); 
    OutputStream.Append(v2); 
    OutputStream.Append(v3); 
    OutputStream.RestartStrip(); 
} 

在上述例子中,lightdirection由相機的ViewProjection矩陣被髮送到GPU之前相乘並歸一化。

正確計算幾何着色器中的光線所需的數學是什麼?

+0

這不是做「每頂點」照明。這是做頂點複製的「per-face」照明。由於您在GS中進行頂點複製,這可能會很慢,儘管您至少會產生與輸入相同數量的輸出,這意味着您不會受到最糟糕的GS性能影響。 – 2015-03-09 19:58:11

+0

@ChuckWalbourn我修正了標題,如果你知道任何頂點順序獨立照明選項,我想聽聽他們:) – ManIkWeet 2015-03-11 07:38:43

回答

0

我假設你的輸入頂點的位置已經轉換爲剪輯空間。然後,至少你在同一個空間裏計算照明。但是,剪輯空間不適合光照計算,因爲透視變換不能保持角度。無論是在世界或視圖空間的計算。無論哪種情況,您都必須將相應空間中的頂點位置傳遞給幾何着色器。如果不需要,不要將法線傳遞給像素着色器。

+0

「但是,剪輯空間不適合照明計算」這對我來說,謝謝! – ManIkWeet 2015-03-18 07:49:14