我们正在使用cocos2d
制作游戏,但深度缓冲区存在问题。
我正在尝试在iPhone上设置一个16位深度缓冲区,但到目前为止我只能获得24位深度。
我想要16位深度缓冲区的原因是:
这就是我在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);
其中_depthFormat
为GL_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 );
答案 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];