我有一个简单的顶点着色器:
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
有人帮助我。
答案 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兼容性,则会失去精确限定符。