在 Ubuntu 13.10(64 位)上的 Mesa 9.2.1 下观察到 OpenGL 3.0 的一个奇怪问题。具有显式精度的变量定义(如highp vec2 v;
:)会产生错误:
syntax error, unexpected VEC2, expecting ',' or ';'
由于某些原因,似乎在那里禁用了精度限定符。Mesa 发行说明没有明确这种情况——错误和通知都与主题无关。
带有 OpenGL ES 3.0 精度限定符的 PS 可以正常工作。
在 Ubuntu 13.10(64 位)上的 Mesa 9.2.1 下观察到 OpenGL 3.0 的一个奇怪问题。具有显式精度的变量定义(如highp vec2 v;
:)会产生错误:
syntax error, unexpected VEC2, expecting ',' or ';'
由于某些原因,似乎在那里禁用了精度限定符。Mesa 发行说明没有明确这种情况——错误和通知都与主题无关。
带有 OpenGL ES 3.0 精度限定符的 PS 可以正常工作。
确保您指定#version 130
.
如果没有#version
指令,OpenGL 将默认使用#version 110
精度限定符最肯定无效的位置。
带有 OpenGL ES 3.0 精度限定符的 PS 可以正常工作。
不足为奇。精度限定符在 OpenGL ES GLSL 中都有效#version
。
highp
默认情况下在片段着色器中实际上是未定义的,因此这会产生解析错误也就不足为奇了。
我觉得自己像个破纪录,但highp
在片段着色器中使用的正确方法是首先检查预处理器定义:GL_FRAGMENT_PRECISION_HIGH
. 此预处理器定义在所有阶段中定义,因为您需要知道在顶点着色器中输出某些内容时片段着色器是否支持highp
.
考虑以下 GLSL 片段:
#ifdef GL_FRAGMENT_PRECISION_HIGH
# define maxfragp highp
#else
# define maxfragp medp
#endif
由于您需要在 I/O 的顶点和片段着色器之间匹配精度,因此您可以使用类似这样的东西(对于片段和顶点着色器):
maxfragp varying vec2 tex_st;
顺便说一句,顶点着色器始终支持highp
。这仅适用于片段着色器。
添加精度限定符是为了 OpenGL ES 的代码可移植性,而不是为了功能。它们具有与 OpenGL ES 中相同的语法,如下所述,但它们没有语义含义,这包括对用于存储或操作变量的精度没有影响。
如果扩展在 OpenGL ES 2.0 规范中为精度限定符添加了相同的语义和功能,则允许扩展为此目的重用以下关键字。
桌面 GLSL 处理的唯一精度类型是单精度和双精度 (GL 4.0+ / ARB_gpu_shader_fp64
) 浮点。并且这些变量使用不同的数据类型(例如dvec2
vs. vec2
)而不是精度限定符来区分。