LWJGL /如果相机通过它看着播放器,则不会渲染墙壁

时间:2014-06-17 21:18:24

标签: java opengl lwjgl

我想知道当相机必须通过它观看播放器时是否有任何标准的不渲染墙的方法。在我的游戏中,相机可以完全自由地围绕播放器旋转。当相机看到高音调的播放器时,它可以在播放器的大部分时间看到墙上,但如果相机的音高很低,那么很多时候它只是盯着墙壁,你无法真正说出它背后发生了什么。如果有人知道我可以采取的方式,那就太棒了!

1 个答案:

答案 0 :(得分:2)

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

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

考虑以下非常粗略的图(我太懒了,无法真实地绘制东西):

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

想象一下,三角形是你的墙,而直尺就是你的玩家。不是完全删除三角形,而是在三角形内部(在您的情况下为后面)的部分以不同方式呈现(填充x)。现在,墙壁保持原位,但你以特殊的方式绘制墙壁覆盖的部分,以便在不破坏现实世界的情况下给予玩家反馈。

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

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


以下是代码方面的概述:

First Pass (照常渲染):

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

Second Pass (仅绘制第一次未通过深度测试的模型部分):

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);

以下是在真实游戏(火炬之光)中实现的实际情况:

enter image description here

注意玩家模型在栏杆后面的幽灵般的蓝色部分?