OpenGLESで3DiPhoneゲームを実行しています。
それは大きな世界ですが、いくつかの小さな一人称視点のビットを近くにペイントする必要があるため、glFrustumf()がさらに取る深度範囲(zNearとzFar)を減らすことはできません。
サーフェスがZファイティングのために出会うとき、ちらつきを防ぐために少し離してペイントします。また、これが便利で必要な場合に備えて、カメラの距離によって調整する距離が決まるようにしています。
大体は大丈夫ですが、分離によって遠近感が悪くなり、分離を小さくするとちらつきが発生する場合があります。表面をもっと近づけてペイントしたいです。
デプスバッファの精度を上げて、デプス範囲を狭くすることなくサーフェスを近づける方法はありますか?
そうでない場合、これを回避する他の方法はありますか?
私はまだアプリでOpenGLES1.1を使用していますが、それだけの価値がある場合はアップグレードしたいと思っています。
ご協力いただきありがとうございます。
デプスバッファを作成する方法は次のとおりです...
initメソッドの場合:
// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
glGenFramebuffersOES(1, &defaultFramebuffer);
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
//Added depth buffer
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
resizeFromLayerメソッドの場合:
// Allocate color buffer backing based on the current layer size
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
//Added depth buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
これが私が錐台を作成する方法です...
const GLfloat zNear = 2.2;
const GLfloat zFar = 30000;
const GLfloat fieldOfView = 60.0;
GLfloat size = zNear * tanf(degreesToRadian(fieldOfView) / 2.0);
if (LANDSCAPE) { //for landscape clip & aspect ratio.
//parameters are: left, right, bottom, top, near, far
glFrustumf(-size/(backingWidth/backingHeight),
size/(backingWidth/backingHeight),
-size, size,
zNear, zFar);
}