我们正在使用cocos2d创建一个iPhone游戏。我们尝试将几个精灵层叠在一起,并让它们投射阴影。
现在,阴影被渲染为精灵,这在大多数情况下都很好用。但我们只希望阴影命中最近的图层。
我制作了一张图片,希望能解释我们试图实现的目标:

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

基本上,我们希望精灵只渲染与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 ),我们正在清除每一帧的深度缓冲区。
任何帮助都将不胜感激!
发布于 2010-10-18 07:58:53
glDepthFunc(GL_LESS)实际上是默认值;它的意思是“只有当当前在深度缓冲区中的东西离得更远时才绘制像素”。如果您想要完全相等,您可以使用glDepthFunc(GL_EQUAL),但在实践中,如果您这样做,您会得到各种奇怪的舍入。
假设您能够为此使用深度值,如果您有10个对象,那么我建议您:
到了步骤4,绘制精灵的每个地方都会有正确的深度信息,背景平面所在的地方也会有最接近的值设置。因此,正常的深度测试将在中间阴影上工作-它们将在步骤3中绘制的任何内容上绘制,但不会在步骤2中绘制的任何内容上绘制。
您在某种程度上使用了深度缓冲区作为代理模板,这是旧版iPhones不支持的。
如果你不能使用深度缓冲区来完成这项任务,那么我能想到的就是在第二个纹理单元中将阴影投影为纹理,使用第一个纹理单元作为遮罩纹理(如果你实际上正在绘制矩形,也可以不使用,但我猜你可能不是),并对落在它上面的每个精灵进行一次渲染。这是一个可行的解决方案吗?
https://stackoverflow.com/questions/3954825
复制相似问题