我下载了这个Apple示例代码GLEssentials sample code。我想用深度缓冲区进行一些实验,所以一开始我决定检查BUFFER_BITS。
我在 -initWithDefaultFBO 方法中向OpenGLRenderer.m添加了下一个代码:
// code from sample
NSLog(@"%s %s\n", glGetString(GL_RENDERER), glGetString(GL_VERSION));
// buffer bits check
GLint depthBits;
glGetIntegerv(GL_DEPTH_BITS, &depthBits);
printf("depthBits: %d\n", depthBits);
我有下一个输出:
GLEssentials[3630:112826] Apple Software Renderer OpenGL ES 2.0 APPLE-12.4.2
depthBits: 24
但在ES2Renderer.m中,我看到下一行:
// using 16-bit depth buffer
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
为什么会这样?是bug吗?
PS:我只在iOS模拟器中测试过,因为我没有ios设备。
答案 0 :(得分:1)
spec说:
OpenGL ES实现可以根据任何RenderbufferStorage参数(目标除外)改变其内部组件分辨率的分配,但分配和选择的内部格式不能是任何其他状态的函数,并且一旦建立就不能更改。可以使用GetRenderbufferParameteriv查询分配的图像的每个组件的实际分辨率。
基本上,允许OpenGLES根据请求选择不同的位深度。
我怀疑在设备上,会使用一个实际的16位深度缓冲区。