Shader Learing(Render Pipeline篇)
Shader Learing(Render Pipeline篇)硬件相关:传统的 GPU 使用固定功能的管道(pipelines)实现图形算法,现代的 GPU 则是具有高度灵活性的可编程设备,使用 SIMD 处理器并行处理大量数据,从而实现图形性能。(SIMD:单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集)。GPUvsCPU:CPU 大部分面积为控制器和寄存器,与之相比,GPU 拥有更多的 ALU(Arithmetic Logic Unit,逻辑运算单元)用于数据处理,而非数据高速缓存和流控制,这样的结构适合对密集型数据进行并行处理。CPU 擅长控制,GPU 擅长计算,这是由他们的硬件架构设计所决定的。 渲染管线:GPU 内部的渲染流程图:
对模型进行简化:
下面对渲染管线进行详细解释: 1、 模型创建,配置在虚拟空间里主要是在 CPU 里进行的处理。 2、 几何处理:① 顶点变换:把模型顶点变换到显示屏上的坐标。为了将坐标从一个坐标系转换到另一个坐标系,我们需要用到几个转换矩阵,最重要的几个分别是模型/视图/投影三个矩阵。顶点坐标开始于局部空间,称为局部坐标,然后经过世界坐标,观察坐标,裁剪坐标,并最后以屏幕坐标结束。 ② 光照计算与法线变换:
光照将在各个顶点处进行计算,通常称之为逐顶点光照计算,不过目前逐顶点光照已经稍显过时,而更为常见的技术则是逐片元光照。 ③纹理坐标变换与材质状态:纹理坐标的计算,就是计算出在怎样的多边形上,把怎样的材质纹理通过什么样的方式贴上去。还有,实际做纹理映射是在 Piexl Shader 的时候,这里只是纹理映射的准备工作。之后在图形的其它片段上进行片段插值。 如果我们想要在 OpenGL 中模拟多种类型的物体,我们必须为每个物体分别定义材质(Material)属性。材质是一个物体反射的环境,漫反射,镜面反射光照,这些东西设定了物体的颜色。④进入 Vertex Shader 里的是一次一个的顶点,而进入 Geometry Shader 的是一次一批的顶点,Geometry Shader 掌握着这些顶点所组成的图元的信息。Geometry Shader 的处理阶段处于流水线的栅格化之前。Geometry Shader (几何元着色器)是继 Vertex Shader和 Piexl Shader 之后,由 Shader Model 4(第四代显卡着色架构)正式引入的第三个着色器。 3、 光栅化:由图元处理传递过来的图元数据,在此将会被分解成更小的单元并对应帧缓冲区的各个像素,这些单元被称之为片元,一个片元可能包含深度、颜色、纹理坐标等属性。片元的属性则是图元上顶点数据等经过插值而确定的,这里生成的片元将会包含主颜色和次颜色,即使用插值(平滑着色) 或者使用最后一个顶点颜色(平面着色)。
4、 片段处理: ② Alpha Test 采用一种只要一个像素的 alpha 不满足条件,那么它就会被 fragment shader舍弃。被舍弃的 fragments 不会对后面的各种 Tests 产生影响;否则,就会按正常方式写入到缓存中,并进行正常的深度检验等等,也就是说,Alpha Test 是不需要关闭ZWrite 的。Alpha Test 产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
③ 模板测试:模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值(通常的话是个 8 位整数)。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。
④ 深度测试:深度缓冲(Depth Buffer)就像颜色缓冲(Color Buffer)(存储所有的片段颜色:视觉输出)那样存储每个片段的信息,(通常) 和颜色缓冲区有相同的宽度和高度。深度缓冲由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。在大多数系统中深度缓冲区为 24 位。 ⑤ Alpha Blending 则是一种中庸的方式,它使用当前 fragment 的 alpha 作为混合因子,来混合之前写入到缓存中颜色值。但 Alpha Blending 麻烦的一点就是它需要关闭ZWrite,并且要十分小心物体的渲染顺序。如果不关闭 ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的 ZWrite。 Shader 在哪里?
统一着色器模型将上述三种着色器统一起来,发布于 OpenGL 和 Direct3D 10 里面。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |