Я испытываю странное поведение в своем приложении 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 "!"
Хорошо, отвечаю сам здесь. Спасибо AndonM.Coleman за указание, что я должен проверить журнал ошибок. Вывод был неясен, но это привело меня к еще один вопрос это пролило некоторый свет на ошибку, которую я имел в коде. Видимо, я правильно делал для компиляции всех других шейдеров в программе и почему-то забыл одну строку, когда писал код для этого. То, что я должен был сделать, было следующим:
string passThroughVertShaderCodeS = passThroughVertShaderCode.toStdString();
const char *passThroughVertShaderCodeC = passThroughVertShaderCodeS.c_str();
Короче говоря, toStdString()
Метод возвращал временную копию буфера. Так как я звоню c_str()
на той временной копии, которая уничтожается после этой строки, этот указатель становится недействительным. Я не уверен, почему это иногда удавалось, хотя.
Других решений пока нет …