实时渲染管线
从场景到一张图,中间经历的就是管线。
管线概述
先把三维空间中的点投影到二维空间屏幕中去,然后再指定每哪三个点可以组成一个三角形。三角形会覆盖屏幕上的哪几个像素点(光栅化 ),对这些像素点进行着色。
Fragment 类比于像素。
根据着色频率,看着色应该发生在顶点着色器还是片元着色器上。因此下图高亮的是两个阶段。
Shader 着色器
着色器 shader 是用来定义任意的顶点,怎样操作任意的像素或者片段。
Shader 是能在硬件上执行的语言,例如 OpenGL 用 GLSL。
网站推荐,只用关注场景如何渲染Inigo Quilez http://shadertoy.com/view/ld3Gz2
uniform 全局变量,每个像素有个固定的光照方向,对于每个顶点法线是插值出来的,因此加 varying。
GPU
现代的图形学发展的目标:
用于执行图形管线计算的专用处理器。
随着 GPU 的发展,有越来越多不同类型的着色器产生,例如能动态产生更多三角形的几何着色器、计算着色器等。
GPU 分两种,一种是独立显卡,一种是集成显卡。
GPU 本身是一个高度并行化的处理器。
核心的数量可以理解成并行线程的数量。
Texture mapping 纹理映射
我希望得到一个三角形,三角形内部填充某个图,怎么做?纹理映射。
如果考虑上图的球,着色我们是能写的,场景里面有两个点光源,Blinn-Phong 算即可,但是球上不同位置有不同颜色,相当于漫反射系数不同。
我们希望在物体不同的位置定义不同的属性,因此引入了纹理映射。
如何定义任何一个点的不同属性呢?
首先意识到:任何一个三维物体,其实它的表面都是二维的。而纹理就是一张图。
纹理映射就是将这张图按照,物体上的一个点和纹理上的一个点的一一对应关系,给它包围在物体上。三角形每个顶点都对应一个纹理坐标。
我们有了图,怎么贴在三角形上?
任意一个三角形都能找到在纹理上它应该在哪个点上。如何找到对应的解决方法:(了解一下即可)
- 美工完成的。
- 自动化过程,给你任何一个模型,可以将它展开成一个平面,并且尽量避免三角形的扭曲。将它和纹理一一对应。(这叫参数化,是一个几何上的重要研究方向~)
怎么把空间中一个三角形映射到纹理上,我们不管。我们就认为已经有了这么一个映射关系,我们直到纹理要如何贴到三角形上,是因为三角形上定义的顶点已经规定了纹理的坐标。
针对纹理定义了一个坐标系,可以指出纹理上任意一个点的坐标 。 注意: 和 都在 这个范围内。(约定俗成)
纹理可被重复利用在不同的表面上。
如果把上图的每个点的纹理坐标显示出来,就是下图。
不同位置也能映射到相同纹理的同一个位置上。
纹理左右重复应该有缝,但是上图没看到,说明纹理设计的好,能无缝衔接。
设计这样的纹理很难,叫 Tilable Texture,需要各种算法,其中一种叫 Wang Tiling,也是值得研究的事情。