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.