【问题标题】:OpenGL extensions, how to use them correctly in C and glslOpenGL 扩展,如何在 C 和 glsl 中正确使用它们
【发布时间】:2013-02-12 23:46:05
【问题描述】:

我正在开发一个游戏引擎,它已经有了很大的发展。因为引擎也需要在 mac 上工作,所以我仍在使用 OpenGL 3.2 和 GLSL 1.2 :-(。 我使用 GLEW,我认为它可以为我解决扩展问题。

编辑:同时,部分问题已得到解答 - 请在下一个编辑处继续阅读:

我总是能够让着色器在 windows 和 mac 上工作,有时我必须在 GLSL 代码中添加一行,如 #extension GL_EXT_gpu_shader4 : enable 以使其在 Mac 上工作。然后似乎我的 Windows 版本在编译相同的着色器时会发出警告,但它会起作用。

但自从我开始使用几何着色器以来,我的噩梦就开始了。出于某种原因,mac 期望我使用 #extension GL_EXT_gpu_shader4 : enable 而 windows 期望我使用 #extension GL_EXT_geometry_shader4 : enable。这使得创建独立于平台的着色器变得不那么明显。

另外,这更烦人: Windows 版本希望我使用:glTransformFeedbackVaryings,我认为 GLEW 会使其可用于 mac,但我明确需要使用 glTransformFeedbackVaryingsEXT,这在 Windows 上不起作用版本。所以我需要#ifdef for APPLE 来使用需要的东西。 glBeginTransformFeedbackglBeginTransformFeedbackEXT 的问题相同。

但两者都接受 glProgramParameteriEXT,我不需要区分...

我知道只有转换反馈才会有问题,但是……这是怎么回事?

我以为我了解 OpenGL 扩展的工作原理,但我开始失去这种理解。

到了这样的地步,我认为当我在另一个 windows 系统或另一个 mac 系统或另一个 linux 系统上运行代码时,我会遇到新的问题,因为有不同的图形适配器或其他东西。

谁能帮我理解这个?我已经阅读了关于扩展的 OpenGL 手册,所以我遗漏了一些明显的东西。如何确保我的代码始终有效?

编辑:通过从 Mac 版本中完全删除 GLEW 并完全使用 Mac 自己的 OpenGL 3.2 实现,所有命名都是正常的,我可以从我的着色器中完全删除 #extension GL_EXT_gpu_shader4 : enable。 现在唯一让我担心的是,对于几何着色器,我需要函数 glProgramParameteri 似乎不存在,但 glProgramParameteriEXT 确实存在。出于某种原因,此功能也适用于 Windows。为什么?我可以确定它适用于所有系统/硬件吗?

【问题讨论】:

  • Apple 通常有点落后,所以您可能只想查看官方支持的版本。 this 是在您提出问题之前发布的。
  • 嗯,我认为该帖子对我没有帮助。我正在 OSX Lion 10.7.5 上开发,它是一个 AMD 图形适配器。但如果我理解正确的话,这些问题与苹果的糟糕实施有关吗? Steam 上的所有这些游戏是如何移植和运行的?
  • 你为什么不使用 MacOSX 上可用的核心 OpenGL 3.2。
  • 好吧,这很有意义!我认为 GLEW 也可以在 Mac 上完美运行,但我现在已经从 Mac 版本中完全删除了 GLEW,一切都与正常命名完美配合(除了 glProgramParameteriEXT 这也是我需要的 windows 功能,为什么会这样?)
  • 更新了我关于从 GLEW 更改为原生 Mac 实现的帖子,以及我上面消息中的问题。

标签: c opengl glsl glew


【解决方案1】:

EXT 表示您正在使用几何着色器的扩展。这也应该在 Windows 上工作。几何着色器应该是 OpenGL 3.2 中的核心功能,但现在您使用的是扩展(基本上您使用的是旧 OpenGL 版本的功能,而不是实际的 3.2)。要使用核心几何着色器,您必须切换到 GLSL 1.5。

我不太精通 OpenGL,但我的假设是,如果您开始使用核心功能,glProgramParameteri() 实际上不再需要,这就是库头文件中缺少它的原因。

【讨论】:

  • 谢谢,这是一个非常有趣的答案。我会吸收它并花一些时间看看它是否完全回答了我的问题。
  • 你说得对,核心功能不再需要 glProgramParameteri()。这些参数是在着色器代码中设置的。
  • 我认为你已经完全回答了我的问题。我会把它标记为正确答案。
【解决方案2】:

如果您坚持匹配 OpenGL/GLSL 版本,您的生活会更轻松。

http://en.wikipedia.org/wiki/OpenGL_Shading_Language

从:

  • OpenGL 2.1,带有 GLSL 120 + GL_EXT_gpu_shader4 + GL_EXT_geometry_shader4
  • OpenGL 3.2,带有 GLSL 150
  • OpenGL 3.3,带有 GLSL 330

如果您已经对使用 OpenGL 3.2 感到满意,那么请升级到 GLSL 150,因为它更接近现代 GLSL 330+。如果您想要最大的兼容性,请使用 OpenGL 2.1、GLSL 120 以及几何着色器扩展。 (虽然我不确定它能给你带来多少兼容性)

仅当使用 GLSL 120 plus 扩展时,您需要使用 glProgramParameteriEXT() 来指定几何着色器输入/输出基元类型和顶点数。例如:

glUseProgram(prog);
glProgramParameteriEXT(prog, GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES);
glProgramParameteriEXT(prog, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP);
glProgramParameteriEXT(prog, GL_GEOMETRY_VERTICES_OUT_EXT, max_output_verticies);

https://wiki.engr.illinois.edu/display/graphics/Geometry+Shader+Hello+World

在 OpenGL 3.2、GLSL 150+ 中,您可以在着色器中指定此信息,使用如下声明:

#version 150
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/geometry-shader/

【讨论】:

  • 大卫,谢谢你,我完全同意这一点,但问题是:当我尝试创建与 Mac 兼容的着色器时,我必须使用 120 + 扩展。它工作正常,但它不能在我的台式电脑上工作,在这种情况下,nvidia 驱动程序将在扩展线上失败,不存在。目前我刚刚放弃了对mac的支持,以后我可以随时为mac编写额外的代码。它只是让我退缩。我现在对 3.3+330 很满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2011-06-23
  • 2021-06-02
  • 2016-04-13
相关资源
最近更新 更多