什么是shading
- 不同的物体应用不同的材质的过程
- 就是计算出物体具体应该在的地方,物体的光照,物体本身应该有的材质。
Blinn-Phong Reflectance Model(Blinn-Phong反射模型)
Blinn-Phong Reflectance Model是一个简化模型
shading point
Shading is Local
- shading是局部的,在shading不考虑其他的物体存在,就考虑当前像素点本身,也就不生成阴影
Diffuse Reflection(漫反射)
漫反射结果和观测方向无关
Lambertian (Diffuse) Shading
Specular Term (Blinn-Phong)(镜面反射(高光))
Ambient Term(环境光)
Blinn-Phong中将环境光看成一个常量
Blinn-Phong Reflection Model的一个生成过程
Shading Frequencies(着色频率)
不同的着色频率的差异
Flat shading(平面着色)
根据每个三角形的法线计算着色效果。着色计算只执行一次,整个三角形都采用计算结果的颜色。
Gouraud shading
针对每个顶点计算,而后对每个顶点的结果颜色进行线性插值得到片元的颜色
Phong shading
在每一个像素上都进行一次着色
和发明Blinn-Phong Reflection Model的人是一个人
Graphics (Real-time Rendering) Pipeline(实时渲染管线)
Shader Programs
现代的GPU允许用户通过编程来解决顶点和像素如何做着色,这就需要用户来自己写Shader,Shader本质上就是一个能在硬件上执行的程序。
http://shadertoy.com/view/ld3Gz2
Texture Mapping(纹理映射)
纹理映射技术,是一种将图形绘制(映射)到表面的技术
确定每一个三角形的顶点在texture上的位置![图片](https://img-blog.csdnimg.cn/img_convert/7ffe3945d49eeda26ead8390b3f08e25.png
Barycentric Coordinates(重心坐标)
重心坐标推导
重心坐标计算
重心坐标的缺陷
重心坐标并不是永久不变的,在经过投影后,重心坐标可能会发生改变。因为在投影之后,原来的三角形会发生变形,点的相对位置就会发生改变,投影之后计算出的重心坐标和投影前的重心坐标就并不相同。
所以要插值一些三维空间的属性时,要先在三维空间中算出重心坐标,然后再用在三维空间中算出重心坐标进行插值,而不能使用投影之后的坐标进行插值。
因为要考虑的深度的因素。三角形投影到屏幕上,覆盖很多像素,像素都有中心,可以判断出像素的中心在投影到屏幕上的三角形的某一位置上,在投影的三角形里对三个顶点的深度做插值,这种算法是不对的,因为三角形在投影到屏幕的过程中会经过一个深度测试的过程,其中深度值较大的顶点会被丢弃,所以如果用投影后的三角形的重心坐标计算插值,可能就会少某些顶点或者说对应的顶点的属性发生改变(因为没有通过深度测试的顶点被丢弃了,在这个位置上时其他不同属性的顶点)。而正确的做法是找到这个这个像素对应的三维空间中的三角形,在三维空间中将深度插值好,然后再放回来。
原文出处
Applying Textures
Texture Magnification
当纹理过小时
低分辨率纹理放大到高分辨率时
Bilinear Interpolation
求2次线性插值,所以叫双线性插值
当纹理过大时
会出现的情况
为什么会有这个问题
近处一个像素覆盖的纹理区域相对较小,在远处一个像素则覆盖了一片纹理。屏幕上的像素覆盖的纹理大小是各不相同的。如果是近处,用像素中心去纹理上进行取样,在一小块纹理上,采样中心的对应的纹理做一小片纹理区域的平均值问题不大;但是当远处用像素的纹理中心进行采样时,采样中心对应的纹理做一个很大块纹理区域的平均值就有问题
解决方案(超采样)
但是超采样的花费太大
Mipmap
左图为屏幕上的像素点,右图为纹理空间。可以看到,左图的一个红点到上下两个红点都是一个像素,将这三个红点映射到纹理空间时,我们要求左图左下角的红点像素在纹理空间中要占据多少范围(即右图中的不规则四边形区域)。因为MipMap只能在正方形范围内进行查询,所以我就只要求在纹理空间中左下角的像素到上下两个像素距离的最大值,然后将这个最大值作为正方形范围的边长(因为在像素空间中,两个像素之间的距离就是一个像素正方形的边长大小,所以在纹理空间中也是求响铃像素的距离作为原像素点在纹理空间中所占范围的大小
Minmap结果
可以看到结果过度模糊了
为什么会Overblur
MipMap只能在一个方形的区域内查询,如果不是方形区域呢?后面的三线性插值都是一个近似的估计,近似的太多,远处就会出现这样一种过度模糊的效果
解决方案(各向异性过滤(Anisotropic Filtering))
原文出处
MipMap的工作:给一张原始的图,长宽各缩小一半,做的就是下图中对角线上的工作。
但是有一些图的长款并不同,MipMap则没有功能对这些图进行处理。可以看到上图中,在水平方向上,高度没有变,但是宽度被不断的压缩,而在竖直方向,宽度没有变,高度被不断的压缩。也就是说,各向异性过滤比MipMap多做了这些工作,能够为宽高不均匀的图片进行压缩。
从上图中可以看出,屏幕上的像素映射到纹理空间上时,并不总是一个规则的形状,可能会出现这种斜的长方形,数值的长方形或者别的形状。
如果在长方形上还用正方形来进行范围查询,那么就会在一个很大的并且多余的范围内进行查询,精度就会下降,所以就会更糊,而用长方形的范围查询则能够直接在目标区域上进行范围查询,效果就会更好,至于斜的长方形,用各向异性过滤也会出现在一个比原来更大的长方形范围内进行范围查询,所以还需要别的方法来解决。