OpenGL扩展,如何在C和glsl中正确使用它们

时间:2013-02-27 08:40:14

标签: c opengl glsl glew

我正在开发一款游戏引擎,它已经有了很大的发展。因为引擎也需要在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 来使用所需的东西。 与 glBeginTransformFeedback glBeginTransformFeedbackEXT 相同的问题。

但两人都接受 glProgramParameteriEXT ,在那里我不需要干扰......

据我所知,只有变换反馈表明我遇到了这个问题,但是......这是关于什么的呢?

我以为我理解OpenGL扩展如何工作,但我开始失去理解。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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/