由于您使用 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 是我们使用这些参数所能达到的最远距离。