OpenGL ES和兼容OpenGL的着色器

OpenGL ES和兼容OpenGL的着色器,opengl,opengl-es,opengl-es-2.0,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 你认为什么更好?

我想为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
你认为什么更好?对于这个问题,您还有其他解决方案吗?

您可以使用

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


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

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

有关更多详细信息,请参见OpenGL ES着色语言规范第4.5.3节:


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

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

#define lowp
#define mediump
#define highp
另外,我向着色器提供了使用何种平台(WINDOWS、MOBILE、IOS)的信息,这些信息可以通过以下方式使用:

#ifdef WINDOWS
precision mediump float;
#endif

请投票支持评论的顶部部分——我认为在不相关的平台上使用精度修饰符并将其丢弃比不使用它们并在其他地方造成性能损害更有价值。但是,
#ifdef GL#ES
(和
#ifndef
)是有条件编译的最简单方法,是内置的。有人知道这是如何工作的吗?我浏览了规范,但找不到任何与GLSL ES(版本100)和GLSL(版本150)如何兼容相关的内容。为了将来参考,我发现在ES2_兼容性下,OpenGL 3.2>上下文可以加载顶部为版本100的ES 2.0着色器。