美文网首页
OpenGL编程指南01概述

OpenGL编程指南01概述

作者: rasishou | 来源:发表于2019-04-25 12:38 被阅读0次

    C++源程序

    #include<GL/gl3w.h>//与下面的glfw3.h的顺序不能交换
    #include <GLFW/glfw3.h>
    #include <iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    const GLchar*ReadShader(const char*filename) {
        ifstream t;
        int length;
        t.open(filename);
        t.seekg(0,ios::end);
        length = t.tellg();
        
        t.seekg(0,ios::beg);
        GLchar*buffer = new GLchar[length+1];
        memset(buffer,0x0,length+1);
        t.read(buffer,length);
        t.close();
        return const_cast<GLchar*>(buffer);
    }
    int main() {
        glfwInit();
        GLFWwindow*window = glfwCreateWindow(640,480,"triangles",nullptr,nullptr);
        glfwMakeContextCurrent(window);
        gl3wInit();
        //program and shader
        GLuint program = glCreateProgram();
    
        GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER);
        const GLchar*vert_shader_source = ReadShader("triangle.vert");
        glShaderSource(vert_shader,1,&vert_shader_source,nullptr);
        delete[] vert_shader_source;
        glCompileShader(vert_shader);
        glAttachShader(program,vert_shader);
    
        GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
        const GLchar*frag_shader_source = ReadShader("triangle.frag");
        
        glShaderSource(frag_shader, 1, &frag_shader_source, nullptr);
        delete[] frag_shader_source;
        glCompileShader(frag_shader);
        glAttachShader(program,frag_shader);
    
        glLinkProgram(program);
        glUseProgram(program);
        //buffer and vertex
        static const GLfloat vertices[3][2] = {
            {-0.50,-0.90},
            {0.85,-0.90},
            {-0.90,0.85}
        };
    
        GLuint Buffer;
        glCreateBuffers(1, &Buffer);
        glNamedBufferStorage(Buffer, sizeof(vertices), vertices, 0);
        glBindBuffer(GL_ARRAY_BUFFER, Buffer);
    
        GLuint vao;
        glCreateVertexArrays(1,&vao);
        glBindVertexArray(vao);
        glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
        glEnableVertexAttribArray(0);
    
        while (!glfwWindowShouldClose(window)) {
            static const float black[] = {0.0f,0.0f,0.0f,0.0f};
            glClearBufferfv(GL_COLOR,0,black);
            glBindVertexArray(vao);
            glDrawArrays(GL_TRIANGLES,0,3);
    
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
        glfwDestroyWindow(window);
        glfwTerminate();
        return 0;
    }
    

    顶点着色器triangle.vert:

    #version 450 core
    layout (location=0) in vec4 vPosition;
    void main(){
        gl_Position=vPosition;
    }
    

    片段着色器triangle.frag:

    #version 450 core
    out vec4 fColor;
    void main(){
        fColor=vec4(0.5,0.4,0.8,1.0);
    }
    

    总结:
    1.gl3w.h在前,glw3.h在后,不然会报错
    2.内存要清零
    3.gl_FragColor和fColor等效
    4.需要ReadShader()函数将着色器从文件中读到内存

    相关文章

      网友评论

          本文标题:OpenGL编程指南01概述

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