OpenGL / GLSL精度错误

时间:2014-07-18 09:07:01

标签: macos opengl macros glsl

我有一个简单的顶点着色器:

precision mediump float;

attribute vec4 position;

attribute vec4 color;
varying vec4 f_color;

uniform mat4 projection;
uniform mat4 modelView;

void main(void) {
    gl_Position = projection * modelView * position;
    f_color = color;
    f_texCoord = texCoord;
}

无法编译,说明(使用getShaderInfoLog()):

ERROR: 0:1: 'precision' : syntax error syntax error

如果我用精确说明符删除行,它编译得很好。

系统:

OS: Mac OX 10.9.2 
GPU: NVIDIA GeForce 320M 256 MB
GLSL Ver.: 1.20

有人帮助我。

3 个答案:

答案 0 :(得分:4)

您已经找到了解决问题的方法:只需使用精度限定符删除该行。

更大的问题是你还没有确定你正在使用的OpenGL版本。您提供的GLSL示例似乎是与OpenGL ES 相关联的旧版本GLSL,它是专为移动设备设计的。由于您实际上是在台式机/笔记本电脑上运行,因此您需要“正常”的OpenGL。您观察到的错误是两者之间存在差异的结果。

通常,您希望使用受目标系统支持的最新版OpenGL。现在可能是OpenGL 3.3(以及GLSL 3.3)。

答案 1 :(得分:2)

precision关键字是OpenGL / ES扩展。由于您的顶点着色器中没有#version,因此您将获得GLSL v1.1(向后兼容OpenGL2.0),它不支持此类GL / ES扩展。

删除precision行(可能无论如何都无法在桌面GL上执行任何操作),或为某些支持#version的GLSL版本添加precision

答案 2 :(得分:0)

OpenGL 3.3中的精度限定符是多余的。从OpenGL 3.3规范,"精度限定符被添加到OpenGL ES的代码可移植性,不是用于功能。它们具有与OpenGL ES中相同的语法,如下所述,但它们具有无语义含义,其中包括无效用于存储或操作变量的精度&# 34。

对严格3.3使用#version 330 core,没有向后兼容性。如果您不需要ES兼容性,则会失去精确限定符。