Real-Rime Rendering (1) - 渲染管线(Rendering Pipeline)
提要
渲染管线是实时渲染中最重要的部分,它的最主要的任务就是在给定一个虚拟的场景,包括相机,object,灯光,纹理等等,生成一副2D的图像。
最基础的渲染管线如下图所示:
主要的阶段包括三个:Application,Geometry,Rasterizer,每个阶段都可能分成更小的管线,有些小的阶段会并行执行。下面来一个个讨论。
The Application Stage
主要任务:碰撞检测,加速算法,变换动画,外部接口的输入等等。
它不能被细分成更小的阶段。
为了获得更好的表现,这个阶段通常会用多核执行的方式进行加速。
The Geometry Stage
主要任务:负责每个多边形,每个定点的操作。
可以对阶段进行细分,如下图:
每个小阶段的描述如下:
Model&View Thansform(模型变换和视口变换)
要获得三维时间坐标系场景的显示必须先建立观察用的坐标系,然后将对象描述转换到观察坐标系并投影到观察平面上。
模型转换相当与改变模型在世界坐标的位置,在Opengl中,主要有三个函数用于执行模型变换,它们是glTranslate*()、glRotate*()、glScale()。这些函数通过移动、旋转、拉伸或者反射,对物体进行变换,实质上是相当与产生一个适当的移动,旋转或缩放矩阵,然后以这个矩阵为参数调用glMultMatrix*(),也就是把当前矩阵与变换矩阵相乘,得到当前位置。
视口变换相用于修改观察点的位置和方向,opengl中用到的函数就是glLookAt().
Vertex Shading(定点着色)
为了产生真实可感的场景,不仅要渲染物体的形状和位置,它的appearance也要进行渲染。
生成材质的光照效果称为着色,在每个定点都存储着与着色相关的信息(颜色,法向量等),着色的结果计算好之后就会传递到Rasterizer Stage进行插值计算。
Projection(投影)
投影指的时将空间的场景投射到2D平面进行显示。
常见有两种投影方式,一种是平行投影(parallel projection),一种是透视投影(perspective projection)。
机械制图中的投影方式就是平行投影,投影的比例一定和原图一样。
照相机和人眼的观察方式属于透视投影,物体近大远小,符合素描中的透视关系。
Clipping(裁剪)
只有在视口空间的物体或物体的部分才需哟啊显示出来,当一些图元只是部分出现在视口中的时候,就需要对其进行裁剪。
Screen Mapping(屏幕映射)
只有在视口空间中的图元会到达这个阶段。
视口的坐标会被转换到screen的坐标。
ScreenMapping的阶段就负责将视口上坐标对应到屏幕坐标。
Rasterizer Stage(光栅化阶段)
目标:渲染每个像素的颜色。
可以分割成:
Triangle Stage ->Triangle Traversal -> Pixel Shading-> Merging
总结
这并不是渲染流水线的唯一组织形式,电影的渲染通常使用的时micro polygon pipelines, 学术研究和predictive rendering通常使用的光线追逐,现在一些渲染工具也使用了光线追踪渲染器,比如Blender。而OpenGL的渲染管线如下图所示:
通常硬件的渲染流水线都是确定的,比如任天堂的Wii,但如今可编程的GPU却给我们带来了另外的机会:在流水线的各个阶段去编写自己的代码,这也是现代GPU最大的优势。
有意思的视频
参考
Real-Time Rendering 3rd
OpenGLProgramming Guide 7th
Fundamentals of Computer Graphics 2rd
Real-Rime Rendering (1) - 渲染管线(Rendering Pipeline)的更多相关文章
- Forward Rendering VS Deferred Rendering
http://gad.qq.com/article/detail/32731 Forward Rendering Deferred Rendering
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- 渲染路径-实时渲染中常用的几种Rendering Path
http://www.cnblogs.com/polobymulberry/p/5126892.html?utm_source=tuicool&utm_medium=referral 回到顶部 ...
- Rendering in UE4(Gnomon School UE4 大师课笔记)
Rendering in UE4 Presented at the Gnomon School of VFX in January 2018, part two of the class offers ...
- 39. Volume Rendering Techniques
Milan Ikits University of Utah Joe Kniss University of Utah Aaron Lefohn University of California, D ...
- Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来 ...
- Rendering on the Web
转自: https://developers.google.com/web/updates/2019/02/rendering-on-the-web Rendering on the Web Goog ...
- Rendering with Replaced Shaders
[Rendering with Replaced Shaders] 1.RenderType tag RenderType tag categorizes shaders into several p ...
- unity, 替换shader渲染(Rendering with Replaced Shaders)
实现特效,尤其是一些后处理特效,经常需要将各物体的shader替换为另一套shader进行渲染到纹理,再后再进行合成或以某种叠加方式叠加到最后的画面上去. 再复杂一点儿的,可能不同的物体所用的替换sh ...
随机推荐
- from声明
在整个应用程序,只有三行声明.这是最短单WIN32应用,但它的功能是非常有限,简单地显示一个消息框,示出来,其他什么事情也没有做.以下就来分析这三行语句了.别小看这三行语句.其实是隐藏着非常多知识点在 ...
- URAL 1727. Znaika's Magic Numbers(数学 vector)
主题链接:http://acm.timus.ru/problem.aspx?space=1&num=1727 1727. Znaika's Magic Numbers Time limit: ...
- hdu 最大三角形(凸包+旋转卡壳)
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy对这道题目百思不得其解,想不通用什么方法 ...
- error C3130: 内部编译器错误: 未能将插入的代码块写入PDB
近期编译cocos2d-x的test突然出现这个错误,又一次编译也无法解决. 一般出现这个错误是两个原因:一个是磁盘空间不足,还有一个是项目太大导致pdb文件太大,无法继续写入. 原本cocos2d- ...
- linux_shell_获取日期相关
shell里直接调用系统变量 获取当天日期`date +%Y%m%d` 获取昨天日期`date -d yesterday +%Y%m%d` 获取前天日期`date -d -2day +%Y%m%d` ...
- 深入浅出MS06-040
入浅出MS06-040 时至今日,网上已有颇多MS06-040的文章,当中不乏精辟之作.与其相比,本文突显业余,技术上无法超越,徒逞口舌之快.本文适合有一定计算机基础,初步了解溢出攻击原理,略微了解逆 ...
- C#程序读取MAC地址的五种方法(转)
public class GetMac { ///<summary> /// 根据截取ipconfig /all命令的输出流获取网卡Mac ///</summary> ///& ...
- Swift中文教程(五)--对象和类
原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...
- sql优化的50中方法
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化 ...
- C#在outlook里创建一封邮件到草稿箱
原文:C#在outlook里创建一封邮件到草稿箱 1.引用Microsoft.Office.Interop.Outlook.dll 2. 实现代码 public static int SendToD ...