Learn OpenGL_hello triangle

77 阅读3分钟

Graphics Pipeline && 顶点输入:


Pipeline 即渲染管线,将3D空间中的物体转变为2D图像,映射在屏幕上
将一系列原始图形数据途径输送管线,经过各种变换处理出现在屏幕上。
渲染管线分为两个部分

  • 将3D图形转化为2D图像
  • 将2D图像转化为实际有颜色的像素

屏幕截图 2024-01-18 110235.png

顶点着色器:

把单独的顶点进行输入,将顶点3D坐标转化为另一种3D坐标,且允许对顶点属性进行基本处理(不仅仅可以只传递3D坐标)

图元装配器:

将顶点着色器输出的顶点作为输入,并将所有的点装配成指定形状(eg. a triangle )

几何着色器:

将图元形式的一些列点的集合作为输入,通过产生新顶点构造新形状

光栅化:

将图元映射为屏幕上的像素,在片段着色器运行之前,进行裁切(Clipping),裁切会丢弃视野外的像素,以此提高效率

片段着色器:

计算一个像素的最终颜色,usually判断着色器包括3D场景中的数据(eg. 光照、阴影、光的颜色)

Test and Blending

即Alpha测试与混合。首先检测对应片段的深度,判断该片段在其他物体的前面还是后面,以此决定是否丢弃。再检查Alpha值,对物体进行混合。


通常情况下,使用默认的几何着色器就行了,but顶点着色器和片段着色器需由我们自定义

OpenGL并不能将所有的3D坐标转化为2D坐标,只有3个轴都在(1.0,1.0)(-1.0,1.0)之间时,才能处理他们,将这些范围内的坐标成为标准化坐标(Normalized Device Coordinates)-->NDS

float vertices[] = 
{ -0.5f, -0.5f, 0.0f,
  0.5f, -0.5f, 0.0f,
  0.0f, 0.5f, 0.0f };

由于渲染的是一个2D图形,将z坐标设置为(0.0)(0.0) ,这样每个图形的深度就都是一样的了,看上去便是一个二维图形
通常深度可以理解为z坐标,代表在空间中和你的距离,如果离得远就可能被别的像素遮挡,这样就看不到它了,因此也会被丢弃
顶点着色器在GPU创建内存储存顶点数据,用VBO管理这些内存(Vertex Buffer Object),从而将顶点数据储存在一起一次性的发过去,而不是每个顶点发送一次。

unsigned int VBO;
glGenBuffers(1,&VBO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);
//OpenGL有很多缓冲类型,顶点缓冲对象的类型是GL_ARRAY_BUFFER
//glBindBuffer函数将新创建的缓冲绑定到GL_ARRAY_BUFFER上

此时,所有 GL_ARRAY_BUFFER 上的缓冲调用都会用来配置VBO

glBufferData函数:

将用户定义的数据复制到当前绑定的缓冲对象上的函数

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  • 第一个参数:目标缓冲的类型
  • 第二个参数:传输数据的大小
  • 第三个参数:希望发送的实际数据
  • 第四个参数: 如何管理数据

管理数据的三种方式

  1. GL_STATIC_DRAW: 数据几乎不变
  2. GL_DTNAMIC_DRAW: 数据会改变很多
  3. GL_STREAM_DRAW: 每次绘制时改变

此时,已经将顶点数据储存在显卡之中,用VBO这个顶点缓冲对象进行管理
下面将利用顶点和片段着色器对数据进行处理