从有限元到Unity
一、从有限元到Unity——有限元网格信息导出及分析
二、从有限元到Unity——Unity网格编程
三、从有限元到Unity——从abaqus网格模型文件到Unity模型数据
四、从有限元到Unity——有限元分析结果导出
五、从有限元到Unity——渲染管线与着色器
文章目录
前言
上一篇文章大概说了Abaqus如何导出分析后的场变量数据,为后期渲染作数据准备。从本文开始正式进入渲染环节。本章先对渲染管线进行基础了解,以便于后面着色器、渲染过程的理解。
一、渲染管线是什么?
我们以手机装配流水线为例,首先生产线的前端会有原材料的投入,如机壳、PCB板、电池等,然后是员工进行各个原材料的组装、到整机测试、整机包装,最后输出成品。
渲染管线的工作与装配流水线类似,网格、材质相当于投入到产线的原材料,CPU和GPU相当于员工,协同起来进行图像渲染和输出,最终获得屏幕上的图像。
二、渲染管线干了些什么?
前面说了渲染管线是CPU和GPU协同下完成进行图像渲染和输出的过程,而这个过程大体可分为应用阶段、几何阶段和光栅化阶段。那这些阶段中处理些什么?CPU和GPU干了些什么?我们后面就来探讨下。
1.CPU干了些什么?
在渲染工作中,CPU主要在应用阶段起作用,负责将渲染数据和指令发送至缓存区,GPU负责从缓存区取出数据和指令进行渲染。
具体的话,应用阶段中CPU将场景数据(模型、光源信息、渲染数据等)、渲染状态设置等进行准备并发送给图形硬件(GPU、显存),同时调用DrawCall(CPU调用图像编程接口)向命令缓冲区依此写入命令,使GPU能依次将其取出执行。
简而言之,CPU充当着下达渲染命令调用GPU执行的角色。
2.GPU干了些什么?
GPU主要在几何阶段和光栅化阶段起作用,其中,在几何阶段中又包括了顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射几步。
2.1.几何阶段
2.1.1.顶点着色器
顶点着色器为几何阶段必需一步,而且是完全可编程的(对应Unity着色器里面的顶点函数),这一步中主要对顶点的坐标进行空间模型转换。这几个空间包括:
(1)模型空间:即顶点在模型上的坐标位置
(2)世界空间:最大的空间,即顶点在世界坐标的绝对位置
(3)视图空间:与模型空间概念类似,只不过从顶点在模型上的位置转为顶点在摄像机的位置
(4)剪裁空间:除去摄像机视锥体外顶点的坐标空间
顶点着色器完成顶点坐标从模型空间到世界空间(通过M矩阵转换)、世界空间到视图空间(通过V矩阵转换)、视图空间到剪裁空间(通过P矩阵转换)的一系列转换(相当于Unity的UNITY_MATRIX_MVP/UnityObjectToClipPos),也从显存中获得顶点的属性(显存中的数据也是CPU写入的),包括顶点坐标、法线、颜色等,并进行逐顶点计算。
2.1.2.曲面细分着色器和几何着色器
这两步都是非必须步骤,曲面细分着色器主要是做了曲面细分的工作,使模型细节更丰富,看上去跟增加了顶点一样;几何着色器主要进行增加、去除某些顶点或者修改顶点属性的工作。
2.1.3.裁剪、屏幕映射
裁剪就是对完成顶点着色器之后,对处于视锥体之外的顶点进行去除,保留可见顶点的过程(有的算法还会重新计算处于视锥体边缘的面片的顶点位置,从而平滑边缘);屏幕映射则是将剪裁空间的顶点,通过矩阵变换转换到屏幕空间中(与屏幕分辨率有关)。
2.2.光栅化阶段
光栅化阶段主要是将屏幕空间中的顶点组装为面片、计算像素点颜色以及一些与图像输出相关的工作。其中包括了图元组装、三角形遍历、片元着色器以及逐片元操作。
2.2.1.图元组装、三角形遍历
图元组装主要对屏幕空间中的顶点根据顶点的数据构建点、线、面的关系;而三角形遍历则是在此基础上逐行扫描屏幕像素点,像素点在三角形内的则作为片元进行片元着色器的渲染计算,否则直接忽略(这种方式会导致锯齿现象产生,抗锯齿技术是相应的有效解决方法)。
2.2.2.片元着色器
片元着色器与顶点着色器一样,也是可由开发者完全编程的(对应Unity着色器里面的片元函数),主要根据顶点的属性计算每个片元的颜色,每个片元的颜色受其所属的三角形的顶点所影响。
2.2.3.逐片元操作
逐片元操作中,GPU完成一系列测试,包括裁剪测试、透明度测试、模板测试、深度测试等