首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone游戏2d阴影

iPhone游戏2d阴影
EN

Stack Overflow用户
提问于 2010-10-18 03:15:49
回答 1查看 1.1K关注 0票数 2

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

现在,阴影被渲染为精灵,这在大多数情况下都很好用。但我们只希望阴影命中最近的图层。

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

这就是我们目前所拥有的:

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

我们尝试过glDepthFuncGL_DEPTH_TEST,但似乎都不起作用。

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

代码语言:javascript
复制
- (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 ),我们正在清除每一帧的深度缓冲区。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-18 07:58:53

代码语言:javascript
复制
glDepthFunc(GL_LESS)

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

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

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

到了步骤4,绘制精灵的每个地方都会有正确的深度信息,背景平面所在的地方也会有最接近的值设置。因此,正常的深度测试将在中间阴影上工作-它们将在步骤3中绘制的任何内容上绘制,但不会在步骤2中绘制的任何内容上绘制。

您在某种程度上使用了深度缓冲区作为代理模板,这是旧版iPhones不支持的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3954825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档