GLSL着色器程序随机无法编译

时间:2013-12-23 02:49:01

标签: c++ qt opengl glsl vertex-shader

我在OpenGL应用程序中遇到了一种奇怪的行为。我在程序初始化期间生成了许多GLSL程序。着色器程序从文本文件中读取,程序被编译和链接。但是,我随机遇到一个着色器程序(传递顶点着色器)的编译错误。我无法理解为什么程序加载完全正常并且着色器程序成功编译多次但在其他时间无法执行!

以下是着色器代码:

#version 330

// vertex position in the model space
layout(location = 0) in vec3 inPosition;  
layout(location = 1) in vec2 inTexCoord;

// will be interporlated for each fragment
smooth out vec2 vTexCoord;

// uniforms
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;


void main(void) {
    gl_Position = projectionMatrix * modelViewMatrix * vec4(inPosition, 1.0);
    vTexCoord = inTexCoord;
}

以下是编译着色器的代码(passThroughVertShader是一个QString):

this->passThroughVertShader = glCreateShader(GL_VERTEX_SHADER);

const char *passThroughVertShaderCodeC = passThroughVertShaderCode.toStdString().c_str();
sourceCode = passThroughVertShaderCodeC;
glShaderSource(this->passThroughVertShader, 1, &sourceCode, NULL);

glCompileShader(this->passThroughVertShader);
glGetShaderiv(this->passThroughVertShader, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE)
{
    qDebug("ERROR compiling pass-through vertex shader..");
    exit(-1);
}
glAttachShader(this->shaderProgram, this->passThroughVertShader);

加载它的函数:

QString MyClass::readShaderFile(const QString &filename) {

    QString content;
    QFile file(filename);
    if (file.open(QIODevice::ReadOnly)) {
        QTextStream tStream(&file);
        content = tStream.readAll();
    }
    return content;
}

更新

根据Andon的建议,我仔细检查了一下,我没有在失败后检查日志。这是日志所说的内容:

Error: 0(17) : error C0000: syntax error, unexpected '!', expecting "::" at token "!"

1 个答案:

答案 0 :(得分:2)

好的,在这里回答自己。感谢AndonM.Coleman指出我应该检查错误日志。输出结果不明确,但它引导我another SO question,它揭示了我在代码中遇到的错误。显然我正在做正确的事情来编译程序中的所有其他着色器,并在我编写这个代码时以某种方式忘记了一行。我应该做的是以下几点:

string passThroughVertShaderCodeS = passThroughVertShaderCode.toStdString();
const char *passThroughVertShaderCodeC = passThroughVertShaderCodeS.c_str();

简而言之,toStdString()方法返回缓冲区的临时副本。因为我在那个临时副本上调用c_str(),在该行之后被销毁,该指针变为无效。我不确定为什么它偶尔会成功。