图形渲染管线
来源:互联网 发布:云计算发展史 编辑:程序博客网 时间:2024/05/21 09:12
概述
图形渲染管线(Graphics Pipeline),简单的说就是把摄像机看到的东西,绘制成一幅2D图像的过程。可以分为3个阶段:
1. 应用程序阶段
2. 几何阶段
3. 光栅化阶段
[图1-1 可编程渲染管线]
应用程序阶段
这个阶段是在CPU上执行的,例如batching,遮挡剔除(occlusion culling)等加速算法。因为视锥裁剪(frustum culling)是在vertex shader之后执行的,这就意味着在视锥体之外的顶点也会有顶点计算开销,所以应当尽量少的向GPU传递无用的顶点。有很多处理这个问题的加速算法,比如八叉树,还有上面提到的遮挡剔除算法。
在这个阶段的最后CPU把模型,渲染指令和贴图发送给GPU,进入几何阶段。
几何阶段
Vertex Shader
通过乘以级联的4x4变换矩阵(MATRIX_MVP)的方式,把顶点从模型空间变换到齐次裁剪空间,方便进行随后Clip/Cull/Setup操作。 以最常见的透视投影为例,在齐次裁剪空间中,把摄像机的视锥体变换成了单位立方体(x,y,z的范围都在[-1, 1]之间)。
[图1-2 视锥体变换过程]
除了对顶点的空间变换之外,还有顶点的UV,法线的变换等,最终将结果存到输出寄存器中,等待传入fragment shader中进行下一步处理。下面是它的工作流程:
[图1-3 vertex shader的工作流程]
图元装配(Primitive Assembly)
接着把顶点装配成图元,一般都是三角形。只有在单位立方体内的才会进入下一阶段,因此,完全在立方体之外的被舍弃,部分在外面的,则会保留在立方体内的部分,并且重新产生顶点装配成新的图元。然后把幸存下来的图元映射到屏幕上(x,y转化成屏幕坐标,z不变,还是[-1, 1]),进入光栅化阶段。
[图1-4 裁剪过程]
p.s. 固定渲染管线中,T&L是同时发生在几何阶段的。把顶点和光照转换到世界空间或者视点空间中,进行光照计算。然而在可编程管线中,光照可以在vertex shader中计算,也可以在光栅化之后,fragment shader中进行逐像素的计算。 因此这里并没有特别写光照部分,以免产生不必要的困惑。
光栅化阶段
光栅化
光栅化是把屏幕空间的二维坐标转化成fragment(fragment可以理解为潜在的像素,通过各种测试的fragment将会被写入后备缓存区(frame buffer),最终显示在屏幕上)。下面这张图展示了渲染管线的整个过程,可以看到,光栅化阶段把三角形转化成了所占区域的像素点,有点类似Flash中把向量图打散为像素图的过程。
[图1-5 图示化渲染管线]
Fragment Shader
光栅化后的fragment,读取vertex shader中的结果作为输入,计算这个fragment的颜色值。与vertex shader不同,fragment shader能进行贴图操作。下面是它的工作流程:
[图1-6 fragment shader的工作流程]
ROP(Raster Operations)
在将fragment写入后备缓存区之前,会进行各种测试,以判断当前fragment是要写入还是丢弃。
[图1-7 标准opengl和dx的光栅操作]
通过测试的fragment,深度和模板缓存中的值将会被更新。颜色值则会有一个blend操作,将fragment的颜色值和与颜色缓存中对应位置点的像素值做混合操作,最终写入颜色缓存中。
参考文献:
《Real Time Rendering》
《The Cg Tutorial》
http://blog.sina.com.cn/s/blog_754853c1010126u0.html
http://blog.chinaunix.net/uid-20235103-id-2680299.html
- 图形渲染管线
- 图形渲染管线
- 图形渲染管线
- 可编程图形渲染管线
- 图形学 图形渲染管线
- 3D图形渲染管线
- 3D图形渲染管线
- 3D图形渲染管线
- 3D图形渲染管线
- 3D图形渲染管线
- OPENGL固定图形渲染管线
- 3D图形渲染管线
- 3D图形渲染管线
- GPU图形固定渲染管线
- 3D图形渲染管线
- OpenGL图形渲染管线图解
- [实时渲染] 2. 图形渲染管线
- [Unity3D]图形渲染优化、渲染管线优化、图形性能优化
- Swift 中的值类型和引用类型
- iOS 后台定位需要注意的两个问题
- webstorm新项目添加git
- cocos2dx3.4-android项目eclipse运行报错CDT',Properties下c/c++build无法打开
- AndroidManifest.xml——manifest
- 图形渲染管线
- android WebView 应用内点击超链接不调用系统浏览器
- 注意:List list = new ArrayList();
- HTTP协议详解
- 用Hexo搭建github博客
- LeetCode226 InvertBinaryTree Java题解
- 一文读懂机器学习,大数据/自然语言处理/算法全有了……
- Java对象的序列化与反序列化
- HDOJ-3572 Task Schedule(网络流)