我想在 OpenGL ES 2 中创建一个具有颜色纹理和深度以及模板渲染缓冲区的帧缓冲区。但是,OpenGL ES 似乎没有 GL_DEPTH24_STENCIL8
或 GL_DEPTH_STENCIL_ATTACHMENT
。使用两个单独的渲染缓冲区会出现错误“Stencil 和 z 缓冲区表面具有不同的格式!返回 GL_FRAMEBUFFER_UNSUPPORTED!
”
这在 OpenGL ES 中不可能吗?
我的 FBO 创建代码:
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 的标准部分,而是通过此扩展添加的:
https://www.khronos.org/registry/gles/extensions/OES/OES_packed_depth_stencil.txt
如果您的平台支持该扩展(通常是这样),OpenGL 中的 token 名称通常可以工作,但请注意,大多数都有 _OES
postfix 因为它是 OES 扩展,例如内部格式 token 是 GL_DEPTH24_STENCIL8_OES
.
扩展未定义单个组合连接点,例如 GL_DEPTH_STENCIL_ATTACHMENT
(OpenGL ES 3.0 中添加),但您可以将相同的渲染缓冲区附加到一个或两个单个附加点。请注意,如果您已将打包深度/模板表面附加到另一个附加点,则不允许将两个不同的深度或模板表面附加到深度和模板附加点(即,如果您将打包深度/模板附加到一个附加点,则其他可以附着在同一包装表面或未使用)。
关于android - 在 OpenGL ES 中使用帧缓冲区的深度和模板渲染缓冲区附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996721/