gpt4 book ai didi

java - LWJGL/如果摄像机透过墙看玩家,则不渲染墙

转载 作者:行者123 更新时间:2023-11-30 03:51:41 25 4
gpt4 key购买 nike

我想知道当相机必须透过墙壁观看玩家时,是否有任何标准方法可以不渲染墙壁。在我的游戏中,相机可以完全自由地围绕玩家旋转。当摄像机以高音调观察玩家时,大多数时候它可以看到墙外的玩家,但如果摄像机的音调较低,那么很多时候它最终只是盯着墙壁,并且你无法真正判断其背后发生了什么。如果有人知道我可以解决这个问题的方法,那就太棒了!

最佳答案

这里确实有一个非常有效的观点,即墙壁很容易在第三人称视角中阻碍玩家,但理想的解决方案是可能不会移除阻碍玩家的墙壁。根据世界的构造方式,如果删除属于墙壁的多边形,您很可能会在世界中创建一个洞,该洞仅暴露多边形的背面(通常会被剔除);于是无意间一睹深渊。

实际上,通常实现的方法是使用模板缓冲区来使用不同的阴影绘制角色的各个部分。

考虑以下非常粗略的图表(我懒得画真实的东西):

  |\
| \***
| \**
| x\*
| xx\
| \
-------

想象三角形是你的墙,矩形是你的玩家。不是完全删除三角形,而是三角形内部(在您的情况下位于后面)的部分以不同的方式呈现(用 x 填充)。现在,墙保持在原位,但您以特殊的方式绘制被墙覆盖的部分,以便在不破坏现实世界的部分的情况下向玩家提供反馈。

这将是一个两遍操作,首先将模板缓冲区清除为0x00,然后在启用模板测试的情况下正常绘制角色。当您的角色的深度测试失败时,通过设置位1来标记该位置的模板缓冲区。

在第二遍时,再次绘制模型,但这次禁用深度测试,并且仅在模板缓冲区具有位 1 标记的位置绘制模型。同样,在第二遍中,做一些事情来改变绘制模型的视觉外观(例如,给它一个绿色的光芒,只绘制一个线框,使用附加混合或任何有创意的东西)。

<小时/>

以下是代码的大致轮廓:

第一遍(照常渲染):

glClearStencil (0x00);
glClear (GL_STENCIL_BUFFER_BIT);

glEnable (GL_DEPTH_TEST);
glEnable (GL_STENCIL_TEST);

glStencilFunc (GL_ALWAYS, 1, 1 );
glStencilOp (GL_KEEP, GL_REPLACE, GL_KEEP);

// Draw your model as usual

第二遍(仅绘制第一次深度测试失败的模型部分):

glDisable      (GL_DEPTH_TEST);

glStencilFunc (GL_EQUAL, 1, 1 );
glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);

// Draw your model again, but with some special visual characteristic of your choosing.

glDisable (GL_STENCIL_TEST);
<小时/>

这是在真实游戏中实现时的实际情况( torch 之光):

   enter image description here

注意到玩家模型位于栏杆后面的幽灵般的蓝色部分了吗?

关于java - LWJGL/如果摄像机透过墙看玩家,则不渲染墙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com