OpenGL ES和OpenGL兼容着色器

时间:2012-07-11 14:38:27

标签: opengl opengl-es opengl-es-2.0

我想为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 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:4)

我的解决方案是编写与这两个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 :(得分:1)

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

#define lowp
#define mediump
#define highp

附加我给着色器使用平台的信息(WINDOWS,MOBILE,IOS),可以这样使用:

#ifdef WINDOWS
precision mediump float;
#endif