2010-04-17 102 views
1

我期待gl_Position自動進行均勻化(除以w),但它似乎不起作用。爲什麼以下方法會產生不同的結果?在OpenGL頂點着色器中,gl_Position不會被均勻化

1) void main(){ vec4 p; ...省略... gl_Position = projectionMatrix * p; }

2) ...與上面相同... p = projectionMatrix * p; gl_Position = p/p.w;

我認爲這兩個應該會產生相同的結果,但它似乎並非如此。 1不能正常工作,而2正如預期的那樣工作。這可能是精確度問題嗎?我錯過了什麼嗎?這讓我幾乎瘋狂......需要幫助。提前謝謝了!

+0

屏幕截圖?你的意思是「不起作用」? – 2010-04-17 02:30:13

+0

它不會在屏幕上顯示任何內容,因爲座標沒有變得均勻,而2則正確顯示結果。我將很快發佈屏幕截圖。謝謝! – Kay 2010-04-22 20:30:13

回答

1

從GLSL規範1.2:

可變GL_POSITION僅在頂點語言可用 和是 用於寫入的 均勻頂點位置。

因此它不會自動同質化。

+0

所以它應該自動同質化,對吧? – Kay 2010-04-22 20:30:46

+0

是的。我認爲你的(1)應該是正確的,而另一個不應該是正確的。如果他們產生不同的結果,這可能是因爲gl_Position在獲得均勻之前得到剪切而不是在之後。也許你的目標太近/遠了? – 2010-04-22 21:52:20

2

無法在裁剪之前完成視角分割,發生之後頂點着色器完成。所以沒有理由可以觀察頂點着色器中的w分割。

雖然GL會在片段着色器運行之前在三角形的柵格化之前進行透視分割。

你想做什麼不行?

+0

請注意,如果您已啓用幾​​何着色器階段,則在GS之後完成透視分割。在所有情況下,它都在片段程序被調用之前完成。 – Stringer 2010-04-19 00:13:08

+0

感謝您的回答,我明白在頂點着色階段無法看到均勻化的結果,但問題在於上述兩者產生不同的最終結果。如果座標自動均勻化,它們應該最終顯示相同的東西,不是嗎?我會盡快發佈截圖,非常感謝你的答案.. – Kay 2010-04-22 20:33:33

+1

@Kay如果你自己做同質化,將沒有透視 - 三角形上不同屬性的正確插值。 – masterxilo 2015-09-20 16:19:56