游戏引擎学习第106天

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

回顾我们当前的情况

编写一个完整的游戏,没有使用任何库或引擎,完全依靠传统的编程方式进行开发。目前,我们已经完成了渲染、实体存储等很多基础工作,接下来可能会开始做一些性能优化,尤其是渲染部分。现在,已经准备好在接下来的一到两周内,开始对渲染器进行优化,因此离最终的引擎完成越来越近。

暂停了坐标系统的测试功能,恢复了原本的游戏图形内容。接下来,重点会放在调整 Z 轴的渲染逻辑上,因为这是目前引擎架构中尚未完全解决的部分。为了更好地处理 Z 轴的渲染,打算将渲染代码改成使用坐标系统进行绘制,这样可以更方便地进行缩放操作,并且在后续优化渲染时可以更好地查看不同元素的堆叠关系和缩放效果。

虽然这样做可能会导致帧率下降,但目前并不在意,因为后续会对渲染器进行优化。目标是实现能够缩放世界的绘制系统,这样就能查看不同物体在不同缩放下的表现,从而帮助调整渲染效果。

总之,目前的重点是解决 Z 轴渲染问题,并确保系统能够正确处理缩放操作,进一步完善引擎功能。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看 game_render_group.cpp

在游戏渲染组中,当前我们有一个 DrawRectangleSlowly 的调用。实际上,没有理由不能直接使用这个函数来绘制我们的位图。我们处理的推送缓冲区本质上就像一个流处理器,它从流中读取数据,并根据数据执行相关操作。因此,我们可以自由地改变绘制位图的方式。以前的绘制方法是这样的,但现在我们可以选择不同的方式进行绘制,比如调用 DrawRectangleSlowly 这个函数。

为了实现这一点,我们只需要传递输出目标,并构造所需的其他参数。这样,我们就能改变绘制的方式,而不需要担心会破坏已有的结构。我们知道需要一些其他的参数来完成这些操作,这样就能确保渲染符合预期。

使用 DrawRectangleSlowly 函数渲染位图

目前已经知道我们在处理的位图是什么,以及我们并没有使用法线贴图或其他任何类型的贴图。PixelsToMeters 是我们计算出来的一个值,因为之前并没有这个值。为了避免它在代码中频繁出现,决定将其提取到一个变量中,这样就不需要每次都重复计算了。

接下来,将这个变量 PixelsToMeters 放到顶部进行预计算,这是其逆运算的结果,和 MetersToPixels 对应。现在基本上已经准备好了,只剩下一个问题,就是确定位图的放置位置。原点已经确定了,是 pxpy,如果将这些变量提取出来使用,就能很清楚地知道该放置在哪里。

X 轴和 Y 轴是标准坐标系,因此可以直接使用。而颜色值则是传递给函数的参数。通过这些信息,就可以理论上调用相应的绘制函数,确保一切按预期进行。
在这里插入图片描述

出现了一个段错误看看什么原因

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过慢路径调用?

在调用慢路径时,注意到一个问题:传入的位图必须包含整个图像的像素大小,这意味着如果传入的是整体大小,绘制出来的将只是一个像素,导致只能看到像素点。为了改善这一点,可以将每个像素的大小调整得更大一些,这样就能看到每个小像素的显示效果。

有时候,错误和问题反而比正常的实现更有趣。接下来,发现了一个问题:目前传递的 X 轴和 Y 轴包含了整个图像的缩放比例,因此,需要根据位图本身来调整绘制的大小。为了确保能正确地指定高度,理论上可以直接将位图信息传递给绘制函数,无需特别的额外处理。
在这里插入图片描述

在这里插入图片描述

在游戏中查看,考虑到代码的低效

目前的代码执行速度较慢,这反映出计算的开销其实不小。虽然这段代码非常低效,甚至做了许多无谓的操作,但结果仍然比预期的要好,尤其是在一台五年的老电脑上。这表明,虽然代码优化程度不高,性能依然保持得不错,这为未来的优化奠定了良好的基础。

当前的低效率部分,除了计算的优化,还包括没有对精灵进行预剪裁。比如,精灵图像本应该只处理有效像素区域,而现在却处理了整个矩形区域,这无疑浪费了计算资源。如果对精灵进行剪裁,可以进一步提升性能。然而,目前来说,速度并不是最关心的问题,主要关注的是视觉效果。

