Android 在OpenGL ES中为帧缓冲区使用深度和模具渲染缓冲区附件
我想在OpenGL ES 2中创建一个具有颜色纹理、深度和模具渲染缓冲区的帧缓冲区。然而,OpenGL ES似乎没有GL_DEPTH24_模具8或GL_DEPTH_模具8附件。使用两个单独的renderbuffers会产生错误模具,z缓冲区曲面具有不同的格式!返回GL\u帧缓冲区\u不受支持! 这在OpenGL ES中是不可能的吗 我的FBO创建代码:Android 在OpenGL ES中为帧缓冲区使用深度和模具渲染缓冲区附件,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我想在OpenGL ES 2中创建一个具有颜色纹理、深度和模具渲染缓冲区的帧缓冲区。然而,OpenGL ES似乎没有GL_DEPTH24_模具8或GL_DEPTH_模具8附件。使用两个单独的renderbuffers会产生错误模具,z缓冲区曲面具有不同的格式!返回GL\u帧缓冲区\u不受支持! 这在OpenGL ES中是不可能的吗 我的FBO创建代码: private int width, height; private int framebufferID, color
private int width, height;
private int framebufferID,
colorTextureID,
depthRenderBufferID,
stencilRenderBufferID;
public FBO(int w, int h) {
width = w;
height = h;
int[] array = new int[1];
//Create the FrameBuffer and bind it
glGenFramebuffers(1, array, 0);
framebufferID = array[0];
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
//Create the texture for color, so it can be rendered to the screen
glGenTextures(1, array, 0);
colorTextureID = array[0];
glBindTexture(GL_TEXTURE_2D, colorTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// attach the texture to the framebuffer
glFramebufferTexture2D( GL_FRAMEBUFFER, // must be GL_FRAMEBUFFER
GL_COLOR_ATTACHMENT0, // color attachment point
GL_TEXTURE_2D, // texture type
colorTextureID, // texture ID
0); // mipmap level
glBindTexture(GL_TEXTURE_2D, 0);
// is the color texture okay? hang in there buddy
FBOUtils.checkCompleteness(framebufferID);
//Create the depth RenderBuffer
glGenRenderbuffers(1, array, 0);
depthRenderBufferID = array[0];
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBufferID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
//Create stencil RenderBuffer
glGenRenderbuffers(1, array, 0);
stencilRenderBufferID = array[0];
glBindRenderbuffer(GL_RENDERBUFFER, stencilRenderBufferID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height);
// bind renderbuffers to framebuffer object
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferID);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilRenderBufferID);
// make sure nothing screwy happened
FBOUtils.checkCompleteness(framebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
填充深度/模板表面不是OpenGL ES 2.0的标准部分,但通过此扩展添加: 如果您的平台通常支持扩展,则OpenGL中的令牌名称通常可以使用,但请注意,大多数都有一个_OES后缀,因为它是一个OES扩展,例如,内部格式令牌是GL_DEPTH24_STENCIL8_OES
扩展未定义单个组合附着点,例如OpenGL ES 3.0中添加的GL_DEPTH_STENCIL_attachment,但可以将相同的渲染缓冲附着到一个或两个单个附着点。请注意,如果已将填充深度/模板表面附着到另一个附着点,则不允许将两个不同深度或模板表面附着到深度和模板附着点,即,如果将填充深度/模板附着到一个附着点,则另一个附着点可以附着到同一个填充表面或未使用。简而言之,这取决于实现。在ES2.0中,您在发布的代码中尝试使用单独的renderbuffer进行深度和模具渲染基本上是合法的。但规范中有一段: […]某些实现可能不支持呈现为内部格式的特定组合。如果实现不支持附加到帧缓冲区对象的图像的格式组合,则在标记为framebuffer\u UNSUPPORTED的子句下,帧缓冲区不完整 这正是您看到的GL\u FRAMEBUFFER\u不支持的错误。您的实现显然不喜欢深度和模具缓冲区的组合,并且可以在仍然符合规范的情况下拒绝支持它 还有一个方面使您的代码依赖于设备。用于纹理的格式和类型组合:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null);
基本上对应于RGBA8内部格式,即使在ES 2.0规范中未使用该命名。在基本ES 2.0中,这不是颜色可渲染格式。如果您希望得到全面支持,则必须使用GL_UNSIGNED_SHORT_5_6_5、GL_UNSIGNED_SHORT_4_4或GL_UNSIGNED_5_5_5_1作为类型。理论上,一个设备可以拒绝支持几乎任何格式。唯一严格的要求是它至少支持一种格式组合
作为扩展的一部分,可以在许多设备上渲染为RGBA8格式
正如在另一个答案中已经指出的,组合深度/模具格式不是base ES 2.0的一部分,仅在扩展中可用