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

Jam*_*ord 6 preprocessor opengl-es 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中吗?

谢谢.

Dam*_*mon 5

预先考虑#version从主程序PeterT上述评论所说是唯一的,将工作方式.能够做到这一点(并且能够在没有类似-D编译器开关的情况下定义常量)是glShaderSource获取指针数组而不是简单指针的主要目的char*.

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

因此,没有这样的事情

#ifdef foo
    #version 123
#endif
Run Code Online (Sandbox Code Playgroud)

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

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


juz*_*lin 5

这也是相关信息:

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

例如,您可以:

#ifdef GL_ES
    precision mediump float;
#endif
Run Code Online (Sandbox Code Playgroud)

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