2011-08-10 76 views
2

我將一些代碼從HSLSL和XNA轉換爲CG和OpenGL。ModelViewProjection與WorldViewProjection相同嗎?

該代碼用於渲染體積數據。但是體積數據也不是在每個維度上使用相同的距離進行採樣,例如(0.9f,1f,1f)。所以需要應用一個比例因子。

在XNA和HLSL例如,他們執行以下操作:

mul(input.Position * ScaleFactor, WorldViewProj); 

凡WorldViewProj傳遞到着色器。

在OpenGL中,我的印象是glstate.matrix.mvp是ModelViewProjection,其中ModelView是World * View。很明顯,我錯了,因爲當我做下面的事情時,沒有任何東西被繪製。

output.Position = mul(input.Position * scale, glstate.matrix.mvp); 

使用設置爲GL_MODELVIEW的glMatrixMode渲染該卷。我需要創建自己的矩陣嗎?如果是這樣,任何好的教程? :D

回答

2

使用設置爲GL_MODELVIEW的glMatrixMode呈現該卷。我需要創建自己的矩陣嗎?如果是這樣,任何好的教程? :d

glMatrixMode是有點像一個with聲明爲其他矩陣操作功能。所以

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslate(...); 

是這樣解釋

modelview_matrix.load_identity(); 
modelview_matrix.translate(...); 

等。

此外請參閱@Tobias Schlegel的答案。着色器以所謂的制服的形式獲得其「恆定」輸入。較舊版本的OpenGL在固定功能狀態下傳遞,如模型視圖矩陣。較新的OpenGL版本(OpenGL-3核心及更高版本)降低了所有內置的矩陣處理內容。相反,用戶需要跟蹤轉換信息並通過自定義制服提供所有需要的矩陣。這也可以模擬DirectX行爲。

2

在固定功能管線中,openGl和DirectX在它們定義空間的方式上有所不同。 OpenGl只有一個模型和一個視圖空間,因此是一個ModelViewMatrix。在DX中還有一個世界空間。模型從模型空間轉換爲世界空間,然後轉換到視圖空間。

但是,在這種情況下,我想認爲,您可以將模型和視圖空間視爲平等。如果您的模型以世界爲中心(使模型 - >世界翻譯爲非操作),情況就是如此。

使用着色器時,你基本上可以自由地做任何你想做的事情,並使用你想要的空間。

此外,DX使用行 - 主要和開放式列主矩陣表示。因此,如果您複製DX示例,則必須轉置矩陣並顛倒矩陣運算的順序。

+0

啊,我完全忘了OpenGL和DX在處理矩陣方面的區別,謝謝! – Benzino