GLSL 给出奇怪的错误:“#version required and missing”仅在 Mac 上
Posted
技术标签:
【中文标题】GLSL 给出奇怪的错误:“#version required and missing”仅在 Mac 上【英文标题】:GLSL gives strange error: "#version required and missing" only on mac 【发布时间】:2014-08-13 22:15:25 【问题描述】:我有一个奇怪而令人沮丧的问题。我有一个在 Windows 和 Linux 上运行良好的着色器。当我将它移到我的 Mac 上时,它给了我可怕的错误和黑屏。
// Vertex - THIS COMMENT DOES NOT EXIST IN ACTUAL SHADER. ACTUAL STARTS AT #version 150
#version 410
in highp vec4 vertex;
in mediump vec3 normal;
uniform mediump mat4 matrix; // MVP
uniform mediump vec3 col; // The color in question
uniform highp vec4 lightPosition;
uniform highp vec3 La; // Ambient
uniform highp vec3 Ld; // diffuse
uniform highp vec3 Ls; // Specular
uniform highp vec3 Ka; // Ambient Reflectivity
uniform highp vec3 Kd; // Diffuse Reflectivity
uniform highp vec3 Ks; // Specular Reflectivity
uniform float Shininess; // Specular Shininess factor
uniform mediump mat4 ModelViewMatrix;
uniform mediump mat3 NormalMatrix;
out mediump vec3 LightIntensity;
out mediump vec4 color;
void main()
color = vec4(col * 0.2 + col * 0.8, 1.0);
color = clamp(color, 0.0, 1.0);
vec3 tnorm = normalize( NormalMatrix * normal);
vec4 eyeCoords = ModelViewMatrix * vertex;
vec3 s = normalize(vec3(lightPosition - eyeCoords));
vec3 v = normalize(-eyeCoords.xyz);
vec3 r = reflect( -s, tnorm );
float sDotN = max( dot(s,tnorm), 0.0 );
vec3 ambient = La * Ka;
vec3 diffuse = Ld * Kd * sDotN;
vec3 spec = vec3(0.0);
if( sDotN > 0.0 )
spec = Ls * Ks *
pow( max( dot(r,v), 0.0 ), Shininess );
LightIntensity = ambient + diffuse + spec;
gl_Position = matrix * vertex;
//fragment
#version 410
in mediump vec4 color;
in mediump vec3 LightIntensity;
out vec4 out_Color;
void main(void)
out_Color = vec4(LightIntensity, 1.0) * color;
// error
QGLShader::compile(Vertex): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:11: 'attribute' : syntax error syntax error
Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile
QGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile
QGLShader::link: "ERROR: One or more attached shaders not successfully compiled
"
Errors linking simple shader: ERROR: One or more attached shaders not successfully compiled
QGLShader::compile(Vertex): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'attribute' : syntax error syntax error
Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile
QGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:11: 'varying' : syntax error syntax error
Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile
QGLShader::link: "ERROR: One or more attached shaders not successfully compiled
"
Errors linking blit shader: ERROR: One or more attached shaders not successfully compiled
// C++
QGLShader *vshader1 = new QGLShader(QGLShader::Vertex, this);
vshader1->compileSourceFile(":shaders/vert1.vert");
QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this);
fshader1->compileSourceFile(":shaders/frag1.frag");
program1.addShader(vshader1);
program1.addShader(fshader1);
program1.link();
所以基本上如果我输入版本#version 150 或#version 410,它会抱怨没有指定#version。如果我指定#version 130 或#version 350,它会抱怨我要求的版本无效(它不应该只是恢复到可用版本吗?)
知道发生了什么吗?这尤其令人恼火,因为我指定了#version 并且没有使用varying 关键字。
【问题讨论】:
glGetString(GL_SHADING_LANGUAGE_VERSION)
返回什么?
返回 4.10。它也应该适用于不正确的版本,不是吗?
是的,或者任何以前的版本都可以。您可以尝试手动读取着色器源字符串并改用compileSourceCode
。这样您就可以检查字符串是否被正确读取。换行等问题很可能导致此问题。
我会尝试编译源代码。不过,我的着色器源似乎已经检查过了。我不知道它在哪里得到不同的错误。我在 Mac mini 上。我想知道这是否是问题所在。
【参考方案1】:
我认为#version 150 core
应该出现在着色器文件的最顶部,后面有一个空行,并引用core
、legacy
或es
...
【讨论】:
以上是关于GLSL 给出奇怪的错误:“#version required and missing”仅在 Mac 上的主要内容,如果未能解决你的问题,请参考以下文章
带有 Blinn-Phong GLSL 着色器、点光源的奇怪结果
json.load() 函数给出奇怪的 'UnicodeDecodeError: 'ascii' codec can't decode' 错误