2023年3月30日 星期四

DirectX、OpenGL、Vulkan在那裡Face cullng?

 

開場

設定逆時鐘方向是三角形的正面


這是我們的三角形和camera設定

使用glm::lookAt,預設是右手的Camera

為什麼3角形沒有出來?

結果1
程式碼來自vulkan tutorial

但是他的可以

結果2
程式碼來自vulkan tutorial

然後改成這樣也行?

結果3


NDC space

仔細想想,不管是左手camera還是右手camera
我們都可以把它變換到左手的NDC

肉眼可以看出大家在NDC都是逆時針
如果vulkan是在這裡做face culling
結果1就會看到三角形

但沒看到
所以不是在這裡做!

Screen(Buffer) space

先變換到Screen(Buffer)座標系

逆定順時鐘、逆時鐘的座標系必須是
x軸是從銀幕左往右
y軸是從銀幕下往上

所以我們先自己鏡射一下
如果是在這裡做face culling
OpenGL、Vulkan都是逆時鐘
結果1就會看到三角形
但沒看到
所以也不是在這裡做!

那麼現在

假設存在1個 Face cullng space

只用來判定face culling
rasterization還是在screen space填充

備註:其實OpenGL不用

這樣一來
DirectX和OpenGL都是逆時鐘,看得到三角形
而Vulkan是順時鐘,看不到
結果1相符

結果2

在NDC延著y軸翻轉

順時針,所以不是這裡

別忘了逆定順時鐘、逆時鐘的座標系
所以Vulkan在Screen Spcae是順時鐘

Vulkan在face culling space是逆時鐘
所以結果2看的到
這是一個負負得正的結果

結果3

我們真的去fit這種奇怪的NDC

別忘了逆定順時鐘、逆時鐘的座標系
所以在NDC是順時鐘

在Screen Space也是順時鐘
在face culling space是逆時鐘
所以結果3看的到

參考資料


Sascha的方法

假設我們使用右手的Camera


直接修改viewport

相當於下面的紅色區塊
在Face culling space是逆時鐘方向
所以能正常顯示

But 

仔細看完VkFrontFace Manual Page
發現它使用的是矩阵求三角形面积的結果再*(-1) 

VkFrontFace Manual Page
這樣不用座標變換
就可以得到Face culling space的結果了

沒有留言:

張貼留言