一.渲染的基础对象概念
1.顶点数组对象(VAO Vertex Array Object)
2.顶点缓冲对象(VBO Vertex Buffer Object)
3.索引缓冲对象(IBO Index Buffer Object)
4.图形渲染管线(Graphics Pipeline)图形渲染管线接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出
5.着色器(Shader 在显卡的小处理核心上各自运行的小程序,在图形渲染管线中快速处理你的数据 OpenGL使用的着色器语言为GLSL (OpenGL Shading Language))
二.渲染管线阶段
1.顶点数据传入
2.顶点着色器 Vertex Shader:可自定义着色器
顶点着色器主要的目的是把3D坐标(标准化设备坐标)转为另一种3D坐标(屏幕空间坐标),同时顶点着色器允许我们对顶点属性进行一些基本处理通过顶点缓冲对象(VBO)管理顶点可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象
unsigned int VBO;
glGenBuffers(1, &VBO);
顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER
可以使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上
glBindBuffer(GL_ARRAY_BUFFER, VBO);
在绑定后,使用任何(在GL_ARRAY_BUFFER目标上的)缓冲调用都会用来配置当前绑定的缓冲(VBO)。然后我们可以调用glBufferData函数,它会把之前定义的顶点数据复制到缓冲的内存中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
第一个参数是目标缓冲的类型:顶点缓冲对象当前绑定到GL_ARRAY_BUFFER目标上。第二个参数指定传输数据的大小(以字节为单位);用一个简单的sizeof计算出顶点数据大小就行。第三个参数是我们希望发送的实际数据。
第四个参数指定了我们希望显卡如何管理给定的数据
GL_STATIC_DRAW :数据不会或几乎不会改变。
GL_DYNAMIC_DRAW:数据会被改变很多。
GL_STREAM_DRAW :数据每次绘制时都会改变。
3.形状装配 Shape Assembly
顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状
4.几何着色器 Geometry Shader:可自定义着色器
可自定义着色器
把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状
5.光栅化 Rasterization
把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率
一个片段是OpenGL渲染一个像素所需的所有数据
6.片段着色器 Fragment Shader:可自定义着色器
计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色
7.测试与混合 Test and Blending
检测片段的对应的深度(和模板(Stencil))值,用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)
对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了
三.数据输入
3.1顶点输入
只有在标准化设备坐标内的坐标才会处理[-1.0,1.0]
原文地址:https://www.cnblogs.com/davidcat/p/12202560.html