现在通过这种方式绘制图像,可以让游戏在缩放时表现得更好,虽然这也带来了一个新的问题:是否应该对每个精灵单独进行缩放,或者先将图像绘制到一个缓冲区中再进行缩放。这个问题目前还不确定,需要进一步思考。

黑板:缩放

目前处理地面瓦片时,有两种可能的方案来实现不同高度层次的效果。第一种方法是先将所有地面瓦片渲染到一个缓冲区,然后再对这个缓冲区进行缩放;第二种方法是将每个地面瓦片单独缩放,使每个瓦片的显示更大。

第一种方法的优点是速度较快,因为只需对整个缓冲区进行一次缩放,不需要逐个缩放每个瓦片。但缺点是会增加一次额外的缓冲区拷贝操作,这可能会影响性能,尤其是在内存带宽有限的情况下,这种额外的拷贝可能会导致性能下降。

第二种方法的优点是避免了缩放过程中的问题,尤其是当需要将远处的地面瓦片缩放填充整个屏幕时。如果直接进行缩放,原始缓冲区的尺寸需要远大于屏幕尺寸,这会导致非常大的内存使用和潜在的性能问题。因此,这种方法建议直接以正确的大小渲染物体,而不使用中间缓冲区。

尽管如此,考虑到某些情况下需要进行中间缓冲的处理,未来可能还会需要根据具体情况调整缓冲区的使用方式。

黑板:中间缓冲

在支持多个地面层次的情况下,设想一个场景,其中有多个不同的地面高度层。当前视角下的地面层为最高层,而接下来的两个层分别位于其下方。

当角色在场景中移动,尤其是上下楼梯时,摄像头视角需要随着角色的动作而变化。具体来说,当角色向上移动时,新的地面层次应该成为当前视角的显示层,即需要“上移”视角,使得新的层次出现在视图中。

为实现这一点,可以使用渐变淡入效果(alpha fade)来平滑地过渡到新的层次。具体方法是,在底层几何体上方渐渐显示新的地面层,避免突兀的变化,从而确保视觉体验的平滑和自然。

黑板:愚蠢的方法

决定不直接解释使用某种方法可能出现的问题,而是直接进行实现。通过实现“笨方法”来展示这种方式的问题,进而讨论如何解决这些问题。暂时没有实际的楼梯模型,需要请求设计师绘制一个楼梯图形,以避免不断假设场景中有楼梯。

临时设置箭头键上下移动相机

为了临时测试,决定通过键盘的方向键来移动摄像机上下,而不是通过控制英雄角色的移动。为了实现这一点,修改了代码,添加了一个合成的Z轴偏移量,可以控制摄像机在Z轴上的位置。通过调整该偏移量,可以模拟缩放效果,观察在不同的缩放比例下场景的变化。

为了控制摄像机的缩放,设置了一个速率变量,并在每帧根据时间增量调整Z偏移量。通过按键触发摄像机在Z轴上的上下移动,从而实现缩放效果。测试时,设置了一个初步的缩放速率,使其能快速看到缩放效果。接下来,还需要进一步调整缩放的细节,比如根据缩放效果调整其他物体的显示大小,并且考虑到透明度的处理,使得不同层次的地面在缩放时能够合理显示。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

减少 ZFudge 因子

问题可能出在缩放系数过大,之前计划推迟到今天再处理的GetRenderEntityBasisP部分还没有完成。这个系数会将米转换为像素,目前的值过大,导致缩放过快。为了调整这一问题,考虑将这个系数调小,使得缩放速率更符合预期。接下来需要进一步思考该系数的合适值,以确保摄像机的缩放动作能够平滑并符合场景的需求。
在这里插入图片描述

在这里插入图片描述

看到位置正在缩放,并继续缩放大小

