2013-12-23 3 views
2

Я испытываю странное поведение в своем приложении OpenGL. Я генерирую несколько программ GLSL во время инициализации программы. Шейдерные программы читаются из текстовых файлов, а программы скомпилированы и связаны. Тем не менее, я случайно сталкиваюсь с ошибками компиляции для одной из шейдерных программ (проходной вершинный шейдер). Я не могу понять, почему программа загружается отлично, и программа шейдеров успешно компилируется несколько раз, но не может делать в другие моменты!Программа GLSL Shader случайно не компилируется

Вот код шейдера:

#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 "!" 
+1

Вы знаете, что было бы действительно полезно? Фактический журнал ошибок для вашей случайной ошибки: P –

+0

@ AndonM.Coleman Вот и все. Журнал ничего не показывает! – informer2000

+0

Собственно, позвольте мне проверить это. – informer2000

ответ

2

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

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

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

+0

Я уже упоминал об этом в редактировании вопроса. Пожалуйста, проверьте ** Обновление ** в вопросе. – informer2000