学习文章链接
B站讲解链接
顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Vertex Buffer Object,VBO
元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO
3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的
图形渲染管线分为两部分:
1.把3D坐标转化为2D坐标
2.把2D坐标转变为实际有颜色的像素
注意:2D坐标和像素是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕或者窗口分辨率的限制
一个顶点是一个3D坐标的数据的集合
顶点数据是用顶点属性表示的
图元(Primitive):让OpenGL知道我们的坐标和颜色值构成的到底是什么
例如:
GL_POINTS:将数据渲染成一系列的点
GL_TRIANGLES:将数据渲染成一系列的三角形
GL_LINE_STRIP:将数据渲染成一系列的长长的线
图形管线渲染具体拆分:
1.顶点着色器(Vertex Shader):把一个单独的顶点作为输入,将3D坐标转为另一种3D坐标,同时允许我们对顶点属性进行一些基本的处理
2.图元装配(Primitive Assembly):将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并将所有的点装配成指定图元的形状
3.几何着色器(Geometry Shader):把图元形式的一系列顶点的集合作为输入,可以通过产生新顶点构造出新的(或是其它的)图元来生成其它形状
4.光栅化阶段(Rasterization Stage):接收来自几何着色器的输出,会将图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。
(OpenGL中的一个片段是OpenGL渲染一个像素所需的所有数据。)
5.片段着色器(Fragment Shader):主要目的是计算一个像素的最终颜色,通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
6.Alpha测试和混合(Blending)阶段:这个阶段检测片段的对应的深度(和模板(Stencil))值,用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。
对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了。
在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器
标准化设备坐标(Normalized Device Coordinates):3D坐标在3个轴(x,y,z)上-1.0到1.0的范围内的坐标,此范围内的坐标最终显示在屏幕上(在这个范围以外的坐标则不会显示)
// 顶点数组
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
// 创建缓冲对象
unsigned int VBO;
glGenBuffers(1, &VBO);
// 绑定VBO缓对象
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// 填充VBO数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);