iPhone游戏2d阴影

时间:2010-10-17 19:15:49

标签: iphone opengl-es cocos2d-iphone shadows

我们正在使用cocos2d制作iPhone游戏。我们试图将几个精灵叠加在一起,让它们投下阴影。

现在,阴影呈现为精灵,大部分都可以正常工作。但我们只希望阴影能够到达最近的层。

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

这就是我们现在所拥有的:

基本上我们希望精灵只渲染阴影中与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 个答案:

答案 0 :(得分:1)

glDepthFunc(GL_LESS)

实际上是默认值;它意味着“仅当当前在深度缓冲区中的东西更远时才绘制像素”。如果你想要完全相同,你可以使用glDepthFunc(GL_EQUAL),但在实践中,如果你这样做,你会得到各种各样的怪异。

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

  1. 在glClear之前将glClearDepth设置为0;这将使用最近的可存储值填充深度缓冲区,以便在正常深度缓冲时不会产生任何其他内容。
  2. 禁用深度并绘制阴影,例如它们应该落在背板上;此时,您的深度缓冲区仍将充满最接近的可能值。
  3. 启用深度测试,但将glDepthFunc设置为GL_ALWAYS。然后按照前面的顺序绘制所有实心矩形,并适当设置其深度值。
  4. 将glDepthFunc设置为GL_LESS并绘制落在其他精灵上的阴影,每个精灵位于比它们关联的精灵更靠后但位于后面的精灵前面。
  5. 当你进入第4步时,你会在绘制精灵的地方获得正确的深度信息,并且无论背景平面在哪里,你都会得到最接近的值集。因此,正常的深度测试将适用于中间阴影 - 它们将绘制在步骤3中绘制的任何内容之上,但不会绘制在步骤2中绘制的任何内容之上。

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

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