目前的位置已经进行了缩放,但物体的大小尚未缩放。这是因为在缩放过程中,虽然位置使用了ZFudge值来进行缩放,但大小却没有同步调整。为了处理这个问题,可以将物体的缩放值(ZFudge)应用到精灵的大小上,使其与位置的缩放一致。具体做法是,在获取渲染实体基础信息时,不仅返回位置,还需要返回缩放值。这样就可以在绘制时将位置和大小一起缩放,从而保持一致。通过将宽度和高度乘以相同的缩放因子,物体的大小也能够随缩放调整,从而实现更加一致的缩放效果。
在这里插入图片描述

在这里插入图片描述

在游戏中查看缩放并注意到树木弹出的问题

当物体缩小时,缩小效果变得真实而非假象。这表明之前编写的代码现在起到了良好的作用,使得物体的缩放效果更加自然,像树木的效果也更显著。不过,目前仍有一些问题需要处理,尤其是地面块的表现不尽如人意。此外,观察到在放大时,树木的顶部出现了异常,可能是精灵构造的问题,而非代码bug。之前提到过的,所有物体周围需要至少一像素的空白区域,以确保显示效果正常,这个问题可能是由于没有考虑到这一点导致的,虽然在视频压缩中可能难以看到,但这个问题是存在的。

给地面块设置 ZOffset

缩放问题可能是因为没有给地面块提供正确的Z值。需要将Z偏移值添加到地面块的渲染中,否则它们无法正确缩放。在处理地面缓冲区时,执行PushBitmap操作时,需要将相机的偏移量也考虑进去。添加这个偏移量后,地面块应该能正确缩放。然而,问题依旧存在,因为当前的基准点(EntityBaseP)和偏移点(OffsetP)并没有被正确处理。之前提到过,由于使用2D,Z偏移只基于基准点,而不是偏移点,这在昨天已经讨论过。因此,Z值的应用需要进一步调整,确保缩放正确。
在这里插入图片描述

黑板:防止倾斜

为了确保物体的位置和缩放发生变化,但堆叠在一起时不会倾斜,采取了直立的缩放方式。举个例子,想象一个由三部分组成的雪人,它的地面点会缩放,但这些部分的位置不会改变,保持垂直,即使从透视角度看可能会使其看起来倾斜。决定保持这种直立的缩放方式,因此不能直接传递一个包含位置和缩放的参数。

为 GroundBuffer 做 Basis 推送

需要将位置信息放入基础(basis)本身,这并不复杂,只是意味着每次执行操作时,必须进行基础的推送。具体来说,每次执行这些操作时,都需要进行推送,缩放基础将包含一个位置(Delta),并且目前没有为位图指定偏移量,因此位图的偏移量始终为零。基础将捕获所有关于位置的信息,这是渲染器当前的工作方式。因此,p值应该是Delta加上Z偏移量。
在这里插入图片描述

我们接近了,但东西的缩放方向相反

虽然已经接近完成,但位置缩放似乎还是没有正确对齐。随着缩放,物体的位置没有按预期显示,缩放效果反向出现,导致所有物体的缩放位置不对。为了修复这个问题,需要检查位图对齐和相关的处理方式,找到原因。可能的原因是在渲染过程开始时进行的平移和对齐操作比较随意,需要进一步整理和优化。现在的目标是分析坐标系统的工作方式,理解缩放发生的时机和应用对象,以便找出问题并加以解决。这一过程的重要性在于,解决这些之前没有认真考虑的问题,能大大提高系统的准确性和效果。

暂时关闭地面块和调试矩形

为了简化调试,决定暂时关闭地面块,因为它们当前并不必要。同时,也需要修复矩形的缩放问题。矩形的尺寸应当与缩放值匹配,因此需要在获取基础位置时应用缩放,确保矩形尺寸随之调整。为避免一次修复过多内容,先关闭其他部分,专注于当前要讨论的内容。这些调整将有助于确保系统在缩放时正确地调整矩形尺寸,达到预期效果。

在这里插入图片描述

在这里插入图片描述

好好看看游戏中的情况

在进行缩放时,出现了一个奇怪的现象:当缩放操作进行时,角色会发生横向移动,这种移动并没有逻辑依据,显得非常不自然。实际上,缩放时应该不会产生这种效果,这显得视觉上完全不合理。然而,有一个有趣的现象:现在可以看到模拟区域在随着移动时,从世界中拉取物体,这些物体属于模拟集合的一部分,这一变化让系统的行为变得更加直观。

