Visual LabINTERACTIVE LEARNING
OpenGL 与 3D第 1 / 6 章

OpenGL 与基础渲染管线

认识状态机、缓冲、顶点输入与从图元到片段的基础流程。

OpenGLGLSL渲染管线
进阶预计 62 分钟查看源文 ↗

OpenGL简介

核心概念

图形渲染管线 Graphics Pipeline

  • 顶点数组对象 VAO(vertex Array Object) 记录VBO和EBO组合
  • 顶点缓冲对象 VBO (vertex Buffer Object) 记录的是顶点信息
  • 元素缓冲对象 EBO (Eelement Buffer Object) / 索引缓冲对象 IBO (Index Buffer Object) 记录的是 顶点的绘制顺序信息

🚅 提示

简单理解: 顶点数组对象会记录顶点缓冲对象以及元素缓冲对象的绑定,解绑等操作,所以先绑定一个VAO,然后再去绑定VBO和EBO等操作,在绘制的时候,只需要换绑不同的VAO,即可绘制不同的顶点(图形)

概念:指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程

图形渲染管线接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出

opengl的大部分工作是把3D坐标转换成2D像素。3D坐标转换成2D坐标的处理过程使用oopengl的图形渲染管线管理的,图形渲染管线可以划分为2个过程。第一部分把3D坐标转换成2D坐标,第2部分是把2D坐标转变为实际的有颜色的屏幕像素。

gpu能并发执行,所以运算效率高

图形渲染管线可以划分为多个阶段,每一个阶段会把前一个阶段的输出作为输入。每个阶段会有一个特定功能的程序来处理,这个程序称为着色器

可自定义的着色器:

  • 顶点着色器 vertex shader 3D坐标空间变换的作用,输出的是投影空间3D坐标
#必须把位置数据赋值给预定义的gl_Position变量,它在幕后是vec4类型的
#version 330 core
layout (location = 0) in vec3 aPos;

void main(){
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
  • 几何着色器 geometry shader 很少修改 ,使用默认值即可
  • 片段着色器(片元) fragment shader 2D坐标融合颜色的过程,效果产生的地方,片段着色器中的坐标是 屏幕空间坐标
# 片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,
# 我们应该自己将其计算出来。声明输出变量可以使用out关键字,这里我们命名为FragColor
#version 330 core
out vec4 FragColor;

void main(){
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
} 
小结

📍 提示

总结一下: 顶点着色器输入后会转换 成投影空间坐标传递给几何着色器,几何着色器会根据类型补充一些顶点,输出到图元装配阶段,图元装配后输出一些形状,然后传入光栅化阶段,映射为最终屏幕像素数据!!以及片段着色器所需要的数据,并且经过裁切后(视野外的会被抛弃,提高效率),传递给片段着色器,计算最终颜色(高级效果,光照、阴影等),然后进入混合阶段,和alpha测试阶段(深度,是否需要丢弃,透明度等),最终输出一个屏幕像素的颜色,显示到屏幕上

  • 标准化设备坐标:Normalized Device Coordinates)NDC 在(-1,1)之间的坐标,经过顶点着色器处理后的坐标,都应该是DNC (按照投影参数来标准化)

飞书画板