Shader学习历程(二)——GPU渲染过程
来源:互联网 发布:linux统计登陆用户数 编辑:程序博客网 时间:2024/04/26 07:59
声明
本文参考《GPU Programming And Cg Language Primer》
感谢作者
概览
这一篇主要讲述了GPU的渲染过程,这一篇可谓最为基础的重点,所以我们必须将其牢记于心。
图形绘制管线分为三个阶段:
应用程序阶段、几何阶段、光栅阶段
应用程序阶段:进行涉及cpu和内存的算法,按照我的理解,例如在unity里面设置场景和物体,实现游戏逻辑,这些都是cpu干的活,但cpu并不能让它在屏幕上显示出来,于是cpu就把所有顶点坐标、法向量、纹理坐标、纹理等信息传递给gpu。
几何阶段:主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射 ,该阶段基于 GPU 进行运算,它将从cpu传递过来的信息加以处理,最后得到经过 变换和投影之后的顶点坐标、颜色、以及纹理坐标。光照计算也在此阶段进行。
光栅阶段:基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制
完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲 器(color buffer 或者 frame buffer)中。
几何阶段的顶点变换
上文提到,几何阶段主要进行顶点变换和光照计算,其实它的主要工作就是将获得的三维模型顶点按照我们想要的方式投影到2d的屏幕上,因为我们总是要通过屏幕来进行交互。
顶点变换分如下几个阶段:
模型坐标——世界坐标——视点坐标——投影(裁剪)坐标
其中我觉得需要注意的几点如下:
1.从 object space coordinate 到 world space coordinate 的变换过程由一个四阶矩阵控制,通常称之为 world matrix。
2.光照计算通常是在 world coordinate space(世界坐标空间)中进行的,这也 符合人类的生活常识。当然,也可以在 eye coordinate space 中得到相同的光照效果。
3.从 eye space 到 project and clip space 需要将视锥之外和视锥之内的顶点进行裁剪,很多人在理解该步骤时存在一个混乱,即“不清楚裁减与投影的关系和两者 发生的先后顺序”,不少人觉得是“先裁减再投影”,不过事实并非如此。因为在 不规则的体(viewing frustum)中进行裁剪并非易事,所以经过图形学前辈们的
精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是 (-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体(Canonical view volume, CVV)(实时计算机图形学第 9 页)。CVV 的近平面(梯形体较小的矩形面)的 X、Y 坐标对应屏幕像素坐标(左下角是 0、0),Z 坐标则是代表画面像素深度。
4.把视锥中的顶点变换到CVV中就称为投影。而裁剪就在CVV中进行。然后再将经过前述过程得到的坐标映射到屏幕坐标系上。
5.关于裁剪,在这一步应该只是把处于视锥之外的顶点舍弃,并把视锥边界周围的顶点留下,并且
cpu也可参与顶点裁剪过程中,它通过检测某一物体是否在视锥之中,从而决定是否将它传递到gpu中。
Primitive Assembly && Triangle setup
图元装配,即将顶点根据 primitive(原始的连接关系),还原出网格结构。
在这个过程中将把所有顶点再重新连接成一个个三角形。
在这个过程中也存在着裁剪,第一是将屏幕周边的三角形进行拆分。第二是通过法向量来判断三角形是否是背向屏幕的,从而剔除不必要的三角形。
注意,到这个阶段,所有的顶点在经过裁剪、连接、转换后,都处于屏幕坐标系中。具体表现为一堆面片,接下来要进行光栅化。
光栅化阶段
光栅化
决定哪些像素被集合图元覆盖的过程
像素操作
1.消除遮挡面
2.Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的 纹理值;
3.Blending
混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha), 混合为两种颜色,作为新的颜色输出。
4.Filtering,将正在算的颜色经过某种 Filtering(滤波或者滤镜)后输出。 可以理解为:经过一种数学运算后变成新的颜色值。
着色语言与渲染流程
- 坐标、向量、纹理坐标传递给顶点着色器。
- 顶点着色器对顶点进行处理、进行光照计算。
- 光栅化操作,用像素对图元(通常为三角形)进行填充,对顶点着色器传递给片段着色器的颜色、向量、坐标等元素进行插值。
- 片段着色器对接收到的数据进行处理,最终计算出当前像素的颜色并输出。
像素操作,进行上述操作,一般由固定管线功能来完成,在shaderlab中提供了相关函数。
注意事项
顶点着色器每顶点执行,片段着色器每片段执行。
个人理解像素光照和顶点光照的区别就是延时光照对顶点各坐标数据进行插值之后再计算每像素的光照,正向光照是先计算顶点光照,然后再把光照颜色进行插值赋给各像素。
而延时渲染与正向渲染的区别就是对各光照类型进行分配的区别。
学习总结,有错误或补充欢迎指出。
- Shader学习历程(二)——GPU渲染过程
- Shader编程学习笔记(二)—— Shader和渲染管线
- Shader编程学习笔记(二)—— Shader和渲染管线
- Shader编程学习笔记(二)—— Shader和渲染管线
- Shader编程学习笔记(二)—— Shader和渲染管线
- Shader编程学习笔记(二)—— Shader和渲染管线
- Shader 学习历程(一)——第一个shader
- Shader学习——GPU流水线
- Shader学习历程(五)——Sprite Shader之简单抠图
- GPU渲染管线与shader
- GPU渲染管线与shader
- GPU编程入门(二) 象素shader
- Shader学习——CPU与GPU之间的通信
- GPU渲染时代——2D图形图像中的应用(二)
- Shader学习笔记(三) GPU流水线
- Shader学习历程(三)——shaderlab中边缘光的不同实现
- Shader学习历程(四)——Unity官方Image effect__Fisheye
- 【Unity Shaders】学习笔记——Shader和渲染管线
- ocp-179
- ocp-180
- css浮动与盒子
- 管理bitmap内存
- jquery 获取下拉框值与select text
- Shader学习历程(二)——GPU渲染过程
- 在iOS中如何创建一个控制器
- exit()与_exit()的区别(转载学习)
- Kafka 学习笔记(1)
- jboss 4.2.2只能localhost访问 不能通过ip访问解决办法
- iOS开发系列课程(09) --- 滚动视图
- hadoop之yarn状态机模型
- Java中泛型的理解(三)
- yum 镜像