2010-10-17 103 views
2

我们正在使用cocos2d来制作iPhone游戏。我们正在尝试将多个精灵层叠在一起,并让它们投射阴影。iPhone游戏2d阴影

现在,阴影呈现为精灵,大部分工作正常。但我们只希望阴影击中最近的层。

我做了一个形象,希望能解释什么是我们正在努力做到:

这里就是我们目前所面对的:

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

我们玩过glDepthFuncGL_DEPTH_TEST,但似乎没有任何工作。

下面是我们如何绘制阴影精灵(子类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电话是只有在那里,所以我们可以在任何时候看到的精灵。

所有不是阴影的精灵都使用glDepthMask(GL_TRUE),我们正在清除每个帧的深度缓冲区。

任何帮助将不胜感激!

回答

1
glDepthFunc(GL_LESS) 

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

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

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

当您到达第4步时,您会在绘制精灵的任何位置都有正确的深度信息,并且您将在背景平面的任何位置设置最接近的可能值。因此,正常的深度测试将在中间阴影上起作用 - 它们将绘制第3步中绘制的任何东西的顶部,而不是第2步中绘制的任何东西的顶部。

你有点使用深度缓冲区作为替代模板,旧iPhone不支持。

如果你不能使用这个任务的深度缓冲区,那么我所能想到的就是将阴影投影为第二个纹理单元中的纹理,使用第一个纹理单元作为掩码纹理(或者,如果你是实际上绘制矩形,但我想你可能不会),并且每个阴影中的每个精灵都会执行一次渲染传递。这是一个可通行的解决方案吗?

+0

谢谢!使用你的方法,我能够得到我们正在寻找的结果,不幸的是以帧率为代价。现在,它可以按照预期工作,我可以开始寻找优化性能的方法。 – aegzorz 2010-10-23 16:28:57