iPhone游戏2d阴影

iPhone游戏2d阴影,iphone,opengl-es,cocos2d-iphone,shadows,Iphone,Opengl Es,Cocos2d Iphone,Shadows,我们正在使用创建iPhone游戏。我们正在尝试将几个精灵层叠在一起,并让它们投射阴影 现在,阴影被渲染为精灵,在大多数情况下效果良好。但我们只希望阴影击中最近的层 我制作了一幅图像,希望能解释我们试图实现的目标: 以下是我们目前的情况: 基本上,我们希望精灵只渲染与z缓冲区深度相同的阴影部分 我们已经使用了glDepthFunc和GL\u DEPTH\u TEST,但似乎没有任何效果 下面是我们如何渲染阴影精灵(子类CCSprite): GL\u BLEND调用只在那里,因此我们可以随时看到

我们正在使用创建iPhone游戏。我们正在尝试将几个精灵层叠在一起,并让它们投射阴影

现在,阴影被渲染为精灵,在大多数情况下效果良好。但我们只希望阴影击中最近的层

我制作了一幅图像,希望能解释我们试图实现的目标:

以下是我们目前的情况:

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

我们已经使用了
glDepthFunc
GL\u DEPTH\u TEST
,但似乎没有任何效果

下面是我们如何渲染阴影精灵(子类CCSprite):

GL\u BLEND
调用只在那里,因此我们可以随时看到精灵

所有非阴影的精灵都使用
glDepthMask(GL\u TRUE)
,我们正在清除每个帧上的深度缓冲区

任何帮助都将不胜感激

glDepthFunc(GL_LESS)
实际上是默认值;它的意思是“仅当深度缓冲区中当前的对象距离较远时才绘制像素”。如果您想要完全相等,您可以使用glDepthFunc(GL_equal),但在实践中,如果您这样做,您将得到各种各样的舍入异常

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

  • 在glClear之前,将glClearDepth设置为0;这将使用最接近的可存储值填充深度缓冲区,以便在正常深度缓冲中不会绘制任何其他内容
  • 禁用深度并绘制阴影,使其落在后平面上;此时,深度缓冲区仍将充满最接近的可能值
  • 启用深度测试,但始终将glDepthFunc设置为GLU。然后按照从后到前的顺序绘制所有实心矩形,并适当设置其深度值
  • 将glDepthFunc设置为GL_LESS,并绘制要落在其他精灵上的阴影,每个阴影位于与其关联的精灵的后面,但位于后面的精灵的前面
  • 当您进入第4步时,无论在哪里绘制精灵,您都将获得正确的深度信息,并且无论背景平面在哪里,您都将设置尽可能接近的值。因此,正常深度测试将在中间阴影上工作-它们将在第3步中绘制的任何阴影上绘制,但不会在第2步中绘制的任何阴影上绘制

    你在某种程度上使用深度缓冲区作为代理模具,这是旧版iPhone不支持的


    如果您无法使用深度缓冲区来完成此任务,那么我所能想到的就是在第二个纹理单元中将阴影投影为纹理,使用第一个纹理作为遮罩纹理(如果您实际绘制的是矩形,也可以不这样做,但我想您可能不会),并对每个落在其上的阴影对每个精灵进行一次渲染。这是可行的解决方案吗?

    谢谢!使用您的方法,我能够得到我们想要的结果,不幸的是,以帧率为代价。现在,它的预期工作,我可以开始寻找优化性能的方法。
    glDepthFunc(GL_LESS)