是否有可能在iPhone上获得16位深度缓冲?

时间:2010-10-24 13:21:26

标签: iphone opengl-es cocos2d-iphone

我们正在使用cocos2d制作游戏,但深度缓冲区存在问题。 我正在尝试在iPhone上设置一个16位深度缓冲区,但到目前为止我只能获得24位深度。

我想要16位深度缓冲区的原因是:

  • 答:我不需要24位的精度。
  • B:我希望它会更快。

这就是我在cocos2d中设置深度格式的方法:

[[CCDirector sharedDirector] setDepthBufferFormat:kDepthBuffer16];

在某些时候最终会出现在EAGLView(v1.3)

glGenRenderbuffersOES(1, &_depthBuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthBuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, _depthFormat, newSize.width, newSize.height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthBuffer);

其中_depthFormatGL_DEPTH_COMPONENT16_OES(在调试时验证)

以下是我检查位数的方法:

GLint depthBufferBits;
glGetIntegerv( GL_DEPTH_BITS, &depthBufferBits );
NSLog( @"Depth buffer bits: %d", depthBufferBits );

输出是:

Depth buffer bits: 24

我错过了什么?我在iPod Touch(第二代)和iPhone 3GS上尝试了相同的代码,总是以24位的形式返回。

更新

我现在已经将cocos2d更新为GIT仓库的最新版本。 以下是我初始化导演和窗口的方法:

- (void) applicationDidFinishLaunching:(UIApplication*)application
{
    // Init the window
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
    // cocos2d will inherit these values
    [window setUserInteractionEnabled:YES]; 
    [window setMultipleTouchEnabled:YES];

    [CCDirector setDirectorType:CCDirectorTypeDisplayLink];

    CCDirector* director = [CCDirector sharedDirector];

    [director setAnimationInterval:1.0/60];
    [director setDisplayFPS:YES];

    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
                                   pixelFormat:kEAGLColorFormatRGBA8                // RGBA8 color buffer
                                   depthFormat:GL_DEPTH_COMPONENT16_OES   // 16-bit depth buffer
                            preserveBackbuffer:NO];

    [director setOpenGLView:glView];
    [director setProjection:kCCDirectorProjection2D];

    [window addSubview:glView];
    [window makeKeyAndVisible];     

    [CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA8888];

    [director runWithScene:[LevelScene scene]];
}

根据glGetIntegerv( GL_DEPTH_BITS, &depthBufferBits );

仍然获得24位深度缓冲区

1 个答案:

答案 0 :(得分:0)

我不确定内部,但不推荐使用setDepthBufferFormat。我还可以想象,在创建GL视图后,可以简单地(不再)更改深度缓冲区。使用Cocos2D v0.99.5 beta 3,初始化已经发生了很大的变化。我建议您更新到最新版本,即使它是测试版。

然后看看这里:http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:setup_buffers

重要的部分是EAGLView的初始化,您可以在其中设置深度缓冲区:

EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
                               pixelFormat:kEAGLColorFormatRGBA8
                               depthFormat:GL_DEPTH_COMPONENT16_OES
                        preserveBackbuffer:NO];