【问题标题】:OpenGL 2d (orthographic) rendering for GUI, the modern way用于 GUI 的 OpenGL 2d(正交)渲染,现代方式
【发布时间】:2016-12-26 13:27:47
【问题描述】:

我想在我的 OpenGL 程序中渲染 GUI 组件。它们仍然只是简单的纹理(vbo)矩形。 我想以正确的方式完成以下事情。

  1. 使用屏幕坐标绘图,或至少使用不基于类似透视的浮点的坐标系。例如:现在坐标系是从-1f到1f(屏幕从左到右)。使用屏幕/像素坐标会更合乎逻辑。
  2. 如果它很容易做到,我希望在窗口(视口)调整大小时 GUI 不会拉伸。

我知道,以前您可以使用已弃用的函数 glOrtho 做很多事情。但是由于我想以现代方式进行操作,希望这对性能也更好,所以我不知道如何开始。 在互联网上搜索后,我得出结论,我必须使用着色器。我对着色器不是很熟悉。 还有一个问题:使用着色器执行此操作时性能会提高吗?

【问题讨论】:

    标签: user-interface opengl 2d rendering lwjgl


    【解决方案1】:

    使用现代 OpenGL 所做的工作与使用 glOrtho 设置正交投影矩阵基本相同:创建一个将坐标 1:1 映射到视口坐标的变换(矩阵),并使用它来变换坐标。

    例如,您可以创建一个vec2 统一viewport 并将其设置为视口宽度/高度。然后在顶点着色器中,您可以使用它将顶点像素坐标位置转换为范围 [-1,1],如下所示

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

    【讨论】:

    • 当然可以预先计算 vec2(2)/viewport.xy 并将转换简化为简单的乘加。
    • @derhass:当然。但我的目的是说明如何解决这个问题的总体思路。如果 OpenGL 驱动程序的内置 GLSL 编译器检测到子表达式 vec2(2)/viewport.xy 是统一的并对其进行优化,我也不会感到惊讶。不过,如果使用 SPIR-V 或使用 UBO,可能不会。
    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多