我知道OpenGL 4和3非常相似,尤其是3.1和4.1。由于两者基本上是一起发布的,因此很难理解OpenGL 4.0 / 4.1的基本原理。
在以前的OpenGL版本中,次要版本会向上递增,直到大量更改累积到新的主要版本中。 OpenGL 3.x和4.x引入了向后兼容的API变化,然后OpenGL 3.2和3.3被认为是3系列的特定分支,它们不向前兼容,而3.1与4.1 +兼容
与OpenGL 3.1相比,OpenGL 4.1提供哪些主要差异,保证将其归入新的主要版本?
额外奖励:在任何情况下,任何差异都会导致GL3或仅仅是辅助功能的性能提升吗?
编辑:基于答案的一些额外发现
OpenGL 3.3是为了配合OpenGL 4.0,将尽可能多的功能整合到旧硬件中。在OpenGL 3和4之间选择3.3可能是更好的选择有时候。 4.1添加了GL ES 2.0兼容性和一些不错的功能。
更大的工作流程差异之一是通过新的曲面细分着色器在管道中添加GPU编程步骤。另一个是多个视口来渲染。 我相信新的细节级别功能会改变我正在使用的工作流程,也许会改变其他工作流程,尽管我没有深入研究这个功能。
如果您发现任何误解或需要改进的地方,请与我们联系。
主题演讲(显然是在回答问题时从答案中删除了.. 暂时参考实际答案。)
Appendix G - K For OpenGL 3.1 features through OpenGL 4.1 features
Khronos Group Release Of OpenGL 4.0可能“更容易阅读”:)
- 采样器对象
- 实例化阵列和着色器
texture_cube_map_array和texture_gather
GLSL 4.0 和动态LOD
- shader_subroutine 和 sample_shading
- 的 separate_shader_objects
- 增加纹理/渲染缓冲区
所需的尺寸- 64位浮点顶点属性
- 的 get_program_binary
- +2 Tesselation着色器
答案 0 :(得分:12)
答案 1 :(得分:11)
如果您的问题是“4.1工作流程如何更好”,那就不是4.1的内容。
首先,快速定义,以确保我们谈论同样的事情。对我来说,“工作流程”意味着API改进和使性能更好的事情。这些不允许硬件做任何你以前无法做的事情;它们只是让程序员更容易,或者让你获得更快的性能。
绝大多数API改进(不基于新功能的改进)可作为核心扩展用于3.3实现。由于它们是核心扩展,因此您甚至不必更改代码以从3.3代码中删除“ARB”后缀以在4.1代码中使用它们。一切正常。特别是,我在谈论程序分离(GL_ARB_separate_program_objects)和检索已编译程序的二进制文件(GL_ARB_get_program_binary)。两者都支持3.3硬件; NVIDIA甚至将这些扩展到GeForce 6xxx芯片。
主要的例外是着色器子程序,它仅限于4.x硬件。但是,这个规范的指定很差,以至于我不确定是否有人可以使用它,更不用说了。这是令人费解的,有点令人困惑。
没有太多可以轻易用来提升4.1独有的性能。无绑定渲染(GL_NV_vertex_buffer_unified_memory)可能是最大的性能提升,如果这是你的瓶颈。正如您可能从名称中注意到的那样,它是NVIDIA扩展而非核心。我确信ARB正在开发一种与未来规范中的核心功能完全不同的东西。而Bindless并不是4.x硬件独有的;再次,NVIDIA将这一直延伸回GeForce 6xxx芯片。
4.x中有一些东西可以增强硬件,但它们最终都围绕某种形式的GPGPU工作。如果从OpenCL生成渲染数据,间接渲染(GL_ARB_draw_indirect)将是一个很好的加速。而Civilization V已经展示了使用GPGPU技术的价值(他们使用DXCompute,但你也可以使用OpenCL)来解压缩纹理;这对于加载性能非常有帮助,因为您不必从磁盘加载尽可能多的数据。
如果您想要真正扩展性能改进的定义,可以将Tessellation视为性能增强。您可以使用它来发送较小的网格,或使用较低的LOD网格靠近相机。或者你可以认为它是一种渲染比以前更高的多边形网格的方法。
4.x真的不是要提供能让事情变得更快的硬件功能。它更多的是能够以不同的方式渲染。
还有一件事:3.1和3.3之间没有选择。几乎任何可运行3.1的硬件都可以运行3.3。如果没有,那就是因为硬件制造商正在放弃他们的OpenGL驱动程序(我正在看着你,英特尔)。