2016-07-01 25 views
-2

Ich habe versucht, Shader zum Arbeiten zu bekommen. Sie nicht.openGL, GLFW, 1281 Fehler auf glShaderSource, funktioniert die nächste glShaderSource irgendwie gut

std::cout << "a " << glGetError() <<std::endl; //making sure things work 
GLuint vertexShader = 0; 
GLuint fragmentShader = 1; 
glCreateShader(GL_VERTEX_SHADER); 
std::cout <<"b " << glGetError() <<std::endl; 
glCreateShader(GL_FRAGMENT_SHADER); 
std::cout <<"c " << glGetError() <<std::endl; 
glShaderSource(vertexShader, GLsizei(1), (const char**)&VertexShaderSource, NULL);//ERROR 
std::cout <<"d " << glGetError() <<std::endl; 
glShaderSource(fragmentShader, GLsizei(1), (const char**)&FragmentShaderSource, NULL);//is somehow fine 
std::cout <<"e " << glGetError() <<std::endl; 
glCompileShader(vertexShader); 
std::cout <<"f " << glGetError() <<std::endl; 
glCompileShader(fragmentShader); 
std::cout <<"g " << glGetError() <<std::endl;' 

Nun ist der Ausgang:

a 0 
b 0 
c 0 
d 1281 
e 0 
f 1281 
g 0 

Dies bedeutet, dass der erste glShaderSource Anruf nicht funktioniert, aber aus irgendeinem Grund die nächsten glShaderSource Werke, während das tun, was ich denke, ist das genau das gleiche Ding. Was geht hier vor ???

Shaders sind:

const std::string VertexShaderSource ="#version 330 core" 
            "" 
            "layout (location = 0) in vec3 position;" 
            "" 
            "void main()" 
            "{" 
            " gl_Position = vec4(position.x, position.y, position.z, 1.0);" 
            "}"; 

const std::string FragmentShaderSource ="#version 330 core" 
            "" 
            "out vec4 color;" 
            "" 
            "void main()" 
            "{" 
            " color = vec4(1.0f, 1.0f, 1.0f, 1.0f);" 
            "}"; 

und String auf diese Weise ((const char**)&VertexShaderSource) wenn vorbei ist falsch, warum dann der zweite Anruf ganz gut funktioniert?

Antwort

3

Sie haben vertexShader und fragmentShader auf das Ergebnis der glCreateShader zu setzen, anstatt sie auf 0 und 1 zu.

GLuint vertexShader; 
GLuint fragmentShader; 
vertexShader = glCreateShader(GL_VERTEX_SHADER); 
std::cout <<"b " << glGetError() <<std::endl; 
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
std::cout <<"c " << glGetError() <<std::endl; 

Die Funktion glCreateShader kehrt 0 wenn es der Anruf nicht erfolgreich.

In Ihrem Code setzen Sie vertexShader hartcodiert auf 0 und opengl meldet einen Fehler für weil Sie 0 wie id zu glShaderSource passieren.

Die 1281 ist ein GL_INVALID_VALUE Fehler und if shader is not a value generated by OpenGL.glShaderSource: Errors

Daneben berichtet Sie (const char**)&VertexShaderSource falsch ist die Speicheradresse zu erhalten, wo ein std::string speichert die Daten, die Sie verwenden .c_str(): How to pass an std::string to glShaderSource?

0

Sie übergeben die Zeichenfolge falsch, der richtige Weg ist VertexShaderSource.c_str().