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

发布于 2024-12-19 05:45:58 字数 337 浏览 2 评论 0原文

有什么方法可以在着色器的源代码中告诉该着色器正在为 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

故事与诗 2024-12-26 05:45:58

正如 PeterT 在上面的评论中建议的那样,从主程序中添加 #version唯一可行的方法。能够做到这一点(并且能够在没有 -D 编译器开关等可用的情况下定义常量)是 glShaderSource 采用指针数组而不是一个简单的char*

GLSL 规范(第 3.3 章)要求 #version 成为着色器源中的第一个内容,空白和注释除外。

因此,没有这样的东西

#ifdef foo
    #version 123
#endif

是有效的,也没有这样的东西可以编译(除非着色器编译器过于宽容,即损坏)。

关于你的第二个问题,条件编译当然有效,并且按照你想要的方式使用它是一件好事。

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 behind glShaderSource taking an array of pointers rather than a simple char*.

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

#ifdef foo
    #version 123
#endif

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.

朦胧时间 2024-12-26 05:45:58

这也是相关信息:

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 宏。

This is also related information:

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

You can, for example:

#ifdef GL_ES
    precision mediump float;
#endif

OpenGL ES 2.0 implementations are required to have a GL_ES macro predefined in the shaders.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文