我想为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
您认为哪种更好?你有这个问题的其他解决方案吗?
答案 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片段着色器中,浮点值没有默认的精度级别,这意味着您需要在每个浮点声明上指定精度,或者显式设置默认精度。如果对您的应用程序更有意义,可以使用lowp
或highp
。
有关更多详细信息,请参阅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