代码之家  ›  专栏  ›  技术社区  ›  aegzorz

iPhone游戏二维阴影

  •  2
  • aegzorz  · 技术社区  · 15 年前

    我们正在使用 cocos2d . 我们试着将几个精灵叠加在一起,让它们投射阴影。

    现在阴影被渲染成精灵,这在很大程度上是很好的。但我们只想让阴影碰到最近的一层。

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

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

    glDepthFunc GL_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 回复  |  直到 9 年前
        1
  •  1
  •   Tommy    15 年前
    glDepthFunc(GL_LESS)
    

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

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

    1. 在glClear之前,将glClear depth设置为0;这将使用最接近的可存储值填充深度缓冲区,以便使用普通深度缓冲区不会绘制其他内容。
    2. 启用深度测试,但始终将glDepthFunc设置为GL\u。然后按从后到前的顺序绘制所有实心矩形,并适当设置其深度值。
    3. 将glDepthFunc设置为GLúLESS,并绘制要落在其他精灵上的阴影,每个阴影都位于它们关联的精灵后面,但在后面的精灵前面。

    当你进入第4步时,你将在绘制精灵的任何地方都有正确的深度信息,并且你将在背景平面所在的任何地方设置尽可能接近的值。因此,正常的深度测试将在中间阴影上工作,它们将在第3步中绘制的任何东西上绘制阴影,但不会在第2步中绘制的任何东西上绘制阴影。

    如果你负担不起使用深度缓冲区来完成这个任务,那么我所能想到的就是将阴影作为纹理投影到第二个纹理单元中,将第一个纹理用于遮罩纹理(如果你实际上是在绘制矩形,但我猜你可能不是),并对每个落在上面的阴影为每个精灵执行一次渲染过程。这是一个可以接受的解决方案吗?

    推荐文章