为了修复横向移动的问题,需要查明到底是哪部分导致了这个问题。很可能是因为没有正确地缩放各个元素,或者不同的物体在不同的Z轴位置上,导致它们的缩放效果不一致。因此,需要确保缩放是围绕屏幕中心进行的。理想情况下,缩放应该以屏幕中心为基准,所有物体应当在相对稳定的情况下缩放,彼此之间的相对位置不应受到影响。

围绕 ScreenCenter 进行缩放

问题出在缩放操作时使用的偏移量(OffsetXY)。在进行缩放时,原本应该将所有物体围绕屏幕中心进行缩放,而不是在当前的位置进行偏移。当查看到偏移时,发现它引发了各个物体之间相对滑动的现象。实际上,偏移量X Y原本是用于调整物体位置的,但它在缩放过程中导致了不一致的表现。

通过关闭偏移量,问题得以显现,证明了这个偏移量在缩放时产生了不正常的影响。解决方法是确保偏移量的使用符合预期,或者将其从缩放计算中移除,以确保所有元素正确围绕屏幕中心进行缩放。
在这里插入图片描述

领悟时刻:EntityBasis->Offset.xy 目前不正确

当前的英雄角色所有的精灵都在同一水平线上,尚未进行裁剪,因此在偏移量(X、Y)上并没有实际的效果。这个偏移量本应用于使英雄的不同部位位于不同的高度,比如让头部高于身体,但目前所有精灵的值都是相同的,所以即使关闭偏移量,角色看起来也不会有明显的变化。然而,在重新构建之后,偏移量就会起作用。

问题的关键在于,偏移量X、Y的值仍然被设置,只不过当前只用于位图对齐。具体来说,这个偏移量并没有在精灵的头部或身体的实际位置上产生影响,而仅仅影响位图的对齐方式。

因此,目前这些偏移量实际上并没有被用来调整角色部位的高度差,只是在位图的渲染时起作用。

黑板:当前 Offset 的工作方式

在使用位图时,首先确定了一个点用于放置位图,并且有一个偏移量来确定该点的位置。实际上,位图的处理顺序是倒过来的。首先定义了一个位移量,表示角色或物体的位置,然后需要根据位图的矩形尺寸调整位置,以确保在绘制时,位图能够正确对齐。

换句话说,首先确定了目标位置,然后根据位图的尺寸进行调整,以确保绘制出来时,位图的每个部分都能正确显示。

将 Offset 乘以 ZFudge

这个偏移量确实需要乘以Z轴的修正值,因为当位图的尺寸发生变化时,偏移量也需要相应调整。比如,如果这个矩形变得更大,偏移量就需要相应增加。这样做是为了确保随着位图尺寸的变化,位移量也能正确地反映出来。

当前不使用偏移量的Z值是正确的,因为这是为了保持物体的垂直对齐,类似于雪人的例子。但是,必须对偏移量进行缩放,因为当位图的大小发生变化时,偏移量也会随之不同。因此,这之前忽略了这一步,实际上是一个需要避免的错误。现在,当进行缩放时,效果是正确的。
在这里插入图片描述

在游戏中查看并重新开启地面块

现在,当地面重新显示后,能够看到当角色移动时,世界的元素(如地面块)会根据需要填充,这种效果显得很有趣和直观。通过缩放,可以更好地看到世界的布局,提供了清晰的视觉反馈。当缩放回去时,一切似乎稳定了,看起来也不错。

不过,跳跃功能仍然存在一些有趣的问题。当前,角色在跳跃时会变大,这看起来非常搞笑,虽然这并不是预期的行为。虽然这种变化有些滑稽,但也许可以通过引入偏移量来解决这个问题,或者干脆保留这个搞笑效果。

总的来说,今天的工作显得有些零散,虽然如此,主要问题还是集中在跳跃时角色变大这一点,值得进一步调整或考虑。
在这里插入图片描述

打开地面绘制

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

展示一些透明度渐变问题

