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

sci*_*pie 6 c opengl glew glsl

我正在开发一款游戏引擎,它已经有了很大的发展.因为引擎也需要在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.为什么?我可以确定它适用于所有系统/硬件吗?

lit*_*imp 3

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

我不太精通 OpenGL,但我的假设是,如果您开始使用核心功能,那么 glProgramParameteri() 实际上不再是必要的,这就是为什么它在库标头中丢失的原因。