2018年5月28日 星期一

Direct3d與OpenGL的Viewport差異

Direct3D與OpenGL的Viewport差異

前言

  Direct3D與OpenGL的Viewport雖然在程式上使用差不多的參數,但實際上卻有相當多的差異,這裡做個紀錄。

內容

   Direct3D與OpenGL的Viewport用來的差異有單個/多個Viewport、坐標系的不同與視窗的解析度認定不同。
  單個/多個Viewport的部分,Direct3D透過RSSetViewports()來決定Viewport的數量,但OpenGL就比較麻煩,舊有的glViewport()只能有一個Viewport,如果要多個Viewport的話,要透過glViewportArray(),但這是OpenGL4才有的。
  坐標系的不同的部分,如下圖
坐標系的差異
Direct3D的基準點在左上,而OpenGL的基準點則是在左下。
  視窗的解析度認定不同的部分比較不好懂,如果用的是RenderTarget來繪圖的話,用起來沒差,但如果是用在輸出到視窗的時候就有差別,Direct3D的IDXGISwapChain在建立時會需要解析度,這解析度的指的是原生的解析度,而不是視窗的解析度,當視窗被縮放時,Viewport所認定解析度會是原生的解析度!但在OpenGL則不一樣,當視窗被縮放時,Viewport的解析度會跟隨著目前視窗大小改變。這裡舉個例子,假設視窗原本為1280*720,且初始化時也依據這個解析度做初始化,所以Viewport的參數就是(0,0,1280,720),不論是Direct3D或OpenGL皆是如此,但當視窗按下放大最大被縮放成1920*1080時,這個時候Direct3D的Viewport參數依舊是(0,0,1280,720),但OpenGL的Viewport參數則變成(0,0,1920,1080)。

參考內容

glViewport
glViewportArray
RSSetViewports

沒有留言:

張貼留言