games101学习:shading (着色) 1 (lllumination,Shading and Graphics Pipeline)
今天要学习的东西是
可见性问题:Z-buffering(解决距离相机远近的图像重叠的正确性)
shading(着色):解决方法 & 如何分析光照 & 现代硬件图形管线。
如果一张图里面有多个物体,每个距离摄像机的远近不同,如何正确处理遮盖关系?
解决方法:先从z远往近写进去framebuff(画家算法)。但这样也没办法完全消除遮盖关系,而且也浪费算力。
现代人常用的叫做Z-Buffer

越远越白,越近越黑(右边)

算法
1.首先初始化深度缓存区的数据为无穷大
2.对于一个任意的三角形,如果z值小于【x,y】坐标的zbuffer,就将像素信息写道framebuffer中,且将该z值写入zbuffer中。

大概是这么理解。R代表无穷大。在c++中代表FLT_MAX这个数


着色的定义:引入了由于光源导致的亮暗颜色深浅的问题。
一个简单的着色模型:Blinn-Phong Reflectance Model
Specular highlights 高光
Diffuse reflection 漫反射
Ambient lighting 间接光照


表面参数,有颜色和光滑程度。
漫反射,当有光线射来,光线会均匀的向四周射走,这种叫做漫反射。

高光:Blinn-Phong解决高光问题

为什么有p次方?
p大到64的程度,在20度左右就看得到高光。在Blinn-Phong模型下大概用的p是100-200

环境光的影响,全局光照。

环境光Ambient + 漫反射光Diffuse + 高光Specular = 不令风反射模型Blinn-Phong Reflection

着色频率:着色应用到哪些点上。对于每一个平面有四个定点,每个顶点都算出对应的法线,每一次顶点都做一次着色。
三个顶点围成一个三角形,三角形的内部的点是什么颜色,可以通过插值的方法算出来。
逐像素做着色。

逐顶点的法向量是什么?
任何一个顶点,会和不同的三角形有所关联,很多三角形共用一个顶点,面法线很好求,顶点的法向两其实就是多个面的法向两的加权。


求出来法线别忘记归一化。
归一化,就是化为单位向量。
从一个场景到最后一张图最终实现了什么一系列操作,这个一系列操作就叫做 graphics pipeline GPU进行的操作就是这样的。

GLSL语言来写着色器shader

http://shadertoy.com/view/ld3Gz2 小网站可以免去写opengl,只需关注场景如何渲染,只需要写着色器即可。
GPU 可以理解为高度并行计算的处理器
纹理关系有个uv (0 < u,v < 0) 三角形三个顶点,每个顶点都对应一个(u,v) ,这就是纹理映射。(怎么知道的你别管,假设已经知道了,由美工来搞)

如何知道三角形内部任何一个点他对应的纹理坐标(u,v):插值
插值意思三角形的三个顶点有各自不同的属性,如何把这个属性在三角形内部的做一个平滑的过度。 (中心坐标)
为什么要在三角形内部做插值 :我们有很多操作是要在三角形的顶点完成/计算。在三角形内部希望平滑的过度,
重心坐标概念:在A,B,C三角形所形成的平面内任何一点(x,y)都可以表示为这三个顶点A,B,C坐标的线性组合。

求出这个 afa beita gama 就可以得出这个三角形的全部点。(afa neota gama必须非负)
如何计算:(公式)这里的A指的是面积

求重心的公式

可以用重心坐标做任何一个点在三角形内部的点的颜色的插值。

** 重心坐标有一个问题,在投影变化下是不能保证重心坐标不变的。投影到另一个平面的的重心坐标可能是会变化的。 **
想插值一些三维空间中的属性,就应该取三维空间中的坐标。

近处和远处一个像素覆盖模型的区域不一样。
浙公网安备 33010602011771号