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

OpenGL扩展,如何在C和glsl中正确使用它们,c,opengl,glsl,glew,C,Opengl,Glsl,Glew,我正在开发一个游戏引擎,它已经有了很大的发展。因为引擎也需要在mac上工作,所以我仍然使用OpenGL 3.2和GLSL 1.2:-(。 我使用GLEW,我认为它可以为我解决扩展问题 编辑:同时,部分问题得到了回答-请在下一次编辑时继续阅读: 我总是能够使着色器在windows和mac上工作,有时我必须在GLSL代码中添加一行,如#extension GL\u EXT\u gpu\u shader4:enable,以使其在mac上工作。然后,我的windows版本在编译同一着色器时似乎会发出警告

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

编辑:同时,部分问题得到了回答-请在下一次编辑时继续阅读:

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

但自从我开始使用几何体着色器以来,我的噩梦就开始了。出于某种原因,mac希望我使用#extension GL#U EXT#gpu着色器4:enable,而windows则希望我使用#extension GL#EXT#U geometry#shader4:enable。这使得创建独立于平台的着色器变得不那么明显

而且,这更让人恼火: Windows版本希望我使用:glTransformFeedbackVaryings,我认为GLEW会将其提供给mac,但在那里我明确需要使用glTransformFeedbackVaryingsEXT,它在Windows版本上不起作用。因此,我需要为APPLE提供ifdef以使用所需的功能。 glbegintsformfeedbackglbegintsformfeedbackext也存在同样的问题

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

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

我原以为我了解OpenGL扩展是如何工作的,但现在我开始失去这种理解

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

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

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

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


我对OpenGL不是很精通,但我的假设是,如果您开始使用核心功能,实际上不再需要glProgramParameteri(),这就是为什么库标题中缺少它。

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

选自:

  • OpenGL 2.1,带有GLSL 120+GL_EXT_gpu_着色器4+GL_EXT_geometry_着色器4
  • 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扩展时,才需要使用GLProgramParameterExt()指定几何体着色器输入/输出基本体类型和顶点计数。例如:

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);

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

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

苹果通常有点落后,所以你可能只想查看官方支持的版本。就在你提问之前发布。嗯,我认为这篇帖子对我没有帮助。我正在OSX Lion 10.7.5上开发,它是AMD图形适配器。但是如果我理解正确,这些问题与苹果糟糕的实现有关。你怎么办steam上的那些游戏可以移植并运行?你为什么不使用MacOSX上的核心OpenGL 3.2呢?好吧,这真的很有道理!我原以为GLEW也可以在Mac上完美运行,但现在我已经将GLEW从Mac版本中完全删除了,一切都可以在普通Naming上完美运行(除了GLProgramParameterExt,这也是我在windows中需要的函数,为什么?)更新了我的帖子,介绍了从GLEW到本机Mac实现的更改,也介绍了我上面邮件中的问题。谢谢,这是一个非常有趣的答案。我会仔细阅读并花些时间看看它是否完全回答了我的问题。glProgramParameteri()你说得对在核心功能中不再需要。在着色器代码本身中设置了这些参数。我想你已经完全回答了我的问题。我将把它标记为正确答案。大卫,谢谢你,我完全同意这一点,但问题是:当我试图创建与Mac兼容的着色器时,我必须使用120+次E扩展。它工作得很好,但是它不会在我的桌面PC上工作,英伟达的驱动程序在扩展线上失败了。现在我刚刚放弃了MAC支持,我可以稍后再为Mac编写额外的代码。它只是让我回来。现在我对3.3 + 330非常满意。