On Wednesday, 12 August 2015 at 03:32:47 UTC, DarthCthulhu wrote:
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.

So, any ideas what I'm doing wrong?

For me the following code works:

---
import derelict.sdl2.sdl;
import derelict.opengl3.gl3;
import derelict.opengl3.gl;

import std.stdio;

static this()
{
    DerelictGL3.load;
    DerelictGL.load;
    DerelictSDL2.load;
    SDL_Init(SDL_INIT_VIDEO);
}

static ~this()
{
    SDL_Quit();
    DerelictGL3.unload;
    DerelictSDL2.unload;
}

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[] args)
{

auto flags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
    auto win = SDL_CreateWindow( null, 50, 50, 800, 600, flags);
    auto ctxt = SDL_GL_CreateContext(win);

    DerelictGL3.reload;

    GLuint vertexbuffer = initVAO();

    SDL_Event ev;
    while (true)
    {
        if (SDL_WaitEvent(&ev))
        {
            glClear(GL_COLOR_BUFFER_BIT);

            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(SDL_GL_GetCurrentWindow());
        }
        if (ev.type == SDL_QUIT)
            break;
    }

    SDL_DestroyWindow(win);
    SDL_GL_DeleteContext(ctxt);
}
---

It looks like it's the window/context creation that fail for you because the OpenGL code is 100% the same.

Reply via email to