2014-02-05 45 views
0

我想在光線空間中模擬我的場景作爲我的陰影映射的準備,但是我非常困惑。計算lookAt矩陣不工作?

計算在我的着色器位置的線:gl_Position = light_projection_matrix * light_view_matrix * light_model_matrix * position;,其中位置是3輛彩車給出一個模型座標(等於世界在我的情況座標),我讀它作爲vec4和部分已被證明是工作。

現在我用下面,在Java編碼,我的矩陣:

lightModelMatrix.identity().multiply(modelMatrix); 
lightViewMatrix.identity().lookAt(new Vector3f(-20f, 7.5f, -20f), Vector3f.O, Vector3f.Y); 
lightProjectionMatrix.identity().frustum(-1f, 1f, -1f, 1f, -200f, 200f); 

哪裏modelMatrixidentity()

我認爲問題是,lookAt矩陣改變的.w部分我矢量,我不知道是否應該發生,我只知道投影矩陣必須計算.w組件。

所以這是我lookAt代碼:

public Matrix4f lookAt(final Vector3f eye, final Vector3f at, final Vector3f up) { 
    Vector3f zAxis = at.subtract(eye).normalized(); 
    Vector3f xAxis = up.cross(zAxis).normalized(); 
    Vector3f yAxis = zAxis.cross(xAxis); 
    return multiply(
     xAxis.getX(), xAxis.getY(), xAxis.getZ(), -xAxis.dot(eye), //X column 
     yAxis.getX(), yAxis.getY(), yAxis.getZ(), -yAxis.dot(eye), //Y column 
     zAxis.getX(), zAxis.getY(), zAxis.getZ(), -zAxis.dot(eye), //Z column 
     0.0f,   0.0f,   0.0f,   1.0f    //W column 
    ); 
} 

在我的代碼的所有矩陣列優先的順序定義。

此外,調試頂點着色器中計算的gl_Position以查看問題是否存在的好方法是什麼?

回答

0

在投影矩陣中,近/遠值應該都是正值。

在視圖矩陣,您的zAxis應當向後指向(從目標到眼睛),這樣(xAxis, yAxis, zAxis)是右手正交基:

Vector3f zAxis = eye.subtract(at).normalized(); 

利用該變形例中,計算的其餘部分這個矩陣看起來是正確的。作爲參考,請參閱this answer以獲得「查看」矩陣的完整推導。

另外,什麼是一個好方法來調試在Vertex Shader中計算的gl_Position以查看問題是否存在?

在這種情況下,最簡單的方法是採取從模型中一個頂點(或幾個頂點,或者它的邊框),並應用在軟件的頂點着色器進行改造。然後檢查結果,看看它是否有意義(在視錐內,在正確的距離內等)。

+0

試過了,但還是不行,需要多調試一下。 – skiwi

+0

將位置傳遞給片段着色器,並將其用作顏色來查看頂點的位置。 (編輯:更紅的意思是正X軸,更多綠色正Y ...你也可以縮放它以避免黑色的負值,你可以使用模型或世界座標,取決於你想檢查什麼) –

+0

@SebastianHöffner這種方法假定生成的頂點屬於可見的基元。在將任何信息傳遞給片段着色器之前,應該確保最終將光柵化。否則,這將是調試'gl_Position'的下一步。 – user3146587