OpenGL - Kein Output



  • Folgender Quelltext erzegut mir wider Erwarten.. naja eher Erhoffens kein Viereck auf dem Bildschirm..

    ////////////////////////////////////////////////////////////
    // Headers
    ////////////////////////////////////////////////////////////
    #include <iostream>
    #include <stdio.h>
    
    #include <SFML/Window.hpp>
    #include <SFML/OpenGL.hpp>
    
    ////////////////////////////////////////////////////////////
    /// Entry point of application
    ///
    /// \return Application exit code
    ///
    ////////////////////////////////////////////////////////////
    /// Globals
    
    GLuint			g_shVert;
    GLuint			g_shFrag;
    GLuint			g_shProg;
    GLuint			g_vao;
    GLuint			g_vbo;
    
    ////////////////////////////////////////////////////////////
    int main()
    {
        // Create the main window
        sf::ContextSettings settings;
        settings.MajorVersion = 3;
        settings.MinorVersion = 2;
    
        sf::Window App(sf::VideoMode(800, 600, 32), "SFML OpenGL",sf::Style::Default, settings);
    
        glClearColor(.0f, .0f, .0f, 1.0f);
    	glClearDepth(1.0f);
    
    	glViewport(0, 0, 800, 600);
    
        while (App.IsOpened())
        {
            // Process events
            sf::Event Event;
            while (App.GetEvent(Event))
            {
                // Close window : exit
                if (Event.Type == sf::Event::Closed)
                    App.Close();
    
                // Escape key : exit
                if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                    App.Close();
    
                // Resize event : adjust viewport
                if (Event.Type == sf::Event::Resized)
                    glViewport(0, 0, Event.Size.Width, Event.Size.Height);
            }
    
            App.SetActive();
    
            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
            std::cout << "drawing" << std::endl;
    
            App.Display();
        }
    
        glDeleteBuffers(1, &g_vbo);
    	glDeleteVertexArrays(1, &g_vao);
    
        return EXIT_SUCCESS;
    }
    
    void create_shaders()
    {
    	char shErr[1024];
    	int errlen;
    	GLint res;
    
    	const char* vert_src =
    		"#version 150 core\n"
    		"in vec2 in_Position;\n"
    		"\n"
    		"void main(){\n"
    		"	gl_Position = vec4(in_Position, .0, 1.0);\n"
    		"};";
    	const char* frag_src =
    		"#version 150 core\n"
    		"out vec4 frag_Color;\n"
    		"\n"
    		"void main(){\n"
    		"	frag_Color = vec4(1.0, .0, .0, 1.0);\n"
    		"};";
    
    	// Generate some IDs for our shader programs
    	g_shVert = glCreateShader(GL_VERTEX_SHADER);
    	g_shFrag = glCreateShader(GL_FRAGMENT_SHADER);
    	g_shProg = glCreateProgram();
    
    	// Assign our above shader source code to these IDs
    	glShaderSource(g_shVert, 1, &vert_src, NULL);
    	glShaderSource(g_shFrag, 1, &frag_src, NULL);
    
    	// Attempt to compile the source code
    	glCompileShader(g_shVert);
    	glCompileShader(g_shFrag);
    
    	// check if compilation was successful
    	glGetShaderiv(g_shVert, GL_COMPILE_STATUS, &res);
    	if (GL_FALSE == res){
    		fprintf(stderr, "Failed to compile vertex shader\n");
    		glGetShaderInfoLog(g_shVert, 1024, &errlen, shErr);
    		printf("%s\n", shErr);
    		return;
    	}
    	glGetShaderiv(g_shFrag, GL_COMPILE_STATUS, &res);
    	if (GL_FALSE == res){
    		fprintf(stderr, "Failed to compile fragment shader\n");
    		glGetShaderInfoLog(g_shFrag, 1024, &errlen, shErr);
    		printf("%s\n", shErr);
    		return;
    	}
    
    	// Attach these shaders to the shader program
    	glAttachShader(g_shProg, g_shVert);
    	glAttachShader(g_shProg, g_shFrag);
    	// flag the shaders to be deleted when the shader program is deleted
    	glDeleteShader(g_shVert);
    	glDeleteShader(g_shFrag);
    
    	// Link the shaders
    	glLinkProgram(g_shProg);
    	glGetProgramiv(g_shProg, GL_LINK_STATUS, &res);
    	if (GL_FALSE == res)
    		fprintf(stderr, "Failed to link shader program\n");
    
    	glUseProgram(g_shProg);
    }
    
    void create_vao()
    {
    	// Create our static triangle strip of 2 triangles = 4 vertices
    	const float quad[8] = {
    		-.5f,  .5f,
    		-.5f, -.5f,
    		 .5f,  .5f,
    		 .5f, -.5f
    	};
    
    	// Generate ID for VAO, and bind it as the active VAO
    	glGenVertexArrays(1, &g_vao);
    	glBindVertexArray(g_vao);
    
    	// Generate a VBO to store our vertex list
    	glGenBuffers(1, &g_vbo);
    	glBindBuffer(GL_ARRAY_BUFFER, g_vbo);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(float)*8, quad, GL_STATIC_DRAW);
    	glVertexAttribPointer((GLuint)0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    	glEnableVertexAttribArray(0);
    }
    

    Das ganze ist mit Hilfe eines Beispielcodes entstanden.

    Gleich dazu noch eine Frage:
    Brauche ich im Core-Modus kein glClear mehr?
    Das wird nämlich im Beispiel nicht verwendet



  • Ich muss natürlich noch die Prototypen schreiben und die Funktionen create_* in der main ausführen ...



  • Ich gehe davon aus dass du natürlich die Returnwerte sämtlicher OpenGL calls geprüft hast und glGetError() still ist. Unter dieser Annahme hab ich deinen Code mal überflogen und auf den ersten Blick vermisse ich ein

    glEnableClientState(GL_VERTEX_ARRAY);
    


  • Doch, natürlich wird glClear weiterhin verwendet.

    Wo wird denn create_shaders und create_vao aufgerufen?



  • Jo hab vergessen die beiden Funktionen aufzurufen

    glEnableClientState ist nicht nötig. Nach Aufrufen der Funktioen klappt alles wie gewollt bisher.

    Clear wird auch benötigt, das habe ich dann anhand von resize feststellen können.

    So : Wie mach ich jetzt etwas wie glTranslate?

    Wird das jetzt im VertexShader gemacht?



  • newto schrieb:

    So : Wie mach ich jetzt etwas wie glTranslate?

    Wird das jetzt im VertexShader gemacht?

    Natürlich.


Anmelden zum Antworten