Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在OpenGL ES中为帧缓冲区使用深度和模具渲染缓冲区附件_Android_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

Android 在OpenGL ES中为帧缓冲区使用深度和模具渲染缓冲区附件

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

我想在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,
            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的一部分,仅在扩展中可用