Программа шейдера GLSL случайно не компилируется

Я испытываю странное поведение в своем приложении 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;
}

Обновить:

Следуя совету Андона, я дважды проверил и не проверил журнал после сбоя. Вот что говорит журнал:

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

2

Решение

Хорошо, отвечаю сам здесь. Спасибо AndonM.Coleman за указание, что я должен проверить журнал ошибок. Вывод был неясен, но это привело меня к еще один вопрос это пролило некоторый свет на ошибку, которую я имел в коде. Видимо, я правильно делал для компиляции всех других шейдеров в программе и почему-то забыл одну строку, когда писал код для этого. То, что я должен был сделать, было следующим:

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

Короче говоря, toStdString() Метод возвращал временную копию буфера. Так как я звоню c_str() на той временной копии, которая уничтожается после этой строки, этот указатель становится недействительным. Я не уверен, почему это иногда удавалось, хотя.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]