好几天没写总结了,主要是一开始就看到OpenGL一堆的函数,还有一堆的预定义常量,还有好多概念流程,很懵逼,没有总体的概念流程,不知道如何下手。这几天看的有些头绪了,总结一下。
1.OpenGL理解
1.OpenGL是一个标准,也就是只规定了函数的输入和输出,没有具体的实现,具体的实现应该是各显卡硬件公司实现的。因此就会看到好多第三方库GLUT,GLFW,GLEW,GL3W…,刚入门对这些库也很蒙,不知道该选哪个。GLUT和GLFW差不多,都是画窗口的(还有其他功能),但是GLUT很久没更新了。GLEW,GL3W和GLAD差不多,应该是提供接口地址的,听说GLAD更新一点?我最后用了GLFW和GLAD;
2.OpenGL其实是一个“状态机”。开始的时候对“状态机”如何体现在OpenGL上很迷惑。之后似乎慢慢明白了。“状态机”就是时刻监视“状态”,如果“状态”改变,之后的绘图也会发生改变。例如,如果你窗口的底色的状态改变了,在下一次绘图的时候,窗口底色就会改变。OpenGL有很多“状态”(具体有哪些,这个以后理解了再写)
3.还看到OpenGL是一种“客户端和服务端”工作模式,具体还不太明白。
2.OpenGL的专业词汇
- 渲染管线:把一个3维图形的坐标转变为2维图像的流程。
- 着色器:给图形上色的程序,运行在GPU上,有自己的语言。
- 顶点缓冲对象(Vertex Buffer Object): 一个调用显存并存储所有顶点数据供显卡使用的缓冲对象。
顶点数组对象(Vertex Array Object): 存储缓冲区和顶点属性状态。
索引缓冲对象(Element Buffer Object): 一个存储索引供索引化绘制使用的缓冲对象。 - 纹理:就是给图形表面的纹理,看起来更好看更真实一点。
3.OpenGL基本绘图流程
具体参考 https://learnopengl-cn.github.io/ 这个学习网站。
下图是我自己这几天总结的流程图,只是入门的内容,更深一步的以后再加入。
下面是对上面那个网站中的一个例子进行简单分析:(汉字注释)。基本是按照上图把程序分开的,至于某些模块的顺序,目前还不是很确定。先整体搞清程序,然后再逐个突破。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stb_image.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <learnopengl/shader_m.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDT