我在iPhone上基本上有一款2D游戏,我正在尝试设置多个以不同速度滚动的背景(称为视差背景)。
所以我的想法是只使用不同的z坐标平面粘贴前景后面的背景,然后让它们比前景(大小)更大以容纳,以便整个事物可以滚动(只是在不同的速度)。
并且(据我所知)我基本上实现了这一点。唯一的问题是它似乎完全忽略了我给它的任何z值,或者说它只是将它们全部归零。我看到了背景(到目前为止我只测试了一个背景,为了保持简单...所以现在我只有一个前景,我希望一个背景以不同的速度滚动),但它以1:1滚动我的前景,所以它显然看起来不正确,并且大部分被切断(因为它更大)。我已经为背景和各种近/远剪裁平面尝试了各种z值...它总是一样的。我可能只是做了一件简单的事情,但我无法理解。我想知道是否与我只使用glVertexPointer中的2个坐标作为前景? (当然是我传递的背景3)
我会发布一些代码:
这是一些初步设置:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//transparency
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
关于我前景的浮点数组......它是交错的。对于我的前景,它是顶点x,顶点y,纹理x,纹理y,重复。这一切都很好。
这是我的FOREGROUND渲染:
glVertexPointer(2, GL_FLOAT, 4*sizeof(GLfloat), texes); <br>
glTexCoordPointer(2, GL_FLOAT, 4*sizeof(GLfloat), (GLvoid*)texes + 2*sizeof(GLfloat)); <br>
glDrawArrays(GL_TRIANGLES, 0, indexCount / 4);
背景渲染:
这里钻相同,除了这次它是顶点x,顶点y,顶点z,纹理x,纹理y,重复。这次注意z值。我确实在调试时确保了这个数组中的数据是正确的(获得正确的z值)。再一次,它出现了......它不会像它应该的那样远远地回到远方。
glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), b1Texes);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), (GLvoid*)b1Texes + 3*sizeof(GLfloat));
glDrawArrays(GL_TRIANGLES, 0, b1IndexCount / 5);
为了移动我的相机,我只做一个简单的glTranslatef(x,y,0.0f);
我不明白我做错了什么因为这似乎是可以想象的最基本的3D功能......更远的东西更小,并且在相机移动时不会移动得那么快。不是我的情况。看起来它应该是非常基本的,甚至不会受到我的投影和所有这一切的影响(尽管我甚至尝试过glFrustum只是为了好玩,没有成功)。请帮助,我觉得这只是一个愚蠢的事情。如有必要,我会发布更多代码。
答案 0 :(得分:0)
在黑暗中拍摄......
您可能不得不忘记在帧缓冲区初始化程序中设置深度缓冲。
Apple Apple旧版EAGLView模板中的复制和粘贴:
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
答案 1 :(得分:0)
如果您依赖于混合,则必须按深度顺序绘制,这意味着首先绘制最远(最深)的图层。否则它们将被顶层覆盖,因为即使该区域是100%透明的,也会写入z缓冲区值。
请参阅here
答案 2 :(得分:0)
我发现我正在使用无法显示更远的东西的正交投影(如果我错了,请纠正我)。当我早些尝试glFrustum时(正如我在我的问题中所述),我在设置它时做错了。我使用负值作为近剪裁值,我基本上得到了1:1滚动问题,与正交相同。但是我把它改为0.01,它最终开始正确显示(背景显示得更远)。
我的问题已得到解决,但作为一个侧面想法,我现在想知道我是否可以在同一帧内混合正交和透视,以及需要什么。因为我宁愿保持前景非常简单和正交(2d),但我希望我的背景以透视深度显示。
我的想法是这样的:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);
//render foreground
glLoadIdentity();
glFrustum(-1.0f, 1.0f, -1.5f, 1.5f, 0.01f, 1000.0f);
//render backgrounds
我会玩这个并对我的结果发表评论,万一有人好奇。对此的反馈将不胜感激,虽然从技术上来说我不再需要这个问题了(从现在开始它只是想法讨论)。