我正在寫一個3D OpenGL應用程序,我的頂點轉換矩陣有問題。OpenGL左手座標系
這裏是我的頂點着色器:
attribute vec4 vInPos;
uniform mat4 kWorld;
uniform mat4 kProj;
void main(void)
{
vec4 world_pos = kWorld * vInPos;
gl_Position = kProj * world_pos;
}
我所有的矩陣存儲行重大,我用左手投影矩陣作爲我的投影矩陣。
問題是,當我通過矩陣轉換頂點時,它在X軸和Y軸上都沿錯誤的方向移動,並被翻轉。因此,通過(100.0f,100.0f,100.0f)
進行平移可以在Z軸上(遠離相機)以正確的方式移動我的頂點,但在X軸(向後)的左側和Y軸(向後)向下移動我的頂點。
下面是它目前的樣子:而不是倒在左邊
的FPS計數器應該是向上和向右。它顯然也不應該被鏡像。根據我讀過的內容,這是因爲OpenGL默認使用右手座標系,但我不確定我能做些什麼來解決這個問題。
我發現一些文章試圖解釋它,但我找不到任何解決方案。 This question提到OpenGL規範顯示了座標系預期的內容,但看了之後,我沒有看到這對我有什麼幫助。編號: 作爲參考,我的投影矩陣代碼是基於DirectX SDK。
編輯: 根據Nicol Bolas的建議,我現在使用gluPerspective的矩陣,但我得到了相同的結果。
下面是我使用的設置我的矩陣代碼:
/* Vertex data for reference
float vertices[] =
{
{0.0f,0.0f,0.0f},
{5.0f,0.0f,0.0f},
{0.0f,5.0f,0.0f},
{5.0f,5.0f,0.0f},
}; */
float worldf[16];
float projf[16];
float fov = 60.0f;
float aspect = 1280.0f/720.0f;
float near = 1.0f;
float far = 1000.0f;
float f = 1.0f/tanf((fov*6.2831f/360.0f)/2.0f);
/* Build world matrix */
memset(worldf, 0, sizeof(worldf));
worldf[0] = worldf[5] = worldf[10] = worldf[15] = 1.0f;
worldf[12] = 100.0f;
worldf[13] = 100.0f;
worldf[14] = -100.0f;
/* Build perspective matrix */
memset(projf, 0, sizeof(projf));
projf[0] = f/aspect;
projf[5] = f;
projf[10] = (far+near)/(near-far);
projf[14] = (2.0f*far*near)/(near-far);
projf[11] = -1.0f;
glUniformMatrix4fv(proj_uniform, 1, GL_FALSE, projf);
glUniformMatrix4fv(world_uniform, 1, GL_FALSE, worldf);
使用此代碼,我的文字顯示不出來的。
編輯:不知道它是否相關,但我在OS X Snow Leopard上使用OpenGL 2.0。
我曾經聽到類似的東西,從左手轉右手座標系統,只需翻轉軸線之一。 (即:而不是(1,1,1),你可能會有(1,1,-1)。)他們說,你翻轉哪一個並不重要,但顯然有一些比給定的期望結果更好其他。 – cHao
我試過每次反轉每個軸。翻轉X或Y軸不會影響結果,翻轉Z將完全消除我的渲染。我已經關閉撲殺,所以並不是我的平局被剔除。 – Kyle