U3DC.COM | 优三帝研究院

Menu

Shader开发指南(1):OpenGL渲染管线

前言

Shader,即着色器,在图形世界中,指一些用于渲染图形的代码,它可以让图形开发人员通过编写相应的代码,来改变和增强最终的图形输出效果,比如在游戏中的各种酷炫的特效。

OpenGL

OpenGL即开放图形库,它提供了一整套用于渲染2D3D矢量图形的跨语言跨平台应用程序编程接口(API)。甚至可以抽象的理解为,它是在Shader之上的一套框架式的引擎,开发者可以基于它提供的规范接口来快速的开发图形应用。现在的各种游戏开发引擎也会基于这类图形库作为其渲染接口,比如在Unity中根据平台不同,目前就提供了OpenGL、Direct3D、Vulkan、Metal等图形接口作为其底层的渲染。参见下图:

OpenGL的渲染流程

以Unity渲染一个Fbx格式的模型为例:

(1)CPU处理:当导入一个Fbx模型时,CPU就操作将Fbx加载到内存中,并通过Meshrender组件将模型FBX身上的顶点、UV、法线、切线等信息,传递给GPU渲染出来。

(2)GPU处理(并行运算):这里就是传说中的渲染管线了。主要流程:顶点着色器=>光栅化=>片段着色器=>Alpha测试=>模板测试=>深度测试=>Blend=>Gbuffer=>FrontBuffer=>FrameBuffer=>显示器。

这一连串,就像工厂的流水线一样,所以,就称为渲染管线。我们来分解下各个步骤的细节:

顶点着色器

1.计算顶点的颜色。

2.坐标转换(矩阵变换):将物体坐标系转换为相机坐标系,渲染相机范围内的物体。

光栅化

将顶点转换为像素点。以顶点为边界,中间做插值运算,填充像素点。

片段着色器

1.纹理采样。从纹理的像素赋值给上一阶段产生的像素点。

2.像素与灯光进行计算。

【注】假若,顶点着色器4个,到了光栅化,插值后为100 100,那么到了片段着色器,则会进行100 * 100次运算。所以,在这个阶段的运算量是指数级增长。故,能在顶点着色器运算的,就不要放到片段着色器中运算。大大影响效率。

Alpha测试

挑选合格的alpha像素显示。

模板测试

像素可带模板信息,达到条件的模板值。

深度测试

即z,像素距离相机的距离。符合条件的像素就通过,不然丢弃。

Blend:

将当前要渲染的像素和已经渲染出来的像素进行混合运算。

GBuffer

存储RGBA、模板值、深度值等。

FrontBuffer

将渲染结果推送到显示器。就是当前显示在屏幕上的内容,这个缓冲是只读的,无法修改。

FrameBuffer

帧缓存也叫刷新缓存Framebuffer 或 refresh buffer, 这里的帧(frame)是指整个屏幕范围。 帧缓存有个地址,是在内存里。我们通过不停的向framebuffer中写入数据, 显示控制器就自动的从frame buffer中取数据并显示出来

打赏
— 于 共写了1142个字
— 文内使用到的标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据