OpenGL ES 和 OpenGL 兼容着色器

6

我希望你能够为OpenGL ES和OpenGL(Windows)担任相同的着色器源。为此,我希望定义自定义数据类型并仅使用OpenGL ES函数。

一种方法是定义:

#define highp
#define mediump
#define lowp

对于Windows着色器,可以直接将着色器代码转化为OpenGL ES的代码。

另一种方法是为OpenGL ES定义自定义数据类型:

#define hvec2 highp vec2

对于 Windows 系统,可以按照以下方式操作:

#define hvec2 vec2

你认为哪个更好?你对这个问题有其他解决方案吗?
3个回答

5
我的解决方案是编写与两个API兼容的着色器代码,然后在将片段着色器源代码上传到OpenGL ES时,只需在前面添加以下行:
precision mediump float;

这将把默认的浮点数精度设置为中等。在OpenGL ES片段着色器中,浮点值没有默认的精度级别,这意味着您需要在每个浮点声明上指定精度,或者明确设置默认精度。如果对您的应用程序更有意义,您可以使用lowphighp

更多详细信息请参见《OpenGL ES Shading Language规范》4.5.3节:http://www.khronos.org/files/opengles_shading_language.pdf

如果您需要更精细地控制着色器的精度,您还可以将此方法与您的#define方法混合使用。


5

有人知道这是如何工作的吗?我已经浏览了规范,但没有找到任何关于GLSL ES(版本100)和GLSL(版本150)如何兼容的相关信息。 - Justin Meiners
为了以后的参考,我发现在ES2_compatibility下,OpenGL 3.2以上的上下文可以加载顶部带有#version 100的ES 2.0着色器。 - Justin Meiners

2

当着色器在Windows上运行时,我只需在每个着色器开头定义以下内容即可管理它:

#define lowp
#define mediump
#define highp

此外,我还会给着色器提供所使用平台的信息(WINDOWS,MOBILE,IOS),可以通过以下方式使用:

#ifdef WINDOWS
precision mediump float;
#endif

对于评论的顶部,我认为适度的点赞更有价值——在不相关的平台上保留精度修饰符比不包含它们并在其他地方性能受损要好得多。但是,#ifdef GL_ES(和#ifndef)是有条件编译的最简单方法,因为它是内置的。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接