2013-09-26 10 views
5

Sto provando a compilare un programma shader in OpenGL 3.2, ma sto ottenendo uno strano errore di collegamento.OpenGL Compiled Shader era corrotto

Dopo aver creato la compilazione vertex e fragment shader e le collega, cerco di collegarli in un programma ma ottengo il seguente errore infolog:

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

Non ho assolutamente idea di cosa significhi e l'unico la cosa che ho trovato su google è stata ignorarla. Tuttavia, quando glUseProgram() si ottiene un'operazione non valida, quindi non posso semplicemente ignorare questo errore.

Inoltre, ho appena aggiornato a XCode 5 e la stessa sorgente codice/shader funzionava. Non so come possa essere correlato però ..

Edit: sorgente dello shader

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; 
} 

Frammento:

#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

Ti log errori di compilazione troppo, e possono mostrare il codice dello shader? – Appleshell

+0

Ho completamente dimenticato di inserire il codice dello shader. È nella modifica. Non sono stati segnalati errori di compilazione. – zync

+1

Hai 'out outPos' in vertex shader, ma nessun parametro' in' corrispondente nello shader di frammenti. Dall'aspetto del codice shader è possibile rimuovere completamente questa variabile - non la si usa comunque. – keltar

risposta

5

Got a farlo funzionare.

Inizialmente ho riscritto gli shader con un altro editor (compagno di testo) e poi ha funzionato a volte. Poi ho fatto in modo che fosse terminato correttamente e funzionasse ogni volta.

Forse in qualche modo c'erano caratteri non stampabili come suggerito da Andon M. Coleman.

3

Ho avuto lo stesso problema e ho scoperto che se si utilizza il "buffer std :: stringstream" per leggere il file, come molti esempi di codice sul Web, si usa il metodo .str(). C_str() per ottenere a * ptr necessario per glShaderSource, il puntatore viene eliminato, ovvero si verificano errori casuali del linker. Ecco il lavoro intorno ho creato ...

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(); 

// bisogno di copiare, come puntatore viene eliminato quando la chiamata è terminata std :: string 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; 

}