0

我正在制作一个 2D 视频游戏。现在我没有那么多精灵,一个没有深度缓冲区的纹理可以正常工作。但是当我扩展到多个纹理时,我想使用深度缓冲区,这样我就不必在同一个纹理上进行多次传递,这样我就不必根据任何深度约束来组织我的纹理。

当我尝试让深度缓冲区工作时,我只能得到一个具有正确清晰颜色的空白屏幕。我将在没有深度缓冲区的情况下解释我的工作设置,并列出升级到深度缓冲区的问题:

  • 现在我的顶点只有位置(x,y)和纹理(x,y)坐标。没有别的了。没有照明,没有法线,没有颜色等。我必须在这里进行的唯一升级是将 az coord 添加到我的位置是否正确?

  • 现在我正在使用:

glOrthof(-2, 2, -3, 3, -1, 1);

这适用于没有深度缓冲区。但是当我添加深度缓冲区时,我想我需要更改近处和远处的值。我应该把它们改成什么?

  • 现在对于我的 glTexImage2D() 我正在使用:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 像素);

当我添加深度缓冲区时,我是否必须更改任何这些参数?

  • 在调用 时glClearDepthf();,我应该使用在调用 glOrthof() 时使用的近值还是远值之一?哪一个?
4

2 回答 2

1

由于您使用 2D 和正交,我发现拥有与您的分辨率匹配的坐标的视口会有所帮助,因此这将使事情更具可读性:

CGRect rect = self.view.bounds;
if (ORTHO) {
    if (highRes && (retina == 1)) {
        glOrthof(0.0, rect.size.width/2, 0.0 ,  rect.size.height/2, -1, 1000.0);
    } else {
        glOrthof(0.0, rect.size.width, 0.0 ,  rect.size.height, -1, 1000.0);    
    }
    glViewport(0, 0, rect.size.width*retina, rect.size.height*retina);
} 

请注意,即使在视网膜上,我也总是使用 320x480 坐标,这样我可以对两个 res 使用相同的坐标,0.5 将使我在视网膜上达到完美像素,但你可以采用其他方式。

关于深度,我使用 -1 到 1000 的深度,所以我最多可以绘制 -1000 Z。

确保正确绑定深度缓冲区,如下所示:

    // Need a depth buffer
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,  framebufferWidth, framebufferHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

或者您的问题可能很简单,例如使用相机和灯光后面的深度或大于缓冲区的深度,尝试使用 0 到 -1 之间的深度(例如 -0.5),使用我的 glOrthof,您可以达到 - 1000;

编辑

glOrthof 中近和远的值指定一个数量(距离),而不是坐标,这在指定深度值时可能会造成混淆。当你为 far 参数指定 1000 时,我们实际上说的是远裁剪平面是距离观察者 1000 个单位的距离,近场也是如此,不幸的是,在观察者后面指定一个裁剪平面会取负值,这有助于混乱。

因此,当涉及到绘图时,我们有一个剪裁平面,它距离前面的观察者(远或进入屏幕)有 1000 个单位,就坐标 Z 而言,当低于观察平面(进入屏幕)时,我们的实际绘图世界是在 Z = 1 和 Z = -1000 之间,即 -1000 是我们使用这些参数所能达到的最远距离。

于 2011-11-22T11:05:18.510 回答
0

例如,如果您不打算使用现有的库,例如Cocos2D ,那么您将必须编写一个管理器来自己管理深度缓冲区

  • 将它们添加到屏幕的顺序
  • 用户自定义 Z 值,因此您可以根据需要交换它们
于 2011-11-22T04:22:53.667 回答