美文网首页
OpenGL Application: Hello word

OpenGL Application: Hello word

作者: QiHangkong | 来源:发表于2020-02-26 16:15 被阅读0次

The OpenGL shader demo:

// file demo.c
#include <GL/glut.h>

char *vstr = "#version 330 core\n"
             "layout(location=0) in vec4 vPosition;\n"
             "void main()\n"
             "{\n"
             "    gl_Position = vPosition;\n"
             "}\n";
char *fstr = "#version 330 core\n"
             "out vec4 fColor;\n"
             "void main()\n"
             "{\n"
             "    fColor = vec4(0.0, 0.0, 1.0, 1.0);\n"
             "}\n";

GLuint LoadShaders(GLenum type, char *str)
{
    GLuint shader = glCreateShader(type);
    printf("%s\n", str);
    glShaderSource( shader, 1, &str, NULL );
    glCompileShader( shader );

    GLint compiled;
    glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
    if ( !compiled ) {
        GLsizei len;
        glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &len );
        GLchar* log = malloc(len + 1);
        glGetShaderInfoLog( shader, len, &len, log );
        printf("Shader compilation failed: %s\n", log);
    free(log);
        return 0;
    }

    return shader;
}

void init(void)
{
    int vao;
    int buffer;
    int vPosition;

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    

    GLfloat vertices[6][2] = {
        { -0.90, -0.90 },   // Triangle 1
        {  0.85, -0.90 },
        { -0.90,  0.85 },
        {  0.90, -0.85 },   // Triangle 2
        {  0.90,  0.90 },
        { -0.85,  0.90 }
    };

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

    GLuint program = glCreateProgram();
    if (program == 0) {
        printf("Error to create program\n");
        return ;
    } 

    GLuint shader;
    shader = LoadShaders(GL_VERTEX_SHADER, vstr);
    glAttachShader(program, shader);
    shader = LoadShaders(GL_FRAGMENT_SHADER, fstr);
    glAttachShader(program, shader);

    glLinkProgram(program);
    glUseProgram(program);

    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(vPosition);
}

void display(void)
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0, 12);
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_ALPHA);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Simple");

    init();
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

Compiler with:

gcc demo.c -lGL -lglut

Then run a.out show as:


OpenGL Demo

相关文章

网友评论

      本文标题:OpenGL Application: Hello word

      本文链接:https://www.haomeiwen.com/subject/hzdbchtx.html