由於侷限性,我必須計算幾何着色器中的頂點法線。由於這種限制,法線是按面進行的,而不是在頂點上的面之間進行插值,這意味着每個像素的定向照明只是一種浪費。由於法線僅從幾何着色器開始才知道,因此我無法在頂點着色器中進行任何照明數學運算。使用幾何着色器的定向每人臉照明?
在幾何着色器中計算的法線是在屏幕空間中,但它們從我完成的一些測試中正確。
我可以提供世界空間中的光的方向或乘以視圖/投影/轉置/倒置矩陣。
以下代碼一些-什麼工作,但在照相機/ 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之前相乘並歸一化。
正確計算幾何着色器中的光線所需的數學是什麼?
這不是做「每頂點」照明。這是做頂點複製的「per-face」照明。由於您在GS中進行頂點複製,這可能會很慢,儘管您至少會產生與輸入相同數量的輸出,這意味着您不會受到最糟糕的GS性能影響。 – 2015-03-09 19:58:11
@ChuckWalbourn我修正了標題,如果你知道任何頂點順序獨立照明選項,我想聽聽他們:) – ManIkWeet 2015-03-11 07:38:43