OpenGL Black Screen



  • Hallo an alle,

    ich bin noch ziemlich am Anfang der OpenGL Programmierung und habe ein kleines Problem.
    Mit Hilfe eines Tutorials versuche ich mit Shadern ein Dreieck anzeigen lassen.
    Ich bekomme aber nur ein Black Screen wenn ich es ausführe.
    Bei zwei Kollegen funktioniert aber mein Code und das Dreieck wird dar gestellt.
    Kann mir jemand helfen und sagen, woran es liegen könnte?

    Ich nutze VS 2015
    meine Grafikkarte AMD Radeon (TM) R7 M360 unterstützt OpenGL 4.5

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <GL\glew.h>
    #include <GL\freeglut.h>
    #include <GL\glut.h>
    #include <glm\glm.hpp>
    #include <glm\gtc\matrix_transform.hpp>
    #include <stdlib.h>
    #include <stdio.h>
    #include <fstream>
    #include <iostream>
    #include <math.h>
    #include <vector>
    
    using namespace glm;
    using namespace std;
    
    #define BUFFER_OFFSET(i) ((char*)NULL +(i))
    GLuint shaderProgrammID;
    GLuint vertexShaderID;
    GLuint fragmentShaderID;
    GLuint vao = 0;
    GLuint vbo;
    GLuint positionID, colorID;
    
    #pragma region Shader_Functions
    static char* readfile(const char *filename)
    {
    FILE *fp = fopen(filename, "r");
    fseek(fp, 0, SEEK_END);
    long file_length = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* contents = new char[file_length + 1];
    
    for (int i = 0; i < file_length + 1; i++)
    {
    contents[i] = 0;
    }
    
    fread(contents, 1, file_length, fp);
    contents[file_length + 1] = '\0';
    fclose(fp);
    return contents;
    }
    
    GLuint makeVertexShader(const char* shaderSource)
    {
    GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(vertexShaderID);
    //query status
    /*int query;
    glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &query);
    if (!CheckQuery(query, vertexShaderID, std::string("Vertex Shader")));*/
    return vertexShaderID;
    }
    
    GLuint makeFragmentShader(const char* shaderSource)
    {
    GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(fragmentShaderID);
    return fragmentShaderID;
    }
    
    GLuint makeShaderProgram(GLuint vertexShaderID, GLuint fragmentShaderID)
    {
    GLuint shaderID = glCreateProgram();
    glAttachShader(shaderID, vertexShaderID);
    glAttachShader(shaderID, fragmentShaderID);
    glLinkProgram(shaderID);
    return shaderID;
    }
    #pragma endregion Shader_Functions
    
    void changeViewport(int w, int h)
    {
    glViewport(0, 0, w, h);
    }
    
    void render()
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glTranslatef(0, 0, -2);
    glUseProgram(shaderProgrammID);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glutSwapBuffers();
    }
    
    int main(int argc, char** argv)
    {
    	// init GLUT and create Window
    	glutInit(&argc, argv);
    
    	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);		//Eigenschaften des Fensters
    	glutInitWindowPosition(100, 100);								//Position des Ausgabefensters auf dem Monitor
    	glutInitWindowSize(640, 480);									//Größe des Ausgabefensters
    	glutCreateWindow("Aufgabe 3 OpenGL Severin Kraft");
    
    	glutDisplayFunc(render);
    	glutReshapeFunc(changeViewport);
    	glewInit();
    
    	// get version info
    	const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
    	const GLubyte* version = glGetString(GL_VERSION); // version as a string
    	printf("Renderer: %s\n", renderer);
    	printf("OpenGL version supported %s\n", version);
    	//glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    
    	// Vertices festlegen
    	GLfloat vertices[] = { -0.5f, -0.5f, 0.0f,
    	0.5f, -0.5f, 0.0f,
    	0.0f, 0.5f, 0.0f };
    
    	// Farbe festlegen
    	GLfloat colors[] = { 1.0f, 0.0f, 0.0f, 1.0f,
    	0.0f, 1.0f, 0.0f, 1.0f,
    	0.0f, 0.0f, 1.0f, 1.0f };
    
    	//Erstellen des Shaders
    	const char* vertexShaderSourceCode = readfile("vertexShader.glsl");
    	printf("vertexShader\n");
    	const char* fragmentShaderSourceCode = readfile("fragmentShader.glsl");
    	printf("fragmentShader\n");
    	vertexShaderID = makeVertexShader(vertexShaderSourceCode);
    	fragmentShaderID = makeFragmentShader(fragmentShaderSourceCode);
    	shaderProgrammID = makeShaderProgram(vertexShaderID, fragmentShaderID);
    
    	printf("vertexShaderID ist: %d\n", vertexShaderID);
    	printf("fragmentShaderID ist: %d\n", fragmentShaderID);
    	printf("shaderProgrammID ist: %d\n", shaderProgrammID);
    
    	printf("Shader wurden erstellt\n");
    
    	//glEnable(GL_DEPTH_TEST);
    	//glDepthFunc(GL_LESS);
    
    	glGenVertexArrays(1, &vao);
    	glBindVertexArray(vao);
    
    	glGenBuffers(1, &vbo);
    	glBindBuffer(GL_ARRAY_BUFFER, vbo);
    	glBufferData(GL_ARRAY_BUFFER, 7 * 3 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
    	glBufferSubData(GL_ARRAY_BUFFER, 0, 3 * 3 * sizeof(GLfloat), vertices);
    	glBufferSubData(GL_ARRAY_BUFFER, 3 * 3 * sizeof(GLfloat), 3 * 4 * sizeof(GLfloat), colors);
    
    	positionID = glGetAttribLocation(shaderProgrammID, "s_vPosition");
    	colorID = glGetAttribLocation(shaderProgrammID, "s_vColor");
    
    	glVertexAttribPointer(positionID, 3, GL_FLOAT, GL_FALSE, 0, 0);
    	glVertexAttribPointer(colorID, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(3*3*sizeof(GLfloat)));
    	//glUseProgram(shaderProgrammID);
    	glEnableVertexAttribArray(positionID);
    	glEnableVertexAttribArray(colorID);
    
    	glutMainLoop();
    
    	return 0;
    
    }
    

    VertexShader:

    #version 330
    
    in vec3 s_vPosition;
    in vec4 s_vColor;
    
    out vec4 FragColor;
    
    void main()
    {
    	FragColor = s_vColor;
    	gl_Position = s_vPosition;
    }
    

    FragmentShader:

    #version 330
    
    in vec4 FragColor;
    out vec4 gl_Color;
    
    void main()
    {
    	gl_Color = color;
    }
    

    manchmal bekomme ich auch nach einer weile diese Meldung in der Ausgabe:

    "ANOMALY: meaningless REX prefix used"



  • Den Rechtschreibfehler im FragmentShader habe ich behoben:

    gl_Color = color;
    

    zu

    gl_Color = FragColor;
    

    War aber nicht die Lösung für das Problem. 😞



  • Einfach mal mit einem opengl debugger oder glGetError nach jeder anweisung versuchen. Ist dass C oder C++?



  • Sollte ja C sein. Ich probiere deinen Vorschlag mal aus.



  • Nach Zeile 149 & 150 bekomme ich einen Fehler 1282.
    Was bedeutet der?



  • Sven S. schrieb:

    Nach Zeile 149 & 150 bekomme ich einen Fehler 1282.

    Glaub ich net.



  • Ich hab in den Finktionen, wo die Shader erstellt werden abgefragt, aber da kam keine Fehlermeldung. Erst da,wo ich geschriebenen habe, kam eine Fehlermeldung.



  • Sven S. schrieb:

    Was bedeutet der?

    Google ist
    dein Freund



  • GidF schrieb:

    Sven S. schrieb:

    Was bedeutet der?

    Google ist
    dein Freund

    Kluge Antwort, warum braucht man eigentlich noch Foren um Menschen zu fragen, die sich damit auskennen. Frag doch Google, dass weiß alles. Also brauche ich ja hier nicht mehr zu fragen, da man direkt auf Google verwiesen wird. Denn es fuhlen sich einige, in ihren Augen, durch so simple Frage von Anfängern genervt.



  • Sven S. schrieb:

    GidF schrieb:

    Sven S. schrieb:

    Was bedeutet der?

    Google ist
    dein Freund

    Kluge Antwort, warum braucht man eigentlich noch Foren um Menschen zu fragen, die sich damit auskennen. Frag doch Google, dass weiß alles. Also brauche ich ja hier nicht mehr zu fragen, da man direkt auf Google verwiesen wird. Denn es fuhlen sich einige, in ihren Augen, durch so simple Frage von Anfängern genervt.

    Wenn du ein Problem hast, strengst du zuallererst einmal die Suchmaschine deines Vertrauens an. Manchmal kommt man damit zu keinem Ergebnis, dann (und wirklich erst dann) sind Foren die richtige Anlaufstelle. Deine Ausgangsfrage passt z.B. ganz gut in ein Forum. In einem Forum wird aber auch Eigeninitiative erwartet. Niemand hat Lust einem Anderen seine Arbeit zu machen. Die Frage "Was bedeutet der?" lässt aber jegliche Anzeichen von Eigeninitiative vermissen. Wenn du ernsthaft versucht hättest dich mit diesem Problem auseinanderzusetzen wärst du wohl ohne allzuviel Aufwand beim Ergebnis gelandet. Wenn du das nicht schaffst sehe ich schwarz für deine zukünftigen Projekte.
    Ich will aber mal nett sein und dir eine Antwort geben. Der Fehler tritt in einem der drei folgenden Fälle ein:

    GL_INVALID_OPERATION is generated if program is not a value generated by OpenGL.
    GL_INVALID_OPERATION is generated if program is not a program object.
    GL_INVALID_OPERATION is generated if program has not been successfully linked.
    

    Quelle
    Es ist ziemlich eindeutig, dass etwas beim Parameter program, in deinem Fall also shaderProgrammID schiefgelaufen ist. Den Versuch herauszufinden was, überlasse ich erstmal dir 😉



  • 🙂



  • Zum einen, versuche ich schon eine Weile herauszufinden, auch mit Hilfe von Google, warum mein Code bei meinen Kollegen funktioniert und bei mir nicht. Vorallem haben sie ältere Laptops und können max OpenGL 3.3 nutzen. Auch den Fehler 1282 habe ich gegoogelt aber keine eindeutige Antwort bekommen, da es vom Code abhängt. Daher habe ich gehofft, dass ich hier geholfen bekomme, da ich meinen Code hier gepostet habe und habe deswegen vieleicht etwas ruppig reagiert. Aber danke für die Antwort, ich werde mich damit weiter beschäftigen und dann schreiben. 😉



  • Habe es endlich geschafft, nachdem ich noch herausgefunden habe, wie ich den errorLog auslese, kamen zwei kleine Probleme zum Vorschein.
    Es gab sowohl beim vertexShader als auch beim fragmentShader einen Fehler.

    Beim vertexshader muss der input sv_Position vom Typ vec4 sein und nicht vec3.

    alter Code

    #version 330
    
    in vec3 s_vPosition;
    in vec4 s_vColor;
    
    out vec4 FragColor;
    
    void main()
    {
        FragColor = s_vColor;
        gl_Position = s_vPosition;
    }
    

    neuer Code

    #version 330
    
    in vec4 s_vPosition;
    in vec4 s_vColor;
    
    out vec4 FragColor;
    
    void main()
    {
    	FragColor = s_vColor;
    	gl_Position = s_vPosition;
    }
    

    Beim fragmentShader darf man nicht gl_Color schreiben, hier kam die Meldung, dass er den Input gl_Color nicht modifizieren kann, obwohl es der Output ist.

    alter Code

    #version 330
    
    in vec4 FragColor;
    out vec4 gl_Color;
    
    void main()
    {
    	gl_Color = FragColor;
    }
    

    neuer Code

    #version 330
    
    in vec4 FragColor;
    out vec4 Color;
    
    void main()
    {
    	Color = FragColor;
    }
    

Anmelden zum Antworten