gpt4 book ai didi

iPhone游戏2D阴影

转载 作者:行者123 更新时间:2023-12-03 21:21:45 25 4
gpt4 key购买 nike

我们正在使用cocos2d创建iPhone游戏。 。我们正在尝试将多个 Sprite 叠加在一起并让它们转换阴影。

现在,阴影被渲染为 Sprite ,在大多数情况下都可以正常工作。但我们只希望阴影转换到最近的层。

我制作了一张图片,希望能够解释我们想要实现的目标:

这是我们目前所拥有的:

基本上我们希望 Sprite 只渲染与 z 缓冲区深度相同的阴影部分。

我们已经尝试过 glDepthFuncGL_DEPTH_TEST 但似乎没有任何效果。

以下是我们渲染阴影 Sprite 的方式(CCSprite 的子类):

- (void)draw {

glDisable( GL_BLEND );

glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LESS );

glDepthMask( GL_FALSE );
[super draw];
glDepthMask( GL_TRUE );

glDisable( GL_DEPTH_TEST );

glEnable( GL_BLEND );
}

GL_BLEND 调用只是为了让我们能够随时看到 Sprite 。

所有不是阴影的 Sprite 都使用glDepthMask( GL_TRUE ),并且我们将清除每一帧上的深度缓冲区。

任何帮助将不胜感激!

最佳答案

glDepthFunc(GL_LESS)

实际上是默认值;它的意思是“仅当当前深度缓冲区中的物体距离较远时才绘制像素”。如果你想要完全相等,你可以使用 glDepthFunc(GL_EQUAL),但在实践中,如果你这样做,你会得到各种舍入奇怪的结果。

假设您能够为此目的使用深度值,如果您有十个对象,那么我建议您:

  1. 在执行 glClear 之前将 glClearDepth 设置为 0;这将用最接近的可存储值填充深度缓冲区,以便使用正常的深度缓冲不会绘制任何其他内容。
  2. 禁用深度并绘制阴影,使其落在背板上;此时您的深度缓冲区仍将充满最接近的可能值。
  3. 启用深度测试,但将 glDepthFunc 设置为 GL_ALWAYS。然后按照从后到前的顺序绘制所有实心矩形,并适当设置其深度值。
  4. 将 glDepthFunc 设置为 GL_LESS 并绘制落在其他 Sprite 上的阴影,每个阴影的位置比它们关联的 Sprite 更靠后,但位于后面的 Sprite 前面。

当您进行到步骤 4 时,您将在绘制 Sprite 的所有位置获得正确的深度信息,并且无论背景平面在何处,您都将获得最接近的可能值。因此,正常的深度测试将适用于中间阴影 - 它们将绘制在步骤 3 中绘制的任何内容之上,但不会绘制在步骤 2 中绘制的任何内容之上。

您有点使用深度缓冲区作为替代模板,而旧款 iPhone 不支持这一点。

如果您无法承担此任务使用深度缓冲区的费用,那么我能想到的就是将阴影投影为第二个纹理单元中的纹理,使用第一个纹理单元作为蒙版纹理(或者如果您实际上不使用深度缓冲区)绘制矩形,但我猜你可能不会)并对每个 Sprite 每个落在其上的阴影进行一次渲染。这是一个可行的解决方案吗?

关于iPhone游戏2D阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954825/

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