天天看點

opengl 和direct3d坐标系的差別



初學者經常 說,OpenGL用右手坐标系,而D3D用左手;裁剪空間裡OpenGL的z是[-1, 1],而D3D是[0, 1];不可調和。實際上,直接把左手的頂點和矩陣給OpenGL也是沒有問題的。畢竟如果在VS裡執行的都是mul(v, matrix),得到的會是同樣的結果。可能會造成麻煩的反而是viewport的z。假設一個經過clip之後的頂點坐标為(x, y, z, w),那麼在OpenGL上,該頂點經過viewport變換的z是(z/w + 1) / 2,而在D3D上則是z/w而已。這對于depth test不影響,但depth buffer裡的值就不同了。是以需要對project matrix做一些調整,才能讓他們寫到depth buffer中的數值相同。具體來說,如果要讓OpenGL流水線接受D3D的project matrix,就需要乘上

opengl 和direct3d坐标系的差別

相當于把project space的頂點z都作了z = z * 2 – 1的操作,是以經過viewport變換就一緻了。D3D到OpenGL的矩陣也可以依此類推。是以,在坐标系上,很容易就能使兩者接受同樣的輸入,同時也沒有增加runtime開銷。

繼續閱讀