Visubility可见性问题
需要解决物体绘制在屏幕上的先后顺序
Painter’s Algirithm:先绘制远处物体,再逐渐把近处物体堆叠上去遮挡远处的物体
但是难以解决相互遮挡的问题。因为空间中的遮挡关系不是一个偏序关系,不满足传递性。
引入深度缓存z-buffer的概念
转换思路,从对物体排序到对像素排序,每次记录每个像素最浅位置的几何体
- frame buffer stores color values
- depth buffer stores depth
算法:
1 | for (each triangle T) |
Question:
两个几何体有深度完全相同的点?
与MSAA的结合,不是对每个像素做z-buffer而是对每个采样点
透明物体不能用z-buffer
About Shadding
定义:
noun. The darkening or coloring of an illustration or diagram with parallel lines or a block of color.
The process of applying a matetial to an object.
着色与光照、与材料的关系
Simple Shading Model(Blin-Phong Reflectance Model)
Specular highlights, Diffuse reflection, Ambient lighting
三种光的区别是什么?如何描述?
考虑一个shading point,假设其邻域是一个极小的平面,从而可以定义
- View direction
- Surface normal
- Light direction
- Suraface parameters….
需要注意,shading not equals shadow。着色不考虑其他物体的存在,只考虑这个点自己,所以shading具有局部性。
Diffuse Reflection:
考虑单位面积接收到的能量,余弦定理易得。
Light off: 光的能量传播认为以球壳形状传播,光的能量应该与据光源的距离的平方成反比
能量接收与反射,看到的光是因为物体表面反射光,所以亮度与光的吸收率有关。
漫反射往四面八方反射的光的强度应该与观测角度无关
Specular Term:
观察方向与镜面反射方向相同或接近时,看到高光。
巧妙的变换:镜面反射方向与观测方向的角度等于法向方向与half vector的角度
强度是一个指数关系–高光往往只局限于很小的区域
Ambient Term
接收环境中的光
假设:每个点接收的环境光的强度都是相同的。环境光来源是四面八方,与光的源头无关,与观测的角度无关,与shading point的法向无关,所以是一个常数。
但是上述假设较为粗糙,经过了很大的简化。
L = La + Ld + Ls
= Ambient Term + Disfussion Term + Specular Term
但是Blin-Phong模型是一个很简化的模型
关于Shading Frequencies
Flat shading.三角形取三个点,确定一个平面,平面内色素值相同
Gouraud shading:对顶点上取点做shading,内部差值
Phong shading:对每个像素做shading
问题:
逐顶点的法线:用该顶点相邻面法向的平均,是否需要根据相邻面的大小进行加权平均?
已经知道顶点法线,如何得到内部点平滑的法线方向?
给顶点差值得到(利用重心公式)
Graphics(Real-time Rendering) Pipeline(图形管线)
1.含义:一些列操作,从三维空间中的点到图像
Input: vertices in 3D space –>> Vertices positioned in screen space –>> Triangles positioned in screen space –>> Fragments –>> Shaded fragments –>> Output: image
2.open-GL的shader program example
1 | uniform sampler2D myTexture; |
Texture Mapping
1.如何定义物体的属性?
只研究物体表面,3维物体的表面是二维的
2.纹理映射到uv坐标系
Barycentric coordinates
为什么需要插值?
将三角形顶点的性质平滑延拓到内部,比如Texture coordinates, colors, normal vectors, depth
差值方法是利用重心坐标对三个顶点的属性进行线性加权
重心坐标的问题:不能保证在投影下重心坐标的不变性,所以重心坐标只适合二维平面的差值而不适合三维空间。所以三维空间中的属性建议先在三维空间中做插值在映射到二维平面
Applying Texture
利用重心坐标可以计算得到采样点对应的纹理坐标,在uv空间得到颜色
1 | for each rasterized screen sample(x,y): |
过于简单出现问题:
Texture Magnification.纹理太小,对应的纹理坐标不是整数。
A picel on a texture – a texel.
解决办法:
Nearest,将最邻近的整点texel的像素作为值,但是是一个一个的方块
Blinear interpolation,根据相邻四个texel的像素值在u方向与v方向进行线性插值。
Bicubic interpolation,取16个点
Texture Magnification.纹理太大,会带来走样的问题
屏幕上像素在纹理空间覆盖的区域大小不相同,覆盖大的区域的像素值如何获得?能直接用覆盖区域中心的texel的值吗?
解决方法:
超采样:类似的MSAA,增加采样点的数目,对于屏幕上每个像素增加采样点数目,在纹理空间采样。
或者不采样:计算纹理空间覆盖区域的平均值。但是如何获取覆盖区域?
Mipmap: Allowing(fast, approx, square)range queries
Mipmap由一张图生成很多图,做法类似于2X2的池化,降采样的概念同CV中的图像金字塔。
如何进行区域查询?对于屏幕上的一个像素,计算与相邻像素在纹理空间的距离,以距离的一半作为在纹理空间上覆盖区域的边长的一半。
如何利用Mipmap查询区域的像素值?D = log2L,寻找对应层上的像素。如果D不是整数怎么办?先利用双线性插值在相邻两层间插值出对应位置的像素值,再在层与层之间做一次插值。
但是MipMap的问题:出现Overblur,对于远处物体会模糊其细节。
Anisotropic Filtering(各向异性滤波):部分解决三线性插值的问题。MipMap做长宽相同的图,Anisotropic Filtering做长宽不同的预计算。
点查询问题与范围查询问题?平均范围与其他范围查询?
Application of textures
Environment Map:
将四面八方的光记录下来就是Environment Map.
Spherical Map:
将环境光记录在球上再展开,但是存在问题:球面产生扭曲–>>cubic map,用立方体记录环境光
Bump Mapping 凹凸贴图:
存在问题:自己的阴影不会影响自己的shading
纹理记录深度信息(如相对深度),会带来法线方向的改变,从而影响shading
- 假设原本表面是一个平面,法线方向是(0,1)
- 运用凹凸贴图后,如何计算法线方向?dp = constant * [h(p+1)- h(p)]用差分的方法得到切线方向(1,dp),最后利用切线方向得到法线方向(-dp, 1)
- 3D空间的发现:平面法线(0,0,1),(u,v,p)–>>计算dp/du与dp/dv,计算得到梯度,最后法线方向(-dp/du, -dp/dv, 1)
Displacement mapping:
移动顶点的位置,效果更好,但是要求模型的小三角形足够细。
3D Procedural Noise + Solid Modeling
3维纹理,用一个表达式定义一个三维噪声
Volume Rendering
记录三维信息