网站建设工程师职责,wordpress 动态特效,wordpress 禁止保存,如何免费发布个人网站引言 场景中有很多的三角形#xff0c;如果实现可见性和遮挡呢#xff1f;  一个简单的想法是#xff0c;从远到近画#xff0c;近处的物体自然会覆盖掉远处的物体#xff0c;这种画法也叫画家算法。  但是实际绘制中物体的顺序是不容易确定的#xff0c;比如如下图绘制…引言 场景中有很多的三角形如果实现可见性和遮挡呢  一个简单的想法是从远到近画近处的物体自然会覆盖掉远处的物体这种画法也叫画家算法。  但是实际绘制中物体的顺序是不容易确定的比如如下图绘制一个立方体  在空间中两个三角形或者两个面之间的前后关系并不是唯一的如下图所示 
一、深度缓存Z-Buffer 因此我们不能给空间中的三角形定义前后顺序关系也因此不能使用画家算法甚至不能对三角形整体进行绘制。使用什么方案才能实现可见性和遮挡呢  使用Z-Buffer深度缓存。对于每一个像素我们记录覆盖它的物体片段的Z值当循环到一个新的片段时我们比较新片段Z值和像素处记录的Z值如果新片段Z值更大即离摄像机更近覆盖了旧片段则更新像素处的Z值并将此片段的颜色值赋值给这个像素。  伪代码如下所示对于每一个三角形中的每一个像素去计算这个像素是否会被这个三角形的颜色更新。最后就得到了每一个像素处的颜色值。   在现代渲染中我们使用颜色缓存记录每个像素处的颜色值我们使用另一个缓存记录每个像素处的最大Z值这个缓存就叫做深度缓存Z-Buffer。   深度缓存工作流程示意图   深度缓存的时间复杂度为O(n)因为就是求了个最大值而已。  Z-Buffer无法处理透明物体的深度透明物体需要特殊处理。  计算机保存和计算浮点数是有误差的因此基本上两个浮点数永远不会相同。在现实中偶尔会出现深度值相同比如我们自己定义的地板和人脚的深度值通常我们都把他们设置为0这会导致一些不好情况的发生。你可能会有疑问地板和脚是高度是y值怎么是深度呢我们现在所说的深度是指从游戏中摄像机的方向看去也就是说坐标系并不是世界坐标系。比如你玩3A游戏时朝自己的脚看那脚和地面的前后关系不就是深度Z值决定的吗这是因为我们现在讨论的深度是在观察坐标中的即摄像机位于坐标系原点而摄像机朝向的方向就是Z轴(在本课中为-Z半轴)。 
二、Shading引言 
1我们现在能做的 通过之前的内容我们可以通过观察矩阵将摄像机和模型转换到标准位置再通过投影和视口变换将三维空间映射到二维空间再通过光栅化采样和反走样得到屏幕上每个像素的颜色值。   渲染到此就结束了吗如果我们止步于此我们只能得到下图的渲染效果  
2我们期望的效果 貌似这并不是我们想要得到的它看起来并不真实。我们期待看到的应该是这种效果   这张图看起来更加真实一些为什么呢它和第一张图有什么区别吗仔细看第二张图中的立方体你会看到它同一个面的颜色有所不同比如每个立方体的上表面而第一张图无论何时何地每一个面给我们呈现的颜色都是相同的。注意第二张图每个立方体的左侧面它是很暗淡的带给我们一种真实的视觉感。这像是什么呢阴影我们想要还原3D真实世界中的效果就必然要模拟真实世界中的光照、阴影等效果才行。 
3模拟真实的世界 如下图(渲染的)为什么我们能看到的世界是五彩缤纷的  
三、Shading 什么是着色呢引入明暗的不同。着色的定义对不同的物体应用不同材质的过程。  不同的材质和光线的相互作用不同。 
1Blinn-Phong反射模型 Blinn-Phong是一个着色模型它考虑了物体的高光、漫反射、环境光。反射示意图如下   定义v为观察方向、n为法线方向、I为反射方向三个向量都是单位向量。  shading≠shadow即着色不等于也不考虑阴影。对于任意一个片段的着色我们只考虑片段本身不考虑其他任何物体的存在。 
2漫反射Diffuse Reflection 漫反射可以实现物体表面颜色的渐变效果。  一束光从光源发出到达物体某个点再经过反射进入我们的眼睛。计算我们看到的颜色就是计算反射光的强度。  计算反射光的强度先要考虑反射强度即入射光有多少被反射了还要考虑入射光强度即从光源到反射点有多少光被衰减了 
2.1反射强度 某个地方接收到的光照强度使用单位面接接收到的光照能量去衡量。如下图所示物体接收到光的能量与 入射方向和表面法向量间夹角的余弦值 成正比我们使用这个余弦值去代表反射的强度。  
2.2入射光的衰减 考虑点光源的能量是发散的以点光源为球心不断发散到一个又一个的球壳上。能量是守恒的即球壳表面能量之和不变但是随着球壳向外的传播球壳表面积会增大导致每一条光线的能量逐渐变小。  理想化的假设光源每时每刻散发出的能量相同为E则在任意一个时刻t这些能量E一定均匀散布在一个半径为r的球壳上则单位面积球壳具有的能量为E/(4πr ^ 2)。任意一个距点光源距离为r的物体我们可以得知它接收到的能力为E/(4πr ^2)4π为常数因此我们可以得出物体接收到光的强度和它距离光源距离的平方成反比(注意这只针对点光源并且没考虑遮挡)。  
2.3计算公式 点乘为负表示光线射到的是反面没有物理意义所以使用MAX函数。  在真实世界中物体是有不同的材质的物体是会吸收光的能量的kd就是度量的物体对能量吸收的强弱称为漫反射系数。如果kd为0物体就会吸收所有的光而不会有光反射处理导致我们看到的都是黑的比如黑猫效应。kd可以是一个三维向量分别对应物体对RGB三原色的吸收。   最终实现的渐变效果   注意漫反射计算公式中没有涉及v即反射方向因此它代表观察者无论从哪个视角去看看到物体的效果和颜色都是一样的。这是正确的因为漫反射就是表现光向四面八方的反射。  在现实中光是有属性的即光的颜色值(一个三维向量)。而现实中的物体也是有材质的比如金属和木头的反射效果就截然不同因此我们会给物体设置一个材质属性表示它自身材质对光的相互作用这里我们介绍了kd表示物体材质对光漫反射强度的一个度量而材质中还有很多其它的度量。