2011-03-24 87 views
9

我正在寫一個當前運行良好的軟件渲染器,但我試圖獲得紋理座標的透視校正,並且看起來不正確。我爲我的渲染器使用與opengl相同的矩陣數學。要rasterise三角形我做到以下幾點:紋理座標在3D中的透視校正

  1. 使用模型視圖和投影矩陣變換頂點,並轉化爲剪輯座標。

  2. 用於每個三角形的每個像素,計算重心座標進行內插的屬性(顏色,紋理座標,法線等)

  3. 以校正立體我使用透視正確插值: (W是深度的座標頂點,c是頂點的紋理座標,b爲一個頂點的重心重量)

1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2) 
c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2) 
c = (c/w)/(1/w) 

這應該正確的角度來看,它有一點幫助,但仍然存在明顯的透視問題。我在這裏錯過了些什麼,也許是一些舍入問題(我使用所有數學的浮點數)?

在此圖像中看到紋理座標中的誤差沿着對角線明顯,這是通過深度座標進行除法的結果。

image showing incorrect perspective correction

此外,這通常是用於紋理座標進行...是必要的其他特性(例如法線等)以及?

+1

屏幕截圖可能會對您有所幫助。 – genpfault 2011-03-24 21:21:56

+0

我不能添加屏幕截圖,直到我的評分爲10 :( – 2011-03-25 19:15:13

+1

你現在的評分:D – Bahbar 2011-03-25 19:59:55

回答

1

是的,這看起來像你的傳統破碎透視凹痕。你的算法看起來不錯,所以我真的不知道什麼是錯的。當你渲染它時,我會檢查你是否實際上使用了新計算的值?這看起來像是你計算透視正確值的麻煩,然後使用基本的非校正值進行渲染。

+0

只看數字,修正和未修正的tex座標之間的區別是順序爲1.0e-4(tex coords的範圍爲[0.0,1.0])或許存在縮放問題?我是否正確使用縮放深度座標進行縮放? – 2011-03-25 21:31:34

2

你需要告訴OpenGL的,你需要與

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST) 

你所觀察到的線性紋理映射的典型失真的像素透視校正。在不支持每像素透視校正的硬件上(例如PS1),標準解決方案只是細分爲較小的多邊形,以使缺陷更加明顯。

+0

這是一個軟件渲染器,不是opengl(認爲一個mod添加了該標籤)...但我使用opengl數學進行所有轉換 – 2011-03-25 21:33:04

+0

對不起......我看到了標籤OpenGL,並假設您使用的是OpenGL(如果硬件是切換到軟件渲染無論如何,你所觀察到的是所謂的「線性透視投影」問題,當你爲頂點計算正確的UV值但是polyfiller線性地i渲染多邊形時插入它們。 – 6502 2011-03-25 21:54:41

2

從UV座標到3D平面的唯一正確轉換是單應變換。

http://en.wikipedia.org/wiki/Homography

你必須在你的計算某一點有它。

要自己找到它,您可以編寫紋理的任何像素(與頂點相同)的投影,並反轉它們以從屏幕座標獲取紋理座標。它將以同形變換的形式出現。

2

我最近破解了這個問題上的代碼。如果您計劃在將內存分配到表面之前修改內存中的紋理,則可以使用單應性。這在計算上很昂貴,並且增加了對程序的附加依賴。有一個很好的黑客可以解決你的問題。

OpenGL自動將透視校正應用於要渲染的紋理。你所需要做的就是將你的紋理座標(UV-0.0f-1.0f)乘以平面每個角的Z分量(XYZ位置矢量的世界空間深度),並且它將「拋棄」OpenGL的透視校正。

最近我問及解決了這個問題。給這個鏈接一個鏡頭:

texture mapping a trapezoid with a square texture in OpenGL

,我讀了固定的這個問題被稱爲紙,"Navigating Static Environments Using Image-Space Simplification and Morphing" - page 9 appendix A.

希望這有助於!

ct