【问题标题】:glSecondaryColorPointerEXT replacement using Qt5 OpenGL 3.3使用 Qt5 OpenGL 3.3 替换 glSecondaryColorPointerEXT
【发布时间】:2013-10-22 05:44:47
【问题描述】:

我正在学习使用 Qt5 重写一些遗留代码的 OpenGL。他们使用 glSecondaryColorPointerEXT()。在检查了常用视频卡中对 OpenGL 的当前支持后,我选择了 Qt5 的类 QOpenGLFunctions_3_2_Core 来访问 OpenGL 函数。

此功能是否有OpenGL 3.2版本或替换方法?

【问题讨论】:

    标签: c++ opengl qt5


    【解决方案1】:

    在 OpenGL 3.2 中,您应该使用着色器,此外,此时您应该避免使用像 gl_SecondaryColor 这样的遗留功能。在基于着色器的引擎中适当替换辅助颜色只是一个附加的通用顶点属性。我解释了一个与 OpenGL ES 2.0 相关的very similar question,我的回答可能会有一些帮助。

    简而言之,glVertexPointer (...)glColorPointer (...)glSecondaryColorPointer{EXT} (...) 在 OpenGL 3.0 中均已弃用。在 3.2 核心上下文中,您根本无法使用它们。因此,你需要学习着色器和glVertexAttribPointer (...)

    在核心 GL 3.2 中使用“主要”和“次要”顶点颜色的顶点着色器看起来像这样:

    #version 150 core
    
    uniform mat4 mvp;
    
    in      vec4 vtx_pos;
    in      vec4 vtx_color1;
    in      vec4 vtx_color2;
    
    out     vec4 color;
    
    void main (void) {
      gl_Position = mvp * vtx_pos;
      color       = vtx_color1 * vtx_color2; // It is up to you to decide what to do
                                             //   with the primary and secondary
                                             //     colors, this is just for show...
    }
    

    您可以使用glVertexAttribPointer (...) 使用从 GLSL 顶点着色器查询的属性位置(链接后)向 vtx_pos、vtx_color1 和 vtx_color2 提供数据。所有这一切都完全消除了对glSecondaryColorPointerEXT (...) 的需求。

    【讨论】:

    • 这意味着我必须重写整个东西,而不是翻译遗留代码和修复一些遗留功能。我选择了 3.2 核心,因为大多数显卡都支持它,但不支持 4 版。这不是一个令人兴奋的答案:(
    • @Jay:那么请不要使用 3.2 内核 :) 您可以从 3.2 兼容性配置文件中访问大多数 3.2 功能,事实上,如果您这样做,则不需要使用着色器。这绝对不是接近现代 OpenGL 的最佳方式,但如果您正在处理遗留代码库,这可能是您唯一的过渡选择。这就是兼容性配置文件的设计目的,简化了升级过程。
    • @Jay:我不是 Qt 方面的专家,但我只花了几秒钟就在 SDK 文档中找到了QOpenGLFunctions_3_2_Compatibility。毫无疑问,这是您想要使用的。如果您使用它,那么您可以访问不带 EXT 后缀的glSecondaryColorPointer (...),因为它是 OpenGL 3.2 兼容性的一部分,不需要扩展。
    • @Jay:所有假设当然不是针对 OS X 10.7+。在此平台上获得 3.2 功能的唯一方法是使用核心配置文件上下文(它不允许 3.2 兼容性)。在这种情况下,您最好坚持使用 OpenGL 2.1。
    • @Jay:我想通过将遗留代码转换为现代 OpenGL 来说明这一点,您很可能会大幅减少与 OpenGL 相关的代码库。这听起来可能违反直觉(您现在必须编写着色器,加载它们等等),但只需在着色器中写下您想要的内容,而不是抛出大量的状态开关,就可以节省 LoC 的成本。转换中唯一的减速带是显示列表;如果您的程序使用那些您将进行大量重写的程序。
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多