《OpenGL编程指南 第八版》读书笔记

初稿
本笔记是本人阅读《OpenGL编程指南 第八版》所写,旨在帮助自己学习和巩固OpenGL相关知识,同时也希望对初学这本书的人能够提供方便。
我是OpenGL的小白,对OpenGL从来没有进行过研究,我只能在自我理解的基础上,尽量用通俗易懂的话去解释OpenGL。

如何去阅读这本书?
很多拿到有关OpenGL书籍的同学,以为OpenGL就像Java语言一样,找个IDE,按照书上的代码一步一步敲就行,然而,往往会发现很多问题:环境该如何配置,书上怎么只字未提?为什么这本书和那本书写的内容不一样?

要想解释这些问题,首先我们应该了解OpenGL这个图形库。OpenGL是一种API,它不依托于具体系统,具体硬件(这一点类似与JAVA),其次它是一个三维图形库(二维图形也行),它不能像Java语言一样,能够在控制台打印“Hello Word”,而是需要一个窗口进行显示。但OpenGL非常“专一”,它并不会为编程人员提供任何创建窗口以及处理用户输入的函数。而glut,glew,glfw,mesa这些库便是简化这些操作的,不同的工具库,有不同的创建窗口和处理时间的方式,所以,市面上的OpenGL书籍中,存在各式各样的代码,但是,请记住,这些库只是为了方便OpenGL的,它们并不是OpenGL的一部分。
所以,环境配置方面建议:如果书籍上说的库能正常使用就使用,不能的话,看看能不能自己用源码进行编译,实在不行,就换别的库,请不要在一棵树上吊死,这些库基本上大同小异,我们的重点应该是OpenGL。

由于本人买的第八版(目前最新为第9版),官网已经找不到对应的源代码和资源文件。如果可能,尽量请购买第九版,一是最新版会有新特性,二是
什么是OpenGL?
通俗的来讲,就是三维图形库(反正意思差不多),它向编程人员提供统一方便的编程接口,屏蔽不同图形硬件带来的差异。它可以通过软件和硬件进行实现。

#include
#include

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

void
init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);

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

    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferStorage(GL_ARRAY_BUFFER, sizeof(vertices), vertices, NULL);

    ShaderInfo shaders[] = {
        { GL_VERTEX_SHADER,"D:/OpenGL/bin/media/shaders/triangles/triangles.vert" },
        { GL_FRAGMENT_SHADER,"D:/OpenGL/bin/media/shaders/triangles/triangles.frag" },
        { GL_NONE,NULL }
    };

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

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

void display(void)
{
    static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };

    glClearBufferfv(GL_COLOR, 0, black);
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);
}

int
main(int argc, char** argv)
{
    glfwInit();

    GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);

    glfwMakeContextCurrent(window);
    gl3wInit();

    init();

    while (!glfwWindowShouldClose(window))
    {
        display();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);

    glfwTerminate();
}

首先,阅读《OpenGL编程指南 第八版》最

你可能感兴趣的:(《OpenGL编程指南 第八版》读书笔记)