【问题标题】:Moving+scaling individual OpenGL UI controls移动+缩放单个 OpenGL UI 控件
【发布时间】:2011-02-16 23:36:41
【问题描述】:

我是 OpenGL 新手,我刚刚阅读了一篇关于 OpenGL 2.0 的精彩教程。 我的目标是 OpenGL ES 2.0。

我需要创建一个由控件组成的 UI。控件可以在编辑模式下移动。 我认为为每个控件创建顶点并将它们上传到 GPU,然后使用简单的顶点着色器将所有这些映射到屏幕在移动和缩放单个部分(控件)时有其局限性。 我在吗?

我认为为每个控件创建统一的属性会更好,例如宽度/高度/左/顶部/其他控件定义的属性,例如滑块位置等...然后使用聪明的着色器。 然后宿主应用程序只需更新控件的统一属性,而不是每次都上传新的顶点集。

你有什么推荐的? 有没有针对此的示例或教程?

【问题讨论】:

    标签: opengl-es opengl-es-2.0


    【解决方案1】:

    您的问题是,该着色器一次只能使用一个顶点,并且不能访问其他顶点,除非它们是统一的。这是几何着色器的一个很好的例子,你可以只发送中心,它会产生你喜欢的一切......圆形,盒子......几乎没有其他制服,如纵横比或大小......

    但是你也可以使用顶点着色器。您将创建与中心相关的顶点。对于 2x2 正方形顶点,如下所示:

    1. -1, -1
    2.  1, -1
    3.  1,  1
    4. -1,  1
    

    然后您可以移动这个形状的中心并设置它的缩放比例。如您所见,您只需缩放 2D 矢量,简单的任务,并将它们添加到中心位置.. 这样您就可以在正确的位置获得 4 个位置,并且可以绘制正方形。这样做的想法是您可以创建任何形状(不仅仅是可能具有宽度、高度、顶部、左侧......的框),您可以将这些形状上传到纹理缓冲区。对于使用着色器绘图,您只需指定哪个形状,中心在哪里以及大小是多少..我认为添加新东西会非常快速和容易..

    是的,您是对的,映射所有内容并且更新非常缓慢。我昨天实际上在做一些关于映射的研究,结果证明它的性能很差..

    【讨论】:

    • 我正在考虑以这种方式使用顶点着色器:用 -1 和 1 之间的顶点定义每个对象,并为每个顶点添加一个 controlIndex 属性。制服将包括每个控件的所有设置。因此,veryex 着色器始终使用一个顶点,但使用与其关联的 controlIndex 信息,它可以沿 x,y 缩放和偏移它。这可能吗?
    • 如果顶点在 -1 和 1 之间(顺便说一句归一化形状)controlIndex 的信息是什么?
    • controlIndex 只会告诉着色器从制服中的控制设置数组中使用哪个控制的比例和位置设置。
    • 或者常见的方法是为每个“控件”创建一个单独的opengl程序?那么,没有聪明的着色器使用 controlIndex 属性来查找控制设置,只是处理一个控制的单独程序?这不会比一个聪明的程序慢很多吗?
    • 是的,就像你说的那样。事实上,你的 controlIndices 和我的中心几乎一样,但不同的是我们对绘图的看法。因此,如果您想一次性绘制所有内容,是的,您需要获取这些 controlIndices 的数组并告诉每个顶点使用哪个...有趣的方法;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多