讨论了使用alpha值进行淡入淡出的处理,目的是避免一种常见的做法——简单地通过设置各个组件的alpha值来实现。这种做法在一些独立游戏中很常见,但通常效果不好,给人一种草率的感觉。当采用这种方法时,渲染时每个精灵的alpha值会被直接乘以一个全局的alpha值,这个全局值通常初始化为1。通过调整全局alpha值,可以让精灵的透明度根据Z轴的偏移量变化,但这种方法会导致不自然的效果。

具体来说,当缩放视图时,角色的精灵会逐渐变透明,但由于没有合理的Z层次堆叠,背景会直接透过角色显示出来,给人一种所有物体都变成雾气的感觉,而不是预期的逐层淡出效果。这种效果在一些场景中可能可以接受,但通常显得不够精细,尤其是在一些不应该被看到的背景元素透过物体显示出来时。

为了修复这个问题,建议在处理淡出层时更加注意Z轴层次的堆叠,可能需要先进行一个离屏合成,逐层渲染世界中的每一部分,再应用淡出效果。这种方法能避免当前的“幽灵化”效果,更加自然地处理Z轴上的物体淡入淡出。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

黑板:渲染缓冲

为了正确处理淡入淡出效果,提出了一种使用渲染缓冲区的方法。具体而言,设计了三个渲染缓冲区:A、B和C。缓冲区A将渲染上部的可能淡出区域,缓冲区B将渲染整个视图,而缓冲区C将渲染正在淡入的区域。缓冲区A和C是互斥的,因为在渲染过程中,只需要处理正在淡出或淡入的一个层。

根据不同的渲染方向(上升或下降),需要的渲染缓冲区会有所不同。例如,当视图上升时,缓冲区A处理淡出,缓冲区C处理淡入;而当视图下降时,缓冲区A和C的角色互换。因此,在任何时刻,实际需要的只是两个缓冲区:主缓冲区和一个淡入或淡出的缓冲区。这样可以保证淡入淡出的效果能够正确渲染。

关闭地面缓冲渲染并开启多个世界层

为了在世界中实现多个层次,首先需要关闭地面缓冲区并测试是否能够正确切换不同的层。通过这样做,可以让不同的世界层得到支持。接下来需要确认每个层的Z值是否正确。例如,当缩放视图时,发现某些物体的Z值异常高,需要检查并调整这些Z值,以确保各个层次之间的渲染顺序和正确显示。这表明可能需要更仔细地处理每个物体的Z轴位置,确保它们的显示效果符合预期。
在这里插入图片描述

在这里插入图片描述

调整 ZFudge

在处理Z值的乘法时,发现结果偏差较大,因此需要对系数进行调整,以控制Z轴的缩放效果。当前的问题是,由于地面缓冲区的渲染过程较慢,尤其是在经过缩放路径时,导致渲染变得不稳定。在调试过程中,发现了一个隐藏的楼梯,可以用来进入下一个层级。但为了避免地面缓冲区的影响,需要暂时关闭它的渲染。这一阶段,虽然渲染效果有所改善,但仍然存在一些不稳定的问题,仍需进一步调整和优化。
在这里插入图片描述

在这里插入图片描述

完全关闭地面缓冲

为了避免不必要的计算成本,在未进行渲染优化之前,决定完全关闭地面缓冲区的渲染。这样可以节省时间和计算资源,确保渲染过程更加高效。关闭地面缓冲区后,渲染过程应该会变得更加顺畅。
在这里插入图片描述

考虑 Z 轴上的 Y 位移的奇怪概念

在调整Z值时,出现了一些困惑,因为在当前的设计中,Z的位移被应用于Y轴和Z轴,这让人难以适应。传统上,只使用三维坐标系统时会更容易理解这个过程,但在这种情况下,Z值的变化会影响物体的分布,而这种分布是基于玩家当前的Z差异。当前的实现方式看起来有些奇怪,可能需要重新调整,以更好地模拟透视变换。

将 GlobalAlpha 设置为 0,并尝试关闭该 Y 位移

当前的调整主要集中在Z轴偏移和Y轴的关系上。通过将全局透明度值设置为零,观察到仅处理Z轴偏移后,物体的表现更为直观。关于Z轴偏移的使用,理论上,在人物跳跃时不应进行Z轴缩放,而应仅进行Y轴上的跳跃。然而,当角色上下楼梯,跨越不同Z层时,应该根据Z层进行缩放。调整后的效果在楼梯上看起来有合理的视差效果,逐渐接近预期目标,但仍需要进一步思考和调整。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们需要 Z 切片

目前的设想是将游戏中的所有内容分成不同的Z层,每个Z层根据需要进行缩放,但在同一Z层内部,不会进行缩放。只有在特殊效果下,可能会做一些视觉上的变化,比如让物体看起来从远处靠近。关于Z轴的处理,预计会将Z轴切片计算与缩放分开,而Z切片内部的偏移则主要用来处理Y轴的位移。这样处理将有助于维持一种独特的2D游戏视角,同时实现一定的视差效果,例如让玩家能够看到不同层次的世界,尤其是在有深度的区域,比如看到下方的坑洞。

这个方法不仅有助于处理游戏中的视觉效果,还能够更好地控制渲染过程,特别是在处理多个层次和过渡效果时。计划在未来的工作中,对Z切片进行更加明确的定义,通过显式地将其传递给渲染器,从而使渲染器能够更好地处理不同层次的内容,并确保渲染时按层次进行排序。

整体来说,这种方式提供了一种折衷方案,既能满足视觉效果上的需求,也能在一定程度上简化技术实现,未来会继续在此基础上优化和完善。

我看到正确吗?地面阴影和英雄一起跳动?

之前,地面阴影会随着角色一起跳动,然而这种方式是在渲染过程中通过一种比较不规范的方法实现的。经过重新考虑,决定将这一部分移除并推迟到以后进行更规范的处理。地面阴影的行为会在将来的阴影系统中由游戏代码来处理,而不再依赖原来的hack方式。这样做是为了在未来的开发中实现更为灵活和标准的阴影效果。

稍微跑题了,但你能简单讲解一下 MoveSpec 的概念吗?为什么不让每个实体有自己的速度/拖拽等值?只是为了组织吗?

目前,使用 MoveSpec 来管理实体的速度、阻力等值,而不是将这些值直接存储在每个实体中,主要是因为目前还没有需要将这些数据放入每个实体的需求。MoveSpec 让我们能够灵活地管理这些属性,并且目前可以让多个实体共享相同的 MoveSpec。未来,如果需要为每个实体提供独特的速度和阻力设置,可以将 MoveSpec 移动到每个实体中。这个部分更多的是涉及到游戏代码的内容,在引擎完成后才会进一步处理。

跳跃是一个真正的机制,还是仅仅为了增强系统的鲁棒性?

添加跳跃功能并不是为了增强系统的稳健性,而只是因为有人在提问,询问是否可以让角色跳跃,因此临时添加了这个功能。现在认为这个功能应该被移除,因为最终它不会成为系统的一部分。
至于预先合成英雄位图的问题,当前并没有做这件事。

为什么不在初始化时将英雄的位图预组合成一个单一的位图,这样就不需要烦琐地推送不同的部分?

不将英雄的位图在初始化时合成为一个单一的位图,主要是因为在动画制作中需要各个部分能够独立移动。动画的一个重要部分就是让这些部件分别移动,以此来增加动画的动态感和表现力。因此,这些部分不能被固定成一个合成的图像,这也是要求将每个部件作为独立的、可组合的元素进行绘制的主要原因之一。

当你走上楼梯时,角色在过渡到下一个 Z 切片时会突然在 Y 轴上回弹吗?

当角色在走楼梯时,不会出现角色突然回到原位的问题。角色的Z坐标会平滑地沿Z轴移动,保持当前的Z切片位置。所有的Z切片位置都会是浮动的,类似于在0到1、1到2、2到3之间的范围。因此,角色的Z坐标将以切片的方式来表示,具体实现方法将在接下来的几天里进一步确定。

如果我没理解错的话,按照你这种 Z 缩放方式,要支持大规模(Z 方向)结构,比如应当在不同 Z 层次上对齐的高墙,是不是很困难?比如一座多层楼房什么的

