美文网首页
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