OpenGL编程指南01概述

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()函数将着色器从文件中读到内存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,727评论 0 3
  • 图元处理(Primitive Processing) 如何在场景中使用曲面细分来添加几何细节 如何使用几何着色器处...
    RichardJieChen阅读 6,987评论 2 4
  • 几何着色器 首先用一张图来回顾一下渲染管线的各个阶段,目前为止我们接触的着色器有顶点着色器和像素着色器,而接触到的...
    久伴必知情深阅读 889评论 0 1
  • 昨天没睡好,今天早上起来读写超越感觉就感觉很难读进去,想往床上躺,结果睡了一觉起来后就完成了今天超越感觉的阅读。睡...
    亲爱的吴小仙阅读 259评论 0 0
  • 羁鸟恋旧林,池鱼思故渊。我这刚从笼中放飞的鸟,怎么能够安心复学呢!于是休学一年,给自己放一年的假。叫上汪伦和农山,...
    木下亦佛阅读 1,008评论 3 10