关于Z轴缩放,确实在支持大型Z轴结构(例如多层建筑)时会有困难,因为当前的实现没有处理视差效果,导致不同Z层的结构无法对齐。例如,对于多层建筑,只能在层次淡入时看到各个层面,因此是否在视觉上保持这些结构的对齐并不显得那么重要。从实际的角度来看,要想在没有3D映射的情况下实现这些结构对齐,并且同时让前景物体放大、远景物体缩小,这是一个无法避免的权衡。最终可能需要做出选择:是否为实现缩放效果而牺牲一些结构的对齐,还是放弃缩放效果以保证垂直墙体对齐。在权衡之后,缩放效果的优势可能大于垂直墙体对齐不完美的缺陷。

如果游戏中会有坑/悬崖,你打算怎么渲染它们?

关于游戏中的坑洞和平台的渲染,已经基本完成了渲染工作。如果场景中有坑洞,地面会被关闭渲染,这样就不会渲染到坑洞所在的区域。对于平台的渲染,原则上也是类似的处理,只是需要确保在平台的边缘或有坑洞的地方不渲染地面,这样看起来就像是有平台或坑洞存在。

我想知道球体在缩放时会怎么表现

关于球体的缩放,如果想要调整球的大小,可以通过直接改变球的缩放值来实现,这与缩放效果本身并没有本质区别。通过这种方式,可以调整球体的大小,但需要注意的是,球的缩放会影响反射的位置。如果球体过大,可能会出现超出地图范围的问题,特别是在进行反射计算时,由于目前的法线贴图代码尚未完全完成,所以没有明确的计划来处理超出地图范围的反射。

此外,过大的球体可能会导致其他问题,比如采样问题。对于这种情况,代码还没有调试好,可能存在一些预期外的反射变化,特别是在Z轴空间中。当进行缩放时,反射可能会出现不一致的变化,这可能与球体在Z轴中的位置变化有关。

总的来说,缩放球体的行为与之前改变球体大小的方式没有本质区别,但在处理反射和更大尺寸的球体时,还需要进一步调试和完善相关代码。

你提到的“糟糕”渐变效果是什么游戏会出现的?

提到一些游戏中的渐变效果,最近见过的一个例子是在《鹤立男友》这款游戏中,尤其是一些视觉小说类型的游戏中,经常会看到一种非常粗糙的渐变效果。这种效果看起来比较生硬,给人一种不太自然的感觉。不过,可能记错了具体是哪款游戏,如果有误,向相关制作团队表示歉意。

当你上下楼梯时,楼梯如何缩放?

当角色上下楼梯时,楼梯的缩放将基于Z轴的不同切片进行调整。预计在绘制楼梯时,会将一些透视效果融入其中,使楼梯的外观看起来符合预期。因此,随着角色的移动,楼梯会有缩小的效果,而角色则随着高度增加而变大,到达楼梯顶部时,角色和楼梯会保持相对的大小关系,预计不会出现任何异常。

# 每个人都知道《Hatoful Boyfriend》

事实上,游戏《Hatoful Boyfriend》是一个日本约会模拟游戏,其中所有可约会的对象都是鸽子,而不是人类。这不是俚语,指的是真正的鸽子。至于为什么会有这样设定,没人清楚,也没有人能解释清楚,只是有人决定做这样一个游戏。

那你听说过《Hunie Pop》吗?

曾经在Steam的畅销页面上看到过《HuniePop》,但并没有玩过,也不太清楚它是什么类型的游戏,可能是视觉小说之类的。虽然没有玩过《HuniePop》,但确实玩过《Hatoful Boyfriend》,虽然只玩了15分钟,不过还是挺喜欢看这个游戏的。

总结

总结来说,今天的开发过程虽然有些分心,但还是解决了一些问题,特别是在Z轴处理上,离目标越来越近。接下来计划开始处理切片的实现,着重于让地面缓冲区在切片中工作,并确保能清晰地显示下层的地面。同时,也将开始使用反射映射进行地面缓冲区的选择。接下来的几天将专注于调整这些内容,确保一切正常运作。希望明天能继续推进切片的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何正确安装Stable Diffusion Web UI以及对应的xFormers

本文是我总结的步骤,验证了几次保证是对的。因为正确的安装 Stable Diffusion Web UI 以及对应的 xFormers 实在是太麻烦了,官方和网上的步骤都是残缺和分散的,加上国内网络速度不理想,所以需要一些额外步骤,之前研究出…

