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

你认为什么更好?你有其他解决这个问题的方法吗?

4

3 回答 3

5

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

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

于 2012-07-12T07:39:49.837 回答
5

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

precision mediump float;

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

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

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

于 2012-11-22T12:00:37.727 回答
2

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

#define lowp
#define mediump
#define highp

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

#ifdef WINDOWS
precision mediump float;
#endif
于 2013-05-07T08:38:47.157 回答