2013-09-26 5 views
5

Я пытаюсь скомпилировать программу шейдеров в OpenGL 3.2, но я получаю странную ошибку связывания.OpenGL Скомпилированный шейдер был поврежден

После создания вершин и фрагментов шейдеров компилирования и прикрепления их, я стараюсь, чтобы связать их в программу, но я получаю следующую INFOLOG ошибки:

ERROR: Compiled vertex shader was corrupt. 
ERROR: Compiled fragment shader was corrupt. 

Я совершенно не знаю, что это значит, и единственного вещь, которую я мог найти в Google, - это игнорировать ее. Однако, когда я glUseProgram(), я получаю недопустимую операцию, поэтому я не могу просто проигнорировать эту ошибку.

Кроме того, я просто обновился до XCode 5, и тот же самый код/​​шейдер работал. Не знаю, как это может быть связано, хотя ..

Edit: источник шейдер

Vertex:

#version 150 

in vec3 position; 

uniform mat4 worldMatrix; 
uniform float time; 

out vec3 outPos; 
void main(){ 
    gl_Position = worldMatrix*vec4(position, 1.0); 
    outPos = position; 
} 

Фрагмент:

#version 150 

out vec4 outColor; 
uniform float time; 
uniform float red; 
uniform float green; 
uniform float blue; 

void main(){ 
    outColor=vec4(red, green, blue,1.0); 
} 
+0

ли вы журнал ошибок компиляции тоже, и вы можете показать код шейдера? – Appleshell

+0

Я полностью забыл поставить шейдерный код. Это в редактировании. Сообщайте об ошибках компиляции. – zync

+1

Вы используете out out в вершинном шейдере, но не имеете соответствующего параметра 'in' в шейдере фрагмента. Из внешнего вида шейдерного кода вы можете полностью удалить эту переменную - вы все равно не используете ее. – keltar

ответ

5

Понял работать.

Сначала я переписал шейдеры другим редактором (текстовым помощником), а затем он работал иногда. Затем я убедился, что он был корректно завершен, и он работал каждый раз.

Возможно, каким-то образом были напечатаны непечатные персонажи, такие как Андон М. Коулман.

3

У меня была такая же проблема, и я обнаружил, что если вы используете «std :: stringstream buffer» для чтения файла, столько примеров кода в Интернете используйте метод .str(). C_str(), чтобы получить a * ptr, необходимый для glShaderSource, указатель удаляется, то есть вы получаете случайные ошибки компоновщика. Вот работа вокруг я создал ...

int shaderFromFile(const std::string& filePath, GLenum shaderType) { 
    //open file 
std::ifstream f; 
f.open(filePath.c_str(), std::ios::in); 
if(!f.is_open()){ 
    throw std::runtime_error(std::string("Failed to open file: ") + filePath); 
} 


//read whole file into stringstream buffer 
std::stringstream buffer; 
buffer << f.rdbuf(); 
buffer << "\0"; 
f.close(); 

// нужно скопировать, а указатель удаляется при завершении вызова станд :: строка shaderCode = buffer.str() c_str().

//create new shader 
int ShaderID = glCreateShader(shaderType); 

//set the source code 

    const GLchar* code = (const GLchar *) shaderCode.c_str(); 

    glShaderSource(ShaderID, 1, &code, NULL); 
    //compile 
    glCompileShader(ShaderID); 


    //throw exception if compile error occurred 
    GLint status; 
    glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &status); 
    std::cout << "Status from compile:" << status << "\r\n"; 
    if (status == GL_FALSE) { 
     std::string msg("Compile failure in shader:\n"); 

     GLint infoLogLength; 
     glGetShaderiv(ShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); 
     char* strInfoLog = new char[infoLogLength + 1]; 
     glGetShaderInfoLog(ShaderID, infoLogLength, NULL, strInfoLog); 
     msg += strInfoLog; 
     delete[] strInfoLog; 

     glDeleteShader(ShaderID); ShaderID = 0; 
     throw std::runtime_error(msg); 
    } 

return ShaderID; 

}

Смежные вопросы