精度限定符在Mesa 9.2.1下抛出OpenGL 3.0的错误

时间:2013-11-21 16:44:48

标签: opengl opengl-3 mesa ubuntu-13.10

观察到Ubuntu 13.10(64位)下Mesa 9.2.1下OpenGL 3.0的一个奇怪问题。具有显式精度的变量定义(如:highp vec2 v;)会产生错误:

syntax error, unexpected VEC2, expecting ',' or ';'

由于某些原因,似乎禁用了精度限定符。 Mesa Release Notes不清楚情况 - 不是错误,也不是与主题相关的通知。

P.S。使用OpenGL ES 3.0精度限定符可以正常工作。

2 个答案:

答案 0 :(得分:3)

请务必指定#version 130

如果没有#version指令,OpenGL将默认为#version 110,其中精度限定符肯定无效。

  

P.S。使用OpenGL ES 3.0精度限定符可以正常工作。

不足为奇。精度限定符适用于OpenGL ES GLSL #version s。

答案 1 :(得分:2)

默认情况下,

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。这仅适用于片段着色器。

<小时/> 除此之外,你应该知道在桌面GLSL中,虽然版本1.30定义了精度限定符,但它们实际上并没有做任何事情。他们只是简单地从GLSL ES中移植着色器。

The OpenGL Shading Language (Version 1.3) - 4.5精密限定符 - 第35页

  

使用OpenGL ES添加精度限定符以实现代码可移植性,而不是功能。它们具有与OpenGL ES中相同的语法,如下所述,但它们具有 无语义含义 ,这对用于存储或操作变量的精度没有影响。

     

如果扩展在OpenGL ES 2.0规范中为精确限定符添加了相同的语义和功能,则允许扩展为此目的重用下面的关键字。

enter image description here

精确桌面GLSL处理的唯一类型是单精度和双精度(GL 4.0+ / ARB_gpu_shader_fp64)浮点数。这些变量使用不同的数据类型进行区分(例如dvec2vec2),而不是精度限定符。