OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7

OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7


上一次我们已经将stratup() render() shutdown()添加到了我们通过GLFW建立的框架中去,其实就是建立了三个子函数。从这一篇开始我们将开始学习按照OpenGL超级宝典第7版的内容来进行推进,我将尽力将所有清单都进行一个实操,我会尽力解释每个函数的功能,还有整个流程的顺序(可能其中有些不太恰当的比喻),流程中各个环节的作用。本篇主要是介绍什么是OpenGL,什么是OpenGL的渲染管线,什么是着色器,以及整个程序都在干什么。

1 OpenGL简介

按标准的话说,OpenGL是一种接口,应用程序可以通过它来访问和控制其所在运行设备的图形子系统。简单的理解可以看成是别人提供的函数集(当然不仅仅是函数集),通过他提供的函数,我们就能控制设备的图形系统(让显卡算些东西,让设备显示一些东西)。当然这些函数并不是很简略(毕竟越是简略越缺乏应对复杂图形的能力),并不是调用一两个函数就能进行图像的绘制(对于新手而言绘制一个三角形都是很繁琐的),但是它提供了一个非常值得学习的程序运行流程,按照它的流程当处理很多的图形时可以大大提高运算的效率。

2 OpenGL渲染管线

当代生活中有很多的影视作品,游戏,示意图(房子,汽车等等),都是通过计算机渲染得到的图像(并不是真实拍摄的),其中绝大多数都是通过类似OpenGL的图形接口建立的渲染程序进行渲染的(比如DirectX标准下的很多API、KhronosGroup标准下的很多API),虽然随着图形学的发展,游戏中的人物模型从棱角分明逐渐的变的光滑,最新的光线追踪技术更是让渲染的结果进一步的接近真实的世界,但是看似光滑的表面在电脑看来仍是由传统的三角面组成的,因为当三角面足够多的时候,物体的表面就可以更加的接近光滑的曲面。另一个重要原因是,相对于复杂的曲面方程,计算机更适合计算相对简单的三角面(虽然同一个曲面可能由大量的三角面组成,但相对于电脑大量的计算核心和超高的计算频率,这些三角面也并不可怕)。所以我们的OpenGL渲染管线也是以处理三角面为主的。

首先OpenGL渲染管线就相当于一条流水线一样,将计算分成很多的环节,每个环节各司其职,这个环节的输出将变成下一个环节的输入,通过我们编程来将各种计算任务分配到各个环节中去,这样就形成了一个完整的渲染管线。

如果我们想把一个三角面(或者说是一个空间中的三角形)显示在屏幕上,我们要:
1,告诉程序三角形的三个顶点在哪里(顶点拾取:向管线中输入顶点)
2,我可能需要对三角形进行缩放,根据视角的不同进行旋转或是透视计算(顶点着色器:对顶点的位置等进行修改)
3,我可能需要在这个三角形中细分出更多的小三角形(有时候细分比直接通过顶点传入更省资源)
4,根据我们上面的设置自动计算生成细分的小三角形(曲面细分)
5,我们可能需要对这些小三角形顶点的位置等信息进行修改(细分曲面评估着色器)
6,我们可以对点,线,三角形,进行批量的几何处理,比如在所有传入的点的位置画一个小房子,这样可以实现素材的复用,你能看见游戏中很多的树、房子都是同样的美术素材,可能就是在这里进行的素材复用(几何着色器)
7,我们绘制的图形最终会以一个个像素的形式显示在屏幕上,程序需要计算哪些像素应该显示哪些应该不显示(光栅化)
8,我们在完成光栅化后还需要对每个像素进行计算,比如这个像素对应的是哪个三角形(三角形是否被其他三角形所遮挡),这个三角形是否进行了贴图,是否有光打在上面,是否位于阴影之中等等(片段着色器)
9,帧缓冲(帧缓冲:之前我们提到了的前、后缓冲)
拍摄的书上的内容

3 着色器shader

如上所述,在管线中(或是理解为图形计算的流水线)有各种各样的环节,其中可编程的环节我们为其所写的小程序就叫做着色器。书上的定义是着色器(shader)为GPU的大量小型可编程处理器上运行的小程序(书第3页下半部分)。

4 使用着色器

4.1编辑并编译着色器 清单2.3-2.5

虽然有5个环节可以由我们来编辑,但是并不是每一个环节都是必须的,其中顶点着色器和片段着色器是每个OpenGL管线必须有的着色器。

注意OpenGL的着色器语言是GLSL,但是GLSL是由C++转变而来的,所以你能看到我们编写的着色器程序非常像C++,注意这并不是C++而是GLSL。
清单2.3我们的第一个顶点着色器:

#version 450 core
//这一句表示我们的顶点着色器是用的OpenGL4.5版本,使用的是OpenGL核心模式
void main(void){
   
	gl_Position = vec4(0.0, 0.0, 0.5, 1.0);
	//gl_Position是OpenGL顶点着色器内置的变量,我们通过它告诉管线我们的顶点在哪里
}

关于核心模式的csdn文章
在main函数中我们赋值给gl_Position,它是连接着色器至OpenGL其余部分的纽带。通过gl_Position,OpenGL其余部分才能根据顶点数据进行计算,每有一个顶点数据传入(虽然这里我们直接把顶点的位置写入了着色器中),顶点着色器就将运行一次。所有以gl_为开头的变量都是OpenGL的一部分。

清单2.4我们的第一个片段着色器:

#version 450 core
out vec4 color;
//通过out关键字声明一个我们自己的变量,变量类型为vec4(其实就是4个GLfloat的向量),名字为color
//out关键字也表明这个color将从着色器中输出,由于是片段着色器的输出,所以它会将其视为该片段(像素)的颜色
void 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值