So I decided to try some OGL3 stuff in D utilizing the Derelict bindings and SDL. Creating an SDL-OGL window worked fine, but I'm having trouble with doing the most basic thing of rendering a triangle. I get the window just fine and the screen is being properly cleared and buffered, but no triangle.

Code:

GLuint initVAO () {

                // An array of 3 vectors which represents 3 vertices
        static const GLfloat g_vertex_buffer_data[] = [
          -1.0f, -1.0f, 0.0f,
           1.0f, -1.0f, 0.0f,
           0.0f, 1.0f, 0.0f,
        ];

        // This will identify our vertex buffer
        GLuint vertexbuffer;

// Generate 1 buffer, put the resulting identifier in vertexbuffer
        glGenBuffers(1, &vertexbuffer);

// The following commands will talk about our 'vertexbuffer' buffer
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);

        // Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, g_vertex_buffer_data.length * GL_FLOAT.sizeof, g_vertex_buffer_data.ptr, GL_STATIC_DRAW);

        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,  null);              
        
        glBindBuffer(GL_ARRAY_BUFFER, 0);
                
        return vertexbuffer;
}

void main() {

        string title = "Hello, world! With SDL2 OpenGL3.3!";
        writefln(title);

        // Create a new OGL Window
        Window win = new SDL_OGL_Window(title);

        GLuint vertexbuffer = initVAO();

        // Main loop flag
        bool quit = false;

        //Event handler
        SDL_Event e;

        glClearColor(0,0,0.4,0);

        do {
                
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                glBindVertexArray(vertexbuffer);

                // Draw the triangle
                glDrawArrays(GL_TRIANGLES, 0, 3);

                glDisableVertexAttribArray(vertexbuffer);
                glBindVertexArray(0);
                
                SDL_GL_SwapWindow(win.window);

                // Handle events on queue
                while( SDL_PollEvent( &e ) != 0 ) {
                        //User requests quit
                        if( e.type == SDL_QUIT ) {
                                quit = true;
                        }
                }

                const Uint8* currentKeyStates = SDL_GetKeyboardState( null );

                // Escape to quit as well.
                if( currentKeyStates[ SDL_SCANCODE_ESCAPE ] ) {
                        quit = true;;
                }

        } while ( !quit );

        glDeleteBuffers(1, &vertexbuffer);

}

The SDL_OGL_Window is an object that creates an SDL window and binds a OpenGL context to it; I don't think it's relevant for what's going on, but if anyone thinks it might be the culprit, I'll post it.

So, any ideas what I'm doing wrong?

Reply via email to