games202-2

渲染管线

1、三维物体:用点和连接关系(如obj文件)表示

2、顶点处理:MVP矩阵变换,从三维空间中的点变换到屏幕上的点(但是连接关系没有改变)

3、光栅化:将三角形离散成片元(像素),根据遮挡关系保留最终能看见的片元(深度测试)

4、着色:计算片元的颜色值(不同的着色模型,如blinn-phong,可以很好的处理直接光照,但是不适合处理全局光照,如阴影和光线的多次弹射/纹理映射(涉及重心坐标插值)等)

5、屏幕显示

关于先进行深度测试还是先计算片元的颜色值,会有不同的处理导致不同的顺序。硬件渲染管线在GPU上运行,速度快,并行性。

OpenGL

在CPU端执行的API调动GPU(快,很多操作封装成API可以直接调用),跨平台。缺点:版本太多;C风格代码没有面向对象的说法;很多年前不方便debug。

使用:

1、确定要绘制的模型 VBO:GPU中的一块内存,存储顶点属性

2、定义矩阵进行顶点变换,使用变换相关API,不需要自己推导矩阵(M变换)

3、确定相机位置(VP变换),创建/指定帧缓冲(指定了帧缓冲可以渲染一次,获得多张图(多目标渲染,由片元着色器指定渲染到哪一个纹理,第一次渲染得到的纹理可以在第二次渲染使用),以及为了防止屏幕撕裂,可能需要使用双重/三重缓冲)

4、着色器

顶点着色器:每个顶点进行变换如MVP变换;

在两个着色器中间会进行光栅化,需要插值的属性插值好送往片段着色器。

片段着色器:顶点着色器的输出是片段着色器的输入,顶点的属性会被插值到片段。为每一个片段着色。(可以手动进行深度测试)

除了顶点和片段很多都是可封装的。在渲染前,一定要设置清楚GPU应该如何渲染。

GLSL

着色语言写出来的着色器需要先编译,GPU再执行。

(1)create shader(本质是字符串,可以存在文件中)

(2)compile shader(编译)

(3)attach shader to program(结合所有自定义的shader)

(4)link program(链接,查看各个shader能否链接在一起,有无问题)

(5)use program

上述步骤可以封装。

image-20230708160920521

attribute顶点属性,只会出现在顶点着色器。()

varrying片段着色器需要使用的,要插值的量。(片段着色器有相同的变量)

uniform全局变量,着色器都可以访问

着色器不需要使用for循环,只是针对单个顶点/单个片元要如何执行。

texture2D:查一个纹理,在哪里查

gl_Fragment、gl_Position内置变量,写入最终片段呈现的值/变换后拿去视口变换的顶点()

Debugging shader

工具:

Nsight Graphic

RenderDoc

将得出的值,当成颜色显示在屏幕(负数可以先偏移)

渲染方程

image-20230708162309332 image-20230708162427731

全局光照:直接光照+间接光照(计算复杂)

解决实时光照:解决多一次bounce的间接光照

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信