2016-12-26 60 views
-1

我想在我的OpenGL程序中渲染GUI組件。它們仍然只是簡單的紋理(vbo)矩形。 我想以正確的方式完成以下工作。用於GUI的OpenGL 2d(正交)渲染,現代化的方法

  1. 使用屏幕座標進行繪製,或者至少使用不基於透視點浮點的座標系。例如:現在座標系是從-1f到1f(從屏幕左到右)。使用屏幕/像素座標更合乎邏輯。
  2. 如果很容易做到,我希望GUI在窗口(視口)調整大小時不會拉伸。

我知道,以前你可以使用不贊成的函數glOrtho做很多事情。但是因爲我想用現代化的方式來做到這一點,希望這種方式也能更好地表現,我不知道該如何開始。 在網上搜索後,我得出結論,我必須使用着色器。我對着色器不是很熟悉。 還有一個問題:使用着色器做這個時性能是否會提高?

回答

1

用現代OpenGL做什麼與使用glOrtho設置正交投影矩陣基本相同:創建一個將座標1:1映射到視口座標並使用它轉換座標的變換(矩陣)。

例如,您可以創建vec2制服viewport並將其設置爲視口寬度/高度。然後在頂點着色器,你可以用它來改變你的頂點像素座標位置爲範圍[-1,1],這樣

gl_Position = vec4(2*vpos.xy/viewport.xy - 1, 0, 1); 
+0

一個當然可以預先計算的'VEC 2(2)/viewport.xy '並將轉換簡化爲一個簡單的乘加。 – derhass

+0

@derhass:當然。但我的目的是說明如何解決這個問題的總體思路。另外,如果OpenGL驅動程序的內置GLSL編譯器檢測到副作用「vec2(2)/ viewport.xy」是統一的並優化它,我也不會感到驚訝。雖然可能不與SPIR-V或使用UBO。 – datenwolf