ROS学习

1.ROS工作空间 存放项目开发相关文件的文件夹; src:代码空间(Source Space)install:安装空间(Install Space)build:编译空间(Build Space)log:日志空间(Log Space) 2.c…

visutal studio 2022使用qcustomplot基础教程

编译 下载,2.1.1版支持到Qt6.4 。 拷贝qcustomplot.h和qcustomplot.cpp到项目源目录(Qt project)。 在msvc中将它俩加入项目中。 使用Qt6.8,需要修改两处代码: L6779 # if QT_VERSION > QT_VERSION_CHECK(5, 2, …

非线性动力学笔C5.2线性系统的分类

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言C5 线性系统C5.2 线性系统的分类例5.2.1例5.2.2例5.2.3例5.2.4例5.2.5不动点的分类例5.2.6例5.2.7 前言 提示:这里可以添加本文要记录的大概内容&a…

某生产制造企业积分制考核信息化项目成功案例纪实

某生产制造企业积分制考核信息化项目成功案例纪实 ——打破“大锅饭”“平均主义”问题,持续激励员工,调动员工积极性 【客户行业】生产制造行业 【问题类型】薪酬体系优化 【客户背景】 某大型钢铁集团公司是一个集科工贸、产供销于一体的国有生产…

github用户名密码登陆失效了

问题: git push突然推代码需要登陆,但是用户名和密码正确输入后,却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…

网上购物|基于SprinBoot+vue的网上购物系统(源码+数据库+文档)

网上购物系统目录 基于SprinBootvue的网上购物 一、前言 二、系统设计 三、系统功能设计 5.1 管理员功能实现 5.1.1 论坛管理 5.1.2 商品管理 5.1.3 商品评价管理 5.1.4 商品订单管理 5.2 用户功能实现 5.2.1 商品信息 5.2.2 确认下单 5.2.3 商品订单 5.2.4 购物…

python语言进阶之函数

目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…

STM32 如何使用DMA和获取ADC

目录 背景 ‌摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。我们可以通过DMA来从外设&#xf…

在linux系统中安装Anaconda,并使用conda

系统 : ubuntu20.04 显卡:NVIDIA GTX1650 目录 安装Anaconda第一步:下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令:uname -a2. 下载合适版本的Anconda 第二步:安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…

计网-数据链路层

3.1数据链路层的概述 概念 链路就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。 数据链路是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。 数据链路层以帧为单位传输和处理数据。 网络中的主机、路由器等都必须实…

Versal - 基础5(裸机开发 AIE-ML+Vitis2024.2界面aie report介绍)

目录 1. 简介 2. 申请 License 2.1 申请网址 2.2 填写 Host 2.3 导入 License 3. 示例 3.1 vivado_platform 3.1.1 由模板创建 3.1.2 模板参数 3.1.3 修改BD参数 3.1.4 配置CIPS和MC 3.1.5 导出PFM 3.2 vitis_platform 3.2.1 创建组件 3.2.2 导入XSA并配置 3.2…

Python 字典思维导图

在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…

用pytorch实现一个简单的图片预测类别

前言: 在阅读本文之前,你需要了解Python,Pytorch,神经网络的一些基础知识,比如什么是数据集,什么是张量,什么是神经网络,如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下: 我们在powerbi里新建一个矩阵,然后如图加入字段: 我们就会得到这样的矩阵: 我们在“可视化”->“列”,上双击,输入空格,就能消除左上角的"类别"两字 同理修…

报名丨Computer useVoice Agent :使用 TEN 搭建你的 Mac Assistant

与 TEN 相聚在「LET’S VISION 2025」大会,欢迎来展位上跟我们交流。这次我们还准备了一场聚焦「computer use」的工作坊,功能新鲜上线,线下首波体验! 📅 TEN 展位:2025年3月1日-2日 TEN workshop&#x…

python opencv基础使用总结

1.安装opencv库:pip install opencv-python 2.基础使用范例 import cv2 #图片的基本操作#1.读取一张图片 参数 1:图片的文件名如果图片放在当前文件夹下,直接写文件名就行,如lena.jpg否则需要给出绝对路径,如D:\Ope…

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…