初稿
本笔记是本人阅读《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<vgl.h>
#include<LoadShaders.h>
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编程指南 第八版》最
网友评论