c++ - GLSL Shader程序随机编译失败

标签 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 "!"

最佳答案

好吧,在这里回答我自己。感谢 AndonM.Coleman 指出我应该检查错误日志。输出不清楚,但它引导我到 another SO question这揭示了我在代码中遇到的错误。显然,我在编译程序中的所有其他着色器时做了正确的事情,但在为此编写代码时不知何故忘记了一行。我应该做的是:

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

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

关于c++ - GLSL Shader程序随机编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736364/

相关文章:

c++ - 无法从文件加载正确的信息

c++ - 为什么将这两个代码的输出更改为 '&' 字符?

c++ - 标识符未在宏中定义

linux - QCA 不加载插件

c++ - 在现有图形应用程序上绘制 DirectX/OpenGL 图形

c++ - glFinish() 期间的 CPU 使用率

c++ - 使用 vector 类实现堆栈的链表与动态数组

python - 从 QAbstractListModel 中插入和删除项目

c++ - qt打开一个带有不支持警告图像格式的jpg文件

macos - 切换 OpenGL 上下文或切换上下文渲染目标,哪个更可取?