Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Buy a domain name - Register cheap domain names from $0.99 - Namecheap

Scalable Hosting That Grows With You

Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Semrush - keyword research tool

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

39,885 questions

51,811 answers

573 users

How to draw triangle using OpenGL in C

1 Answer

0 votes
#include <GL/glew.h>
#include <glfw3.h>

#include <stdio.h>
#include <string.h>

const GLint WIDTH = 800, HEIGHT = 600;

GLuint VAO, VBO, shader;

static const char* vertexShader =
"#version 460\n"
"layout(location = 0) in vec3 pos;"
"void main()"
"{"
"gl_Position = vec4(pos.x, pos.y, pos.z, 1.0);"
"}";

static const char* fragmentShader =
"#version 460\n"
"out vec4 FragmentColor;"
"void main()"
"{"
"   FragmentColor = vec4(0.0, 1.0, 0.0, 1.0);"
"}";

void CreateTriangle() {
    GLfloat vertices[] = {
        0.0f, 0.5, 0.0f,
        0.5f, -0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f
    };

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
}

void AddShader(GLuint program, const char* shaderCode, GLenum shaderType) {
    unsigned int ShaderID = glCreateShader(shaderType);

    const char* theCode = shaderCode;

    const int codeLength = (int)strlen(shaderCode);

    glShaderSource(ShaderID, 1, &theCode, &codeLength);
    glCompileShader(ShaderID);

    int result = 0;
    char error[1024] = { 0 };

    glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &result);
    if (!result) {
        glGetShaderInfoLog(ShaderID, sizeof(error), NULL, error);
        printf("Error compiling the %d shader: %s", shaderType, error);
        return;
    }

    glAttachShader(program, ShaderID);
}

void CompileShaders() {
    shader = glCreateProgram();

    if (!shader) {
        printf("glCreateProgram() Error");
        return;
    }

    AddShader(shader, vertexShader, GL_VERTEX_SHADER);
    AddShader(shader, fragmentShader, GL_FRAGMENT_SHADER);

    GLint result = 0;
    GLchar error[1024] = { 0 };

    glLinkProgram(shader);

    glGetProgramiv(shader, GL_LINK_STATUS, &result);
    if (!result) {
        glGetProgramInfoLog(shader, sizeof(error), NULL, error);
        printf("glLinkProgram() Error: %s", error);
        return;
    }
}

int main(void)
{
    if (!glfwInit()) {
        printf("glfwInit() Error");
        return 1;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);

    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "window title", NULL, NULL);
    if (!window) {
        printf("glfwCreateWindow() Error");
        glfwTerminate();
        return 1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;

    if (glewInit() != GLEW_OK) {
        printf("glewInit() Error");
        glfwDestroyWindow(window);
        glfwTerminate();
    }

    CreateTriangle();
    CompileShaders();

    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();

        glClearColor(1.0f, 0.5f, 0.25f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shader);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
    }

    glfwDestroyWindow(window);
    glfwTerminate();

    return 0;
}




/*
run:


*/

 



answered Mar 19, 2022 by avibootz
edited Sep 8, 2023 by avibootz
...