2012-08-03 47 views
1

我正在轉換一些舊軟件以支持OpenGL。 DirectX和OpenGL具有不同的座標系(OpenGL是正確的,DirectX是左邊的)。我知道,在舊的固定管道的功能,我會用:OpenGL/GLM - 切換座標系方向

glScalef(1.0f, 1.0f, -1.0f); 

這一次,我與GLM和着色工作,需要一個兼容的解決方案。我試圖用一個縮放矢量乘我的相機矩陣,但沒有運氣。

這裏是我的相機設置:

// Calculate the direction, right and up vectors 
direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw)); 
right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f)); 
up = glm::cross(right, direction); 

// Update our camera matrix, projection matrix and combine them into my view matrix 
cameraMatrix = glm::lookAt(position, position+direction, up); 
projectionMatrix = glm::perspective(50.0f, 4.0f/3.0f, 0.1f, 1000.f); 
viewMatrix = projectionMatrix * cameraMatrix; 

我已經嘗試了很多的事情,包括倒車載體和扭轉着色器中的Z座標。我也嘗試乘以各種矩陣和矢量的逆並將相機矩陣乘以一個縮放矢量。

回答

5

不要想太多的手型。確實如此,他們使用不同的約定,但是你可以選擇不使用它們,並且在兩個API中歸結爲幾乎相同的東西。我的建議是使用完全相同的矩陣和設置在這兩個API,除了這兩件事情:

所有你應該需要做的,從DX口GL是:

  1. 反向剔除面繞組 - DX默認情況下逆時針選擇,而這是GL保持的。
  2. 針對不同的深度範圍進行調整:DX使用深度範圍0(近)至1(遠),而GL使用從-1開始的有符號範圍作爲near,而1用於far。您可以將其作爲投影矩陣中的「最後一步」。

DX9也有像素座標偏移問題,但這完全是另一回事,它不再是DX10以後的問題。

從你所描述的情況來看,繞組可能是你的問題,因爲你正在使用GLM函數來生成OpenGL的矩陣。

+0

我顛倒了繞組,沒有運氣。它將「內部」區域變成「外部」區域,反之亦然。你有沒有能夠使用GLM或着色器正確反轉深度範圍的代碼?這就是我所追求的。 – 2012-08-03 23:19:32

+0

當然,只是在對角線上有1,1,2,1和在偏移列中有0,0,-1的矩陣「左乘」到您在DirectX中使用的投影矩陣。除此之外,請使用完全相同的矩陣!如果你在GL中使用glm並在DX中使用DirectX助手,那麼你可能只是在做一些不同的事情。 – ltjax 2012-08-03 23:25:56

+0

這似乎有效。現在我還有一個問題。應該對我的觀點進行什麼樣的改變?它不再正常工作。 – 2012-08-03 23:40:19