是否有可能在着色器代码中判断OpenGL版本是否为OpenGL ES?

时间:2011-12-01 10:15:02

标签: opengl-es preprocessor version glsl opengl-es-2.0

有没有办法在源代码中告知着色器是否正在为OpenGL ES编译着色器?我希望能够使用#version预处理器指令将版本定义为OpenGL ES为100(以便着色器为OpenGL ES 2.0编译),但是OpenGL 2.1版本为110。)

最好的方法是将#version作为单独的字符串放在应用程序级别,或者有没有办法在着色器中执行此操作?

能够做的另一个有用的相关事情就是说 #if version == 100编译此代码,else编译此代码。这可能在GLSL中吗?

感谢。

2 个答案:

答案 0 :(得分:5)

如上面评论中PeterT所建议的,在主程序中预先加#version唯一的方式。能够这样做(并且能够在没有类似-D编译器开关的情况下定义常量)是glShaderSource采用指针数组而非简单char*的主要意图。

GLSL规范(第3.3章)要求#version是着色器源中的第一件事,除了空格和注释。

因此,没有

这样的东西
#ifdef foo
    #version 123
#endif

是有效的,没有这样的东西会编译(除非着色器编译器过于宽松,即破坏)。

关于你的第二个问题,条件编译当然有效并且以你打算做的方式使用它是一件好事。

答案 1 :(得分:4)

这也是相关信息:

http://blog.beuc.net/posts/OpenGL_ES_2.0_using_Android_NDK/

您可以,例如:

#ifdef GL_ES
    precision mediump float;
#endif

OpenGL ES 2.0实现需要在着色器中预定义GL_ES宏。