OpenGL ES 和 OpenGL 兼容着色器

Posted

技术标签:

【中文标题】OpenGL ES 和 OpenGL 兼容着色器【英文标题】:OpenGL ES and OpenGL compatible shaders 【发布时间】:2012-07-11 14:38:27 【问题描述】:

我想为 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

你觉得哪个更好?对于这个问题,您还有其他解决方案吗?

【问题讨论】:

【参考方案1】:

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

precision mediump float;

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

有关更多详细信息,请参阅 OpenGL ES 着色语言规范的第 4.5.3 节:http://www.khronos.org/files/opengles_shading_language.pdf

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

【讨论】:

【参考方案2】:

你可以使用http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

此扩展增加了对 OpenGL 3.x 中缺少的 OpenGL ES 2.0 功能的支持。启用这些功能将简化将应用程序从 OpenGL ES 2.0 移植到 OpenGL 的过程。

【讨论】:

有谁知道这是怎么工作的?我浏览了规范,但找不到任何与 GLSL ES(版本 100)和 GLSL(版本 150)如何兼容的相关内容。 为了将来参考,我发现在 ES2_compatibility 下,OpenGL 3.2 > 上下文可以加载顶部带有 #version 100 的 ES 2.0 着色器。【参考方案3】:

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

#define lowp
#define mediump
#define highp

另外,我给着色器提供了使用平台的信息(WINDOWS、MOBILE、ios),可以这样使用:

#ifdef WINDOWS
precision mediump float;
#endif

【讨论】:

对评论的顶部进行温和的投票 - 我认为在不相关的平台上包含精度修饰符并丢弃它们比不包含它们并在其他地方损害性能更有价值。但是#ifdef GL_ES(和#ifndef)是有条件编译的最简单方法,内置。

以上是关于OpenGL ES 和 OpenGL 兼容着色器的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (下)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (下)

我的OpenGL学习进阶之旅OpenGL ES 3.0实现了具有可编程着色功能的图形管线

我的OpenGL学习进阶之旅OpenGL ES 3.0实现了具有可编程着色功能的图形管线