OpenGl学习笔记-入门
这学期有计算机图形学这门课,opengl的学习过程感觉比较困难,写一些博客分享,也作备忘。
学习环境
OpenGL 3.3+
GLEW+GLFW+ImGUI(imgui的环境配置很坑)
学习网站:https://learnopengl-cn.readthedocs.io/zh/latest/
OpenGL的hello world—绘制三角形
三角形是最基础的封闭图形,绘制一个三角形可以说是OpenGL最好的入门程序。
方法思路:
首先如果完全不了解OpenGL,让我们去绘制一个三角形,一般人理解的过程会是什么?
1.输入三个顶点,然后通过一些函数,画出一个三角形。
2.给三角形填充颜色
其中对第一步我们想的更细一点可以是:将3个顶点两两连线,成为一个封闭的三角形线框。
如何在OpenGL中实现
坐标体系:
OpenGL将图像呈现在屏幕上的坐标系统用的是:
标准化设备坐标(Normalized Device Coordinates, NDC)
标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。下面你会看到我们定义的在标准化设备坐标中的三角形(忽略z轴):
与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。最终你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。
我们可以给出下面这样一个顶点坐标变量(GLfloat是OpenGl内定义的变量类型,参考float)
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
顶点输入
有了顶点数据后我们需要做的是将顶点输入给电脑,这里当然不能说直接就传递一个数组变量给电脑,这种做法不够体系化。
OpenGl的做法:VAO,VBO
(VAO和VBO是OpenGl3.3版本以上使用的,之前版本有使用glBegin 等函数 这里不做介绍)
VAO(Vertex Array Object)
VAO可以看作是一个管理定点属性用的对象,注意:这里说的是顶点属性,而不是顶点。在图像绘制中一个顶点具有的属性除了坐标以外,还有如同颜色等属性。VAO存储了顶点数据的格式以及顶点数据数据所需的缓存对象的引用。
VBO(Vertex Buffer Object)
VBO是一种Buffer Object,即它也是一个OpenGl对象。VBO是顶点数组数据真正所在的地方。
那么可能有人会迷惑,VAO和VBO的区别是什么,他们不都是用来存放点的数据的吗?
可以这么说:VAO是一个包含所有点的对象,VBO从这个VAO里拿出一些或者全部点,被发送到GPU上以供使用。
说这么多,我们来看看具体用代码如何将上面我们的vertex点集放入到VAO和VBO中:
GLuint VBO, VAO;
glGenVertexArrays(1, &VAO); //创建VAO的函数,这里的1代表数量
glGenBuffers(1, &VBO); //创建VBO的函数
glBindVertexArray(VAO);//要想使用VAO,先绑定
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定缓冲,这里GL_ARRAY_BUFFER是顶点传冲类型
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//把之前定义的顶点数据复制到缓冲的内存中
//设置顶点属性指针