2012-07-11 175 views
5

我想为OpenGL ES和OpenGL(Windows)提供相同的着色器源代码。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。OpenGL ES和OpenGL兼容着色器

一种方法是定义:

#define highp 
#define mediump 
#define lowp 

为Windows着色器和写着色器,因为它是OpenGL ES的。

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

#define hvec2 highp vec2 

像这样为Windows

#define hvec2 vec2 

你觉得什么是好?你有解决这个问题的其他解决方案吗?

回答

4

我的解决方案已经写shader代码上传片段着色器源代码的OpenGL ES时与这两个API兼容,然后只需在前面加上下面一行:

precision mediump float; 

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

欲了解更多详情,请参阅OpenGL ES的着色语言规范的第4.5.3节:http://www.khronos.org/files/opengles_shading_language.pdf

,如果你需要在你的着色器在精度更精细的控制,您也可以与您的#define方式混合了这种方法。

4

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

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

+0

有谁知道这是如何工作的?我已经浏览了规范,但找不到与GLSL ES(版本100)和GLSL(版本150)完全兼容有关的任何内容。 – 2016-06-23 17:18:17

+0

为了将来的参考,我发现在ES2_compatibility下,OpenGL 3.2>上下文可以在顶部加载#version 100的ES 2.0着色器。 – 2016-06-25 15:37:05

1

我通过仅限定在当着色器上的窗口运行开始每个着色引擎的以下管理它:

#define lowp 
#define mediump 
#define highp 

附加I得到着色器,其使用plattform的信息(WINDOWS,MOBILE,IOS)这可以用这种方式:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

对评论的顶部部分进行了调整 - 我认为将精度调整器放在不相关的平台上并放弃它们比不包括它们并在其他地方的性能损害更有价值。但'#ifdef GL_ES'(和'#ifndef')是内置条件编译的最简单方法。 – Tommy 2016-02-24 22:16:29