游戏引擎学习第103天

仓库:https://gitee.com/mrxiao_com/2d_game_2

回顾bug

接下来回顾一下这个bug的具体情况。当前是一个调试视图,我们并不是直接在调试视图下工作,而是在进行相关的调试。展示了地图,这里是环境贴图,上面是正在使用的环境贴图,下面的环境贴图暂时未使用。我们在实现时遇到了一个问题,其中一个贴图反射效果正常,而另一个却没有。

在调试过程中,发现反射的区域并不像预期的那样模糊,反而显示成了一条非常细的狭窄区域,这看起来很不对。经过仔细检查后,似乎没有发现明显的错误,所有的设置看起来都合理。但实际的bug是一个非常简单的问题,原因在于代码中对环境贴图的处理方式出了些问题。
在这里插入图片描述

黑板:精灵卡片和投射方向

问题的核心在于计算反射贴图时,原本以为可以简单地从屏幕空间的UV坐标出发进行反射光线投射,但实际上,光线投射的计算方式存在问题。在做反射计算时,假设从一个顶视图来看,反射贴图与屏幕对齐,并且使用了一个棋盘图案进行测试。目标是模拟从地面(或者视角中的“天空”)向上投射反射光线,以便确定需要反射的区域。

问题出现的根本原因是,使用了屏幕空间UV坐标来决定投射的起始位置,但这种方法只适用于二维的平面投射。因为在实际场景中,物体(如球体、树木等)并不是完全平坦的,而是呈现出一定的透视效果,所以将这些对象作为平面卡片来处理,会导致反射计算的错误。

具体来说,反射计算是基于屏幕空间的二维坐标进行投射,但卡片类型的物体(例如树木)实际上在三维空间中是有高度的,反射的坐标应当依赖于该物体在Z轴上的位置,而不是简单地在Y轴上移动。因此,投射方向错误,导致了反射效果看起来不合理。

反射效果的异常表现为:反射区域在底部正确显示,而顶部则出现了错误。这是由于反射光线的投射方向与物体的法线方向不一致,导致了反射效果的扭曲。当反射光线朝着法线的相反方向投射时,反射区域会被压缩,而朝着正确的方向投射时,反射区域则显得正常。

最终的解决办法是,需要重新计算反射光线的起始点。必须明确物体(卡片)的基准点,并在该基准点上进行反射光线的投射。需要根据物体在三维空间中的实际位置来决定投射方向,确保反射效果与物体的空间位置一致。这需要对物体的坐标进行调整,以便能够正确地计算反射光线的投射起点和方向。通过这种方式,反射效果将得到修复。

总之,需要通过调整基准点和投射方式来修正反射问题,使得反射效果符合预期。

查看game_render_group.cpp中的有问题的概念

首先,问题出在了屏幕空间UV坐标的使用上,特别是如何正确地处理Y坐标。在目前的实现中,直接使用了X和Y坐标来计算反射光线,但这并不适用于所有类型的物体(如卡片类型的精灵)。为了修正这一问题,必须重新考虑如何计算Y坐标。

具体来说,对于卡片类型的精灵,屏幕空间UV中的Y坐标实际上并不应该直接使用,而是应该用一个固定的投射Y坐标。此投射Y坐标将成为投射光线的起始点。此外,真正需要关注的应该是V坐标,V坐标决定了我们在卡片上的位置。V坐标实际上代表了我们在卡片的高度上的位置,因此,它才是计算反射光线的关键。

目前的坐标系统尚未最终确认,但为了确保当前的计算正确,可以暂时假设坐标系统是从底部向上进行计算的,尽管实际情况可能还没有完全统一。接下来的工作将会集中在完善坐标系统的最终确定,确保计算无误并且能够正确处理反射光线。

最终目标是在调整完成坐标系统后,优化计算并确保所有相关功能可以正常工作,确保每个投射光线都能准确地反映物体的位置和方向。
在这里插入图片描述

基于HeightOfCard调整DistanceFromMapInZ

目标是修正屏幕空间UV坐标的计算,特别是对卡片类型物体的Z轴偏移进行调整。首先,对于卡片的Y轴投射坐标是固定的,因此不需要做偏移。但需要根据V坐标来调整物体在Z轴的高度,这个V坐标代表物体在卡片上的垂直位置。

具体做法是,通过将V坐标乘以卡片的高度,来计算物体在Z轴上的偏移。这样,物体的Z高度会根据其在卡片上的位置进行调整,确保反射投射时,物体的高度能够正确反映其实际大小。这个高度可以是树的高度,或者其他任何类型物体的高度。

在计算Z轴的投射距离时,需要根据V坐标来调整。可以假设物体的距离会随卡片的运动而变化,尤其是当物体远离或接近时,地图的Z轴距离会变得更大或更小。特别是,当物体位于卡片的下方时,Z轴的距离是负值,因此需要对这个负值进行处理,以确保反射计算的准确性。

总结来说,通过调整卡片高度的偏移,使用V坐标来控制Z轴的投射,可以解决反射计算中的错误,确保物体的反射效果符合预期。

在这里插入图片描述

黑板:确定投影的高度偏移量

在处理Z轴的计算时,最初的思路是将Y坐标作为固定值,但后续发现需要更加精确的方式来计算。问题出现在如何正确地确定物体在空间中的相对高度,尤其是当物体发生旋转时,原本的Y坐标不再准确。因此,需要重新考虑如何计算物体的Z坐标。

首先,要确保Z坐标的计算方式能够正确反映物体从基准点(例如坐标系的原点)上升或下降的高度。这个基准点应该是一个固定点,通常是坐标系的原点。

接着,游戏引擎需要根据渲染命令的要求,告知物体当前的Z高度,并且提供期望的Z轴高度变化。例如,给定一个“Y到米的转换常量”,表示每移动一个Y单位,在Z轴上所对应的米数。这意味着每个像素所代表的米数会影响物体在Z轴上的实际位置。

最终,调整计算公式时需要确保正确地使用Y的差值来决定Z轴的高度差,而不是直接将Y作为固定值。
在这里插入图片描述

计算ZDiff

为了确保正确的坐标计算,需要对Z轴的差异进行处理。首先,需要从坐标系的原点Y值中减去,得到Delta值,这实际上是Z轴上的差异。接下来,需要将其转换为实际的世界空间单位,通过一个“PixelToMeters”的转换因子,将Z轴差异从像素单位转换为世界空间的代理值。

一旦得到Z轴差异(ZDiff),就不再使用DistanceFromMapInZ,而是使用ZDiff来进行计算。这个值应当是相对于某个固定原点的,这样就能在世界空间中准确反映出位置变化。

此外,还需要注意坐标的符号问题,因为Y轴是相对坐标系统的基准,所以要确保使用Y轴基准的正确值,而不仅仅是依赖于V值,因为V值可能在旋转过程中不再给出可靠的参考值。因此,Y值基准应当作为计算的依据。

关于DistanceFromMapInZ,这个值应该相对于某个假设的原点进行参数化,即距离地图的Z轴值应该考虑到原点的Z轴高度,以便能够准确计算对象在不同高度之间的反射效果。

最后,考虑到高度的差异问题,必须确保能够处理不同地图之间的高度关系。举例来说,如果有两个地图,一个在上方,一个在下方,那么其反射的效果应当基于每个对象的实际高度进行调整。
在这里插入图片描述

将DistanceFromMapInZ转化为更合理的方程式

首先,目标是将方程式简化为一个更合理的形式。首先需要计算出当前位置在Z轴上的位置。该位置将从原点的Z值开始,通过Z差异(ZDiff)进行修改,从而得到最终的Z坐标。如果位置上升,ZDiff将是正值;如果下降,ZDiff将是负值。

接下来,不再使用“距离与地图的Z值”(DistanceFromMapInZ),而是直接使用“地图的Z值”(MapZ)。地图的Z值代表地图实际存在的高度,简化了之前的计算。

计算“距离与地图的Z值”时,只需简单地计算当前位置的Z值与地图的Z值之间的差异。这个差异可以通过从当前位置的Z值减去地图的Z值来获得,这样结果将自动是负值或正值,具体取决于地图位置相对当前的位置。通过这种方法,可以基于法线方向来确定哪个地图应该被选取,确保计算正确并简化了逻辑。
在这里插入图片描述

在这里插入图片描述

初始化数值

目前的目标是清理代码并调整一些参数。在此过程中,假设固定的角色位置FixedCastY(fixed cast position)将位于坐标系的原点。虽然这不是最终的实现方式,但为了简化,暂时将固定位置设为原点。最终,固定位置将需要更多的控制和参数化,因此需要根据实际情况进行调整。

同时,OriginZ暂时被设定为零或其他默认值(例如0.5),以便在没有明确数值的情况下进行计算。在此基础上,FixedCastY的值也可以根据Origin.y来设置。之后,计算PixelsToMeters转换时,通常需要与渲染信息相关联,可以通过设置与PixelsToMeters相关的值来完成。

需要特别注意的是,PixelsToMeters是一个常见的渲染转换,用于将像素与实际物理世界中的单位(例如米)之间的关系确定清楚。这个转换参数需要根据实际渲染情况来进行设置,确保从像素到物理单位的转换准确无误。
在这里插入图片描述

定位EnvMaps

目前还没有完全完成,但已经接近目标。在创建地图时,必须确定每个地图的位置和高度,以便在世界坐标中准确地显示它们。因此,在绘制这些地图时,需要指定每个地图的高度,明确它们在世界中的存在位置。

在设置地图时,可以通过指定位置参数来设置地图的高度。例如,底部地图(zero)可以暂时设置为一个默认的高度,而其他地图(如天空地图)可以设置在距离地面一定高度的位置,比如2米。这样可以为每个地图指定一个合理的高度,确保地图在世界中正确显示。这是一个示例,实际高度值可能根据需求进行调整。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

球太大改小一点

在这里插入图片描述

在这里插入图片描述

在游戏中查看效果

目前有一些不确定的地方,特别是在代码的执行和投射(或是相关操作)部分,具体应该如何进行还不完全清楚。对这些内容的理解还不够明确,因此打算先不做进一步的工作,而是先回顾一下现有代码,确保对整体逻辑有清晰的了解。

目前的状态虽然有些混乱,但计划在深入研究代码之后再决定接下来的步骤。希望能够对当前的实现有一个更好的把握,然后再继续推进后续的开发工作。

暂时禁用采样调试可视化,检查反射效果

回到上面的部分,暂时可以关闭采样相关的内容,这样可以更清楚地查看结果。现在能看到新的反射球体,看起来已经比之前更合理了一些,但依然觉得顶部的反射可能还是有点问题,尽管很难准确判断。实际情况是,顶部反射实际上可能是底部反射的问题,或者可以从另一个角度理解。

当前的视觉效果确实有些奇怪,看起来不完全符合预期,但整体来说,已经有所改进。接下来需要进一步调整和确认,以确保反射效果更加准确。
在这里插入图片描述

在这里插入图片描述

设置EnvMaps值以供测试

目前的设置是,无论世界中的位置如何,所有的物体都会被设置到一个固定的Z坐标(0.5),即处于两个地图之间的中间位置。为了测试,可以暂时将其设置为两个地图的中点,这样可以看到它们是否相似。设置为中间后,结果显示出它们确实非常相似,比之前有所改善。

接下来,可以通过类似之前的设置来进行测试,比如一个地图位于下方(-2米),另一个位于上方(+2米),这时查看效果,发现它已经比之前合理得多,尽管还有一些不确定性,但整体比之前的状态更加理智和可接受。
在这里插入图片描述

在这里插入图片描述

将Origin设置为FixedCastY的中间位置

现在设置的固定投射位置(Fixed Cast Location)是根据原点(Origin)来确定的,假设原点位于物体的中心位置。为了更公平地进行比较,决定将固定投射Y位置设置为原点加上X轴和Y轴的半距,即将物体的中心作为投射位置。这样,投射位置就会位于物体的中心,从而使得不同位置之间的比较更加公正。
在这里插入图片描述

将ScreenSpaceUV设置为{0.5f,0.5f},调查反射的变形

在当前的测试中,设定了固定的投射位置,并将屏幕空间UV设置为0.5,使其位于中心,目的是检查旋转时是否出现异常。由于使用了球形法线贴图,预期应该只在外部区域看到变化,而内部区域应保持稳定。然而,尽管设定了固定位置并停止了位移,仍然观察到了一些不应有的变化,尤其是在旋转时,法线变换似乎没有完全正确。

为了进一步调试,决定加速旋转并调整视图,使得旋转更明显,从而帮助排查问题。同时,开启采样器,观察形状的变化。这些操作帮助确认了在旋转过程中,采样的结果有一些波动。接下来,会进一步检查法线采样和反弹方向的变换,期望能找出问题所在并解决。

目前,虽然外部区域的变化正常,但内部区域似乎还存在不稳定,导致需要进一步处理和调试。这表明在旋转过程中可能需要更精细的法线调整或者其他变换参数需要优化。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对球体周围区域进行Alpha处理

为了进一步测试,决定创建一个测试版本,其中使用了一个球形漫反射贴图。为了实现这一点,首先修改了现有的TestDiffuse函数,增加了一个MakeSphereDiffuseMap的选项。在新函数中,主要的区别在于漫反射贴图中加入了一个Alpha通道,用于确定球体的位置。这样可以更方便地检查球体的效果。

修改的过程中,将原来的法线计算部分去除,改为计算Alpha值,判断根值是否大于零,如果大于零则Alpha为1,否则为0。这样就可以通过Alpha值来裁剪不正确的法线,避免出现不合理的效果。此时,Alpha值使用预乘Alpha方式,并在计算时对Alpha值进行处理。最后,还要确保所有的颜色和Alpha值处理正确,避免覆盖掉原来的数据。

目前,测试已成功运行,但还需要确保在采样RGB值时不会被覆盖,同时需要确保预乘Alpha值的处理正确,以避免出现错误。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看球体,验证BounceDirection是否没有变化

在调试过程中,遇到的球体问题比预期的要复杂,如果不是因为当时状态不佳,可能会更快地解决这个问题。然而,尽管如此,问题已经得到解决。通过观察,发现 BounceDirection 并没有明显变化,保持了相对恒定的状态。通过进一步验证,确认 BounceDirection 并不会发生足够大的变化,以至于导致预期之外的差异出现。因此,推测这一点是正确的。
在这里插入图片描述

考虑可能发生变化的其他因素

在进一步调试时,发现如果 BounceDirection 的计算没有变化,那么就需要检查其他可能发生变化的因素。一个可能的原因是 PZ 值,即OriginZ + ZDiff。另一个因素是屏幕空间的 UV 值,它应该在表面上保持相对常数。因此,决定检查 ZDiff 值的情况,看看当前的计算是否正确。

通过暂时将 ZDiff 从方程中移除后,发现其保持常数,这表明问题可能出在 if 语句的计算上。接下来需要进一步分析,找出为什么会出现如此错误的 ZDiff 计算结果。
在这里插入图片描述

黑板:坐标系考虑事项

在旋转坐标系时,原点位置的变化会导致计算结果发生变化。具体来说,如果从原点开始旋转,随着旋转的进行,球体的某些点会移到原点以下,这实际上符合预期。这意味着,若按照原点来指定位置,旋转后的点会低于原点,而不是像之前那样高于原点。即使调整位置以使球体重叠,球体上某些点的相对位置仍然会因为原点的变化而不同。这表明,今后可能不应继续采用这种指定方式。

设置OriginY以便传递给ZDiff

在调整旋转时,考虑到旋转的影响,原点位置需要进行合理设置。通过设定一个“OriginY”值,可以确保旋转时球体的中心始终保持一致,从而避免旋转过程中位置的误差。这种方法使得球体的中心在旋转过程中保持稳定,不再受到旋转的影响,从而保持一致性。这种调整让计算结果更为合理且可预测。
在这里插入图片描述

关键点

在这里插入图片描述

关闭采样过度绘制并加深球体颜色

为了更好地查看光照效果,需要确保球体的颜色足够暗,因为当前它的亮度过高,导致光照效果无法显示。因此,首先将漫反射贴图的基础颜色设为黑色,以便能够清晰看到入射光对球体的影响。通过调整这一点,可以更好地验证光照系统的表现。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看稳定的球体并允许其再次移动

现在,球体看起来很稳定,效果比之前好多了,虽然还有一些调整的空间,但至少目前的表现已经很好。接下来,可以允许球体再次移动并观察反射的变化,这样反射在运动中的表现看起来就更符合预期了。唯一感觉有点问题的是反射的形状似乎有些奇怪,应该是更弯曲一些,但这需要再思考一下。

另外,目前在边缘出现的双线性采样导致了一些闪烁现象。虽然还不确定该如何处理这种情况,但这可能并不是个问题。如果将这些部分正确地设置为模糊的双线性采样效果,或许这种问题就能得到解决,这也可能是稍后在系列中讨论的一个话题。
在这里插入图片描述

在这里插入图片描述

大小改小看看效果

在这里插入图片描述

在这里插入图片描述

反射是“倒转”的——边缘应该是中心,反之亦然

反射的边缘应该是中心,而中心应该是边缘。出现了反射翻转的问题,需要修正这一不一致的表现。

问:反射我觉得是反向的,至少在垂直方向上

反射效果应该是向内弯曲的,看起来已经非常稳定了,但可能还存在一个数学错误。现在的效果已经比之前好很多,接近预期的结果。如果没有问题,可以继续检查数学部分,看看是否还有需要调整的地方。

调查球体反射似乎倒转的问题

反射效果之所以出现问题,是因为羽化(feathering)效果影响了反射的形状。羽化效果是通过计算反射方向的Y分量来决定边缘的羽化程度。通过去除羽化效果后,发现反射的形状是正确的,反射应该是向内弯曲的,而不是现在的样子。羽化导致了这个问题,因此可能需要改用不同的测试方法来调整羽化效果。总的来说,反射的计算是正确的,但羽化部分需要进行调整。此外,反射的渐变效果没有预期的那样逐渐变暗,可能需要进一步调整。
在这里插入图片描述

在这里插入图片描述

黑板:通过对tFarMap的衰减进行平方处理来加强

为了使反射的羽化效果更加平滑,可以考虑调整 tFarMap 值,使其变化更加渐进。通过平方该值,可以加剧其变化,特别是在0到1的范围内。例如,当该值小于1时,平方操作会将其值进一步减小,这种方式会产生更强烈的弯曲效果。类似于我们之前使用的伽马校正,平方操作会增强反射的弯曲,而开方操作则会平滑反射。这样的调整可能会改善反射图案,使其更加自然。
在这里插入图片描述

在这里插入图片描述

我的猜测是,边缘的法线现在是指向“正上方”,而中心的法线是指向“侧面”

在讨论中提到,当前的反射效果看起来正常。具体来说,边缘的法线现在指向上方,而中心的法线指向侧面。提到的反射曲线,看起来本身是正确的,且反射的部分已经按照预期进行曲线变化。

这个部分并不涉及反射,而是用于逐渐过渡到不同的反射贴图。对于这个过渡部分的曲线,有一些疑问,是否保留这个曲线效果并不确定。一些人认为这种曲线是无害的,甚至可能是有益的,因为这能使中间区域填充其他反射内容。

总的来说,讨论集中在反射的效果和如何平滑过渡到不同的反射贴图,特别是如何在中间区域逐步改变反射的方式。

问:移动它之后看起来不对

左到右的运动看起来是正确的,这种运动方式是合理的。至于上下的运动,问题部分在于,当前缺乏适当的坐标系统来处理上下方向,因此地图可能未能按照预期进行运动。尽管如此,上下运动的效果看起来也符合预期,即它应该表现出像是物体在表面上移动的效果,仿佛它正沿着表面滑动。这种运动方式也符合逻辑,并且是合理的。

球体相对于墙的位置在哪里?如果它在屏幕外面,比如在上面,那就不对了

球体表面反射的行为比较复杂,特别是涉及法线的旋转。例如,若想创建一个法线朝上的球体,反射效果将会不同,仅显示上方的反射。这种球体的法线旋转需要对球体进行特殊处理,调整法线方向。尽管目前还无法直接实现这一点,因为缺少必要的数学计算方法来处理这些变化,特别是对于 Z 轴的计算。

为了实现这一目标,需要通过两条路径来处理法线,一个用于处理躺下的物体,另一个则是处理正常方向的物体。具体来说,当处理坐标系时,如果物体躺下,像素的移动将与屏幕空间中的 UV 坐标相对应。当前的 Z 差异计算不准确,因此需要进行修正。理论上,这个过程可以通过重编译来实现,但要确保所有的坐标系计算都是准确的,仍需要进一步调试。

另外,反射计算中的路径也存在问题,尤其是在处理物体反射和偏移方向时。对于躺下的物体,如何计算反射偏移方向需要进行调整。因此,接下来会集中精力完善坐标系统的处理,并进行相应的调整和测试,确保一切都能按预期正确运行。

改一下法向的坐标(这个地方不是很明白只是验证)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

感觉红色和蓝色应该交换位置

讨论中提到,蓝色的部分应该交换位置,这样才能解决“上向”与“下向”的问题。这个问题将在下次修复,届时将对这些方向进行调整。

你能把棋盘格弄得紧一些吗?我认为如果有更多颜色过渡,问题会更容易显现

在这里插入图片描述

在这里插入图片描述

你只打算支持竖着的卡片和躺着的卡片,还是也支持其他角度?

目前只需要支持站立的卡片和躺下的卡片,其他角度可能不需要处理。尽管如此,考虑到可能的需求,还是决定先实现这两种情况,以防万一。处理这部分内容时,调整坐标系统时应该不会花费太多时间,因此这个调整应该比较简单。

另外,提到蓝色和红色部分需要交换位置,这是“Y轴上和下”问题,计划在下周处理坐标系统时解决这个问题。目前,对整体效果的判断是正确的,看起来一切都在朝着正确的方向进行。

我认为问题的一部分可能是它没有正确地“坐”在地面上

在讨论中提到,当前的并没有完全坐落在地面上,因为它距离地面有8个单位的高度,但并没有达到8个单位的高度,所以它实际上是悬浮的。地面和天空之间的距离不算太远,但也不直接接触。为了能够更好地看到棋盘图案,可以将地面拉得更近,但这会导致棋盘显示得较少。这个问题还可以通过调整其他因素来优化,但目前我们并不清楚这些地图在世界空间中的实际大小,因此需要进一步计算这些值。

此外,当前的坐标系统问题也需要解决,尤其是如何确定单位与实际场景的映射关系。为了准确设置反射的大小和位置,必须明确像素与实际物理空间的关系。这可能需要通过计算每个单位在世界空间中的大小和环境贴图的密度来进行调整。

最后,尽管目前对这些值的设定还不完全明确,但计划通过接下来的坐标系统工作来优化这些参数,以便更精确地控制光照反射等效果。
在这里插入图片描述

很高兴,考虑到软件渲染器

目前的代码执行速度非常快,尽管代码本身还比较粗糙,主要是为了搞清楚数学运算的方式。虽然代码比较简陋,但运行速度却很惊人,这为软件渲染的前景带来了积极的信号。即使是在这台机器上,配备了12个核心,如果将屏幕分成12个区域,每个区域由不同的线程渲染,速度将提升大约12倍。因此,通过并行渲染每个屏幕区域,理论上可以显著提高渲染速度。

虽然这个软件渲染器在教育上具有一定的意义,可能还会变成一个能够实际玩的游戏,这种可能性是存在的。不过,考虑到分辨率问题,虽然软件渲染器可以运行,但它的分辨率较低,因此更希望将游戏运行在GPU上,以获得更高的分辨率和更好的视觉效果。

这是开启优化后的吗?

坦率地说,当前的优化几乎完全依赖于编译器的优化。预计当代码进行优化时,性能应该至少能提升四倍,因为这台机器支持八宽度指令,最多可能提升四倍。此外,通过多线程处理,渲染速度还能再提高大约十二倍。总体来说,当前的性能在经过这些优化后,有可能达到目前速度的五十倍,这确实是一个令人惊讶的结果。考虑到这一点,软件渲染器可能会变得可玩,虽然最初并未预期能够实现这个目标。

还没有线程化吗?

目前的代码完全没有进行线程化,也没有做任何优化。虽然启用了编译器优化,但编译器的优化并没有做太多的改进,这与我们通常会做的优化不同。

展望未来

目前进展顺利,感觉离最终目标越来越近。接下来有两个主要任务需要完成才能继续进行渲染器的开发。首先,需要整理和清理坐标系统,确保这一部分没有问题。其次,需要解决如何处理近场光照的问题,这对于屏幕的表现至关重要。

绿色

当前遇到的一个挑战是如何处理“绿色”部分,特别是如何填充靠近物体的光照区域。虽然可以通过模糊处理来实现天空反射或光照的效果,使其变得更加光滑或有光泽,但对于接近物体的近场光照,尤其是反射这一部分,无法轻松实现。原因之一是缺少足够的数据来正确处理反射,尤其是当物体背后没有详细的艺术数据时。例如,如果房子的后面没有绘制,放置在房子左侧和后方的物体就无法反射。这意味着近场反射可能在技术上不可行。不过,可以尝试使用模糊光源来模拟一般的光照,使整体照明效果看起来合理,虽然这不能做到完美的反射。

那Fresnel呢!!!

可以考虑将一些真实的光照术语纳入到光照计算中,但由于当前采用的是解释性的2D光照方法,这些术语可能不会产生太多实际意义。为了决定反射如何根据角度衰减,需要确定合适的术语和模型,虽然这方面的调整和优化是可以尝试的,但不一定会深入探讨物理基础光照,因为没有足够的正确光源数据支持,这样做可能浪费时间。目标是创造艺术上令人愉悦的光照效果,而非严格遵循物理规律。因此,尽管会进行一些光照模型的计算,但它们更多的是为实现视觉效果,而不是严格的物理模拟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文学习记录之《CLR-VMB》

目录 一、基本介绍 二、介绍 三、方法 3.1 FWI中的数据驱动方法 3.2 CLR-VMB理论 3.3 注意力块 四、网络结构 4.1 网络架构 4.2 损失函数 五、实验 5.1 数据准备 5.2 实验设置 5.3 训练和测试 5.4 定量分析 5.5 CLR方案的有效性 5.6 鲁棒性 5.7 泛化性 六、讨…

USART串口协议

USART串口协议 文章目录 USART串口协议1. 通信接口2.串口通信2.1硬件电路2.2电平标准2.3串口参数及时序(软件部分) 3.USART串口外设3.1串口外设3.2USART框图3.3USART基本结构3.4数据帧 4.输入电路4.1起始位侦测4.2数据采样 5.波特率发生器6.相关函数介绍…

【线性代数】1行列式

1. 行列式的概念 行列式的符号表示: 行列式的计算结果:一个数 计算模型1:二阶行列式 二阶行列式: 三阶行列式: n阶行列式: 🍎计算行列式 计算模型2:上三角形行列式 上三角形行列式特征:主对角线下皆为0。 上三角形行列式: 化上三角形通用方法:主对角线下,…

vite让每个scss文件自动导入某段内容

写了如下一个scss函数,希望自动导入到每个scss文件里面 vite.config.ts里面如下配置 import fs from fsconst filePath resolve(__dirname, ./src/assets/css/index.scss);const Minxcss fs.readFileSync(filePath, utf8); css: {preprocessorOptions: {scss: {…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点&#xff1a…

Java面试第一山!《集合》!

一、引言 在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于…

APP端弱网模拟与网络测试:如何确保应用在各种网络环境下稳定运行

随着智能手机的普及,APP的网络性能成为用户体验的关键因素之一。尤其是在弱网环境下,应用的表现可能严重影响用户的满意度。因此,APP端的网络测试,尤其是弱网模拟,成为了提升产品质量和用户体验的重要环节。 当前APP网…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理,公式,模式,伸缩因子,旋转方向等,推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现,注意…

【Linux】Socket编程—TCP

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…

分布式技术

一、为什么需要分布式技术? 1. 科学技术的发展推动下 应用和系统架构的变迁:单机单一架构迈向多机分布式架构 2. 数据大爆炸,海量数据处理场景面临问题 二、分布式系统概述 三、分布式、集群 四、负载均衡、故障转移、伸缩性 负载均衡&a…

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程: Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你:deepseek R1基于 AnythingLLM API 调用本地…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…

02、QLExpress从入门到放弃,相关API和文档

QLExpress从入门到放弃,相关API和文档 一、属性开关 public class ExpressRunner {private boolean isTrace;private boolean isShortCircuit;private boolean isPrecise; }/*** 是否需要高精度计算*/ private boolean isPrecise false;高精度计算在会计财务中非常重要&…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

CCF-GESP 等级考试 2024年9月认证C++二级真题解析

2024年9月真题 一、单选题(每题2分,共30分) 正确答案:A 考察知识点:计算机存储 解析:磁心存储元件是早期计算机中用于存储数据的部件,它和现代计算机中的内存功能类似,都是用于临时…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

京东 旋转验证码 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 使用的第三方接码平台识别…

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…