6

我正在开发一个游戏引擎,它已经有了很大的发展。因为引擎也需要在 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 让APPLE使用需要的东西。glBeginTransformFeedbackglBeginTransformFeedbackEXT同样的问题。

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

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

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

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

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

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

4

2 回答 2

3

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

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

于 2013-04-11T14:31:46.460 回答
3

如果您坚持匹配 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/

于 2013-09-21T02:24:06.853 回答