一、渲染管线
目前为止,我们前几篇的介绍当中已经把一个3D场景转换到2D的过程几乎讲完了,而这么一个过程就被称为Real-time Rendering Pipeline也就是实时渲染管线,也就是一个流水线。其中包括顶点的变换,光栅化,片元操作。其中顶点操作和光栅化都发生于上图对应阶段,而Z-Buffer则在片元操作中,而着色既可以发生在顶点操作阶段也可以发生在片元操作阶段,这里根据选择的着色频率不同而定,详情见上篇文章。
而在一些图形API中如OpenGL可以在硬件层面人为的调整上述所说的顶点,片元的着色操作,而调整所写的代码语言也就是Shader语言,Shader也就是着色器,可以通过Shader人为的在渲染管线中调整可编程的部分来实现各种各样的效果。(常见的着色器语言如:GLSL,Cg,HLSL......),而需要注意的是,在写Shader过程中并不需要写for循环,因为其中已经默认写好的Shader会对每个像素都操作一遍。
在GPU中,呈现上万的并行操作同时执行来实现渲染在屏幕上画面的效果。GPU每个单独的核心算力并不及CPU,但胜在并行多,也就说当成千上万的像素需要被处理时,GPU要比CPU快的多。并且在硬件层面,许多图形相关计算也已经被写好,完全不用我们自己去写。当然GPU也提供了一些可编程的部分可供开发者自由调整(如我们上面提到的Shader)。
二、纹理映射
当然在片元操作中还有这么一步,叫做纹理映射。纹理,简单的说就是一张图片,他可以贴到物体表面,让物体看上去有更真实的效果。而实际上,它所定义的是模型表面任何一个点它的属性,这里我们理解为漫反射系数/颜色,实际上,它能定义的东西非常多包括法线方向等等。
那么,纹理究竟是什么呢?简单的说,任何三维的物体展开之后,它的表面都是一张二维的图,而通过需求去自定义这么一张图(如上面的木头纹理),贴到物体表面,就是纹理。如上图地球仪和地图的关系。
可以将物体表面拉伸压缩,变成一个规则的1x1的图,来存储模型表面上的各种信息,当需要的时候将它贴上去。而对应空间中的每一个三角形,在二维的纹理上都有一个三角形与之对应来决定它 的属性,就是纹理映射。(如上图的模型眼睛部分的三角形映射关系)
上图所示,任何一张纹理都被人们压缩在一个uv坐标中,其中u轴和v轴的范围都是0~1,方便处理,而对应每个三角形的顶点,都有相应的(u,v)坐标与之对应。
纹理是可以多次复用的,如一个地面的瓷砖如上图,而为了观感好人们通常在设计纹理的时候,通常会让纹理重复边界的地方处理的很美观,以至于看不出来是重复的生硬贴图,其中有一些算法,感兴趣的朋友可以自行了解。
三、总结
本篇着重为大家介绍了纹理映射,我们知道了模型上所有三角形顶点对应纹理上的uv坐标,那么三角形中间的所有点的uv坐标值怎么确定呢?这就需要进行插值运算和重心坐标,而这两部分内容我们下一篇来介绍。
参考:
Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)_哔哩哔哩_bilibili