It's not quite in a practically-usable state yet, but the SDL2 & OpenGL wrapper I'm working on may interest you as an example implementation if nothing else. https://github.com/pineapplemachine/mach.d/tree/master/mach/sdl

I'm going to take a look at this, once I get my bearings, on the merits of the name alone! I'm sure there are a few tutorials that make use of SDL2 that I can use. My hope is that once I know how to set up, learning OpenGL will be more a matter of D-ifying the C-code.

I'll post the modified code I'm trying to get work in full below.
Some code is commented out because I couldn't make it work. Also any tips for making the code nicer would be welcome (e.g. would I change the const GLunit into enums?).

#####

import derelict.glfw3.glfw3;
import derelict.opengl3.gl3;
import std.stdio;

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) {
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

const GLuint WIDTH = 800, HEIGHT = 600;

const GLchar* vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 position;\n"
    "void main()\n"
    "{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
    "}\0";
const GLchar* fragmentShaderSource = "#version 330 core\n"
    "out vec4 color;\n"
    "void main()\n"
    "{\n"
    "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n\0";

void main()
{
    DerelictGLFW3.load();
    DerelictGL3.load();
        
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", null, null);
    glfwMakeContextCurrent(window);
        
    DerelictGL3.reload();

    //glfwSetKeyCallback(window, key_callback);

    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    glViewport(0, 0, width, height);

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, null);
    glCompileShader(vertexShader);
        
    GLint success;
    GLchar[512] infoLog;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success) {
        //glGetShaderInfoLog(vertexShader, 512, null, infoLog);
writeln("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n", infoLog);
    }

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, null);
    glCompileShader(fragmentShader);

    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success) {
        //glGetShaderInfoLog(fragmentShader, 512, null, infoLog);
writeln("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n", infoLog);
    }

    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success) {
        //glGetProgramInfoLog(shaderProgram, 512, null, infoLog);
writeln("ERROR::SHADER::PROGRAM::LINKING_FAILED\n", infoLog);
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    GLfloat[] vertices = [
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    ];
    GLuint VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.sizeof, cast(void*)vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * GLfloat.sizeof, cast(GLvoid*)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindVertexArray(0);
        glfwSwapBuffers(window);
    }

    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();
}
  • Using OpenGL Darren via Digitalmars-d-learn
    • Re: Using OpenGL Mike Parker via Digitalmars-d-learn
      • Re: Using OpenGL Darren via Digitalmars-d-learn
        • Re: Using OpenGL pineapple via Digitalmars-d-learn
          • Re: Using OpenG... Darren via Digitalmars-d-learn
            • Re: Using ... Lodovico Giaretta via Digitalmars-d-learn
              • Re: Us... Darren via Digitalmars-d-learn
                • Re... Lodovico Giaretta via Digitalmars-d-learn
                • Re... Mike Parker via Digitalmars-d-learn
                • Re... Darren via Digitalmars-d-learn
              • Re: Us... Mike Parker via Digitalmars-d-learn
                • Re... Darren via Digitalmars-d-learn
                • Re... Mike Parker via Digitalmars-d-learn
                • Re... Mike Parker via Digitalmars-d-learn
                • Re... Darren via Digitalmars-d-learn

Reply via email to