有没有办法在源代码中告知着色器是否正在为OpenGL ES编译着色器?我希望能够使用#version
预处理器指令将版本定义为OpenGL ES为100(以便着色器为OpenGL ES 2.0编译),但是OpenGL 2.1版本为110。)
最好的方法是将#version作为单独的字符串放在应用程序级别,或者有没有办法在着色器中执行此操作?
能够做的另一个有用的相关事情就是说
#if version == 100
编译此代码,else
编译此代码。这可能在GLSL中吗?
感谢。
答案 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宏。