2016-06-18 7 views
-3

Sowohl der Vertex Shader als auch der Fragment Shader sind kleine Fliegen (Dateien) für eine kleine rote Box, die auf blauem Hintergrund erscheint.Vertex Shader und Fragment Shader konnten nicht kompiliert werden bevor gllinkProgram() aufgerufen wurde

Hier sind sie:

1. ist colorShading.vert

#version 130 
in vec2 vertexPosition; 
void main(){ 
gl_Positiion.xy = vertexPosition; 
gl_Positiion.z = 0; 
gl_Positiion.w = 1; 
} 

2. Eine davon ist colorShading.frag

#version 130 
out vec3 color; 
void main(){ 
color vec3(1.0, 0.0, 0.0); 
} 

und hier ist der Fehler:

Vertex and Fragment shader(s) were not successfully compiled 
before glLinkProgram() was called. Link failed. 
Shaders failed to link! 
Enter any key to quit... 

Ich benutzte einen Conso le zur Ausgabe mit ihm

std::vector<GLchar> errorLog(maxLength); 
glGetProgramInfoLog(_programID, maxLength, &maxLength, &errorLog[0]); 
std::printf("%s\n", &(errorLog[0])); 
fatalError("Shaders failed to link!");` 

Die Funktion ich die Shaders kompilieren verwendet, um unter

und gebe ich den filepath und shaderID auf die Funktion, anstatt das Kopieren und Einfügen, Convenient richtig?

void GLSLProgram::compileShader(const std::string& filePath, GLuint& id) 
{ 
    std::ifstream shaderFile(filePath); 
    if (shaderFile.fail()) { 
     perror(filePath.c_str()); 
     fatalError("Failed to Open " + filePath); 
    } 
    std::string fileContents = ""; 
    std::string line; 
    while (std::getline(shaderFile, line)) { 
     fileContents += line + "\n"; 
    } 
    shaderFile.close(); 
    const char* contentsPtr = fileContents.c_str(); 
    glShaderSource(id, 1, &contentsPtr, nullptr); 
    glCompileShader(id); 
    GLint success = 0; 
    glGetShaderiv(id, GL_COMPILE_STATUS, &success); 
    if (success = GL_FALSE) { 
     GLint maxLength = 0; 
     glGetShaderiv(id, GL_INFO_LOG_LENGTH, &maxLength); 
     //The maxLength include the NULL character 
     std::vector<char> errorLog(maxLength); 
     glGetShaderInfoLog(id, maxLength, &maxLength, &errorLog[0]); 
     //Exit with failure 
     glDeleteShader(id); 
     std::printf("%s\n", &(errorLog[0])); 
     fatalError(" Shader " +filePath +" failed to compile!"); 
     return; 
    } 
} 

Wie gehe ich über diesen Fehler, den ich bekomme?

+1

Welchen Fehler * bekommen Sie? –

+0

Der Vertex-Shader und der Fragment-Shader werden nicht kompiliert. – Shanu

+0

'success = GL_FALSE' Beachten Sie die Warnungen Ihres Compilers. –

Antwort

0

Es gibt mindestens zwei Probleme im Code:

Compilation-Code

Die if Anweisung, die für eine erfolgreiche Kompilierung prüft einen Auftrag enthält, kein Vergleich:

if (success = GL_FALSE) { 

was Sie brauchen tatsächlich (nicht die zwei Gleichheitszeichen):

if (success == GL_FALSE) { 

Jeder Compiler, den ich kenne, würde zumindest eine Warnung geben.

Shader

Im Fragment-Shader gibt es auch a = unterzeichnen fehlt:

color vec3(1.0, 0.0, 0.0); 

Dies gilt nicht GLSL-Code ist. Wahrscheinlich Sie diese Farbe zuweisen wollten, so sollte der Code

color = vec3(1.0, 0.0, 0.0); 
0

Ihr erstes Codebeispiel gl_Position als gl_Positiion falsch geschrieben sein.

+0

Yeah hat alles funktioniert, aber ich kann immer noch keine rote Farbe in der Box bekommen – Shanu

Verwandte Themen