是否可以在着色器代码中判断 OpenGL 版本是否为 OpenGL ES?
有什么方法可以在着色器的源代码中告诉该着色器正在为 OpenGL ES 进行编译吗?我希望能够使用 #version
预处理器指令将 OpenGL ES 的版本定义为 100(以便着色器针对 OpenGL ES 2.0 进行编译),但对于 OpenGL 2.1 则为版本 110)。
最好的方法是将 #version 作为单独的字符串放入应用程序级别,还是有办法在着色器中执行此操作?
另一件有用的、相关的事情是可以说类似的话 #if version == 100
编译此代码,else
编译此代码。这在 GLSL 中可能吗?
谢谢。
Is there any way to tell within the source code for a shader that the shader is being compiled for OpenGL ES? I want to be able to define the version using the #version
preprocessor directive to be 100 for OpenGL ES (so that the shader compiles for OpenGL ES 2.0), but is version 110 for OpenGL 2.1).
Is the best way to do this to place the #version as a separate string which is fed in at the application level, or is there a way to to do this within the shader?
Another useful, related thing to be able to do would be to say something like#if version == 100
compile this code, else
compile this code. Is this possible within GLSL?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如 PeterT 在上面的评论中建议的那样,从主程序中添加
#version
是唯一可行的方法。能够做到这一点(并且能够在没有-D
编译器开关等可用的情况下定义常量)是glShaderSource
采用指针数组而不是一个简单的char*
。GLSL 规范(第 3.3 章)要求
#version
成为着色器源中的第一个内容,空白和注释除外。因此,没有这样的东西
是有效的,也没有这样的东西可以编译(除非着色器编译器过于宽容,即损坏)。
关于你的第二个问题,条件编译当然有效,并且按照你想要的方式使用它是一件好事。
Prepending
#version
from the main program as PeterT suggested in the above comment is the only way that will work. Being able to do this (and being able to define constants without having something like a-D
compiler switch available) is the main intent behindglShaderSource
taking an array of pointers rather than a simplechar*
.The GLSL specification (chapter 3.3) requires that
#version
be the first thing in a shader source, except for whitespace and comments.Thus, no such thing as
is valid, and no such thing will compile (unless the shader compiler is overly permissive, i.e. broken).
About your second question, conditional compilation certainly works and using it in the way you intend to do is a good thing.
这也是相关信息:
http://blog.beuc.net/posts/OpenGL_ES_2.0_using_Android_NDK/
例如,您可以:
OpenGL ES 2.0 实现需要在着色器中预定义 GL_ES 宏。
This is also related information:
http://blog.beuc.net/posts/OpenGL_ES_2.0_using_Android_NDK/
You can, for example:
OpenGL ES 2.0 implementations are required to have a GL_ES macro predefined in the shaders.