【问题标题】:Setting Framebuffer's Depth/Stencil Buffer on Android OpenGL ES 3.1在 Android OpenGL ES 3.1 上设置 Framebuffer 的深度/模板缓冲区
【发布时间】:2019-08-05 19:23:54
【问题描述】:

我正在尝试将深度和模板缓冲区附加到帧缓冲区。我这样做如下:

int[] bufferHandle = new int[1];
GLES31.glGenRenderbuffers(1, bufferHandle, 0); // glError = 0 (GL_NO_ERROR)
GLES31.glRenderbufferStorage(GLES31.GL_RENDERBUFFER, GLES31.GL_DEPTH24_STENCIL8, width, height);  // glError = 1282 (GL_INVALID_OPERATION)
GLES31.glBindRenderbuffer(GLES31.GL_RENDERBUFFER, 0); //  // glError = 0 (GL_NO_ERROR)
GLES31.glFramebufferRenderbuffer(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_RENDERBUFFER, bufferHandle);  // glError = 1282 (GL_INVALID_OPERATION)

glRenderbufferStorageglFramebufferRenderbuffer 调用返回 1282 (GL_INVALID_OPERATION)。有什么想法我可能会遗漏吗?

【问题讨论】:

    标签: android opengl-es opengl-3 android-graphics


    【解决方案1】:

    发生错误,因为未创建渲染缓冲区对象。

    glGenRenderbuffers 生成一个未使用的名称,分别保留一个名称,可用于渲染缓冲区,但不会创建或绑定渲染缓冲区对象。为此,您必须致电glBindRenderbuffer

    int[] bufferHandle = new int[1];
    GLES31.glGenRenderbuffers(1, bufferHandle, 0);
    GLES31.glBindRenderbuffer(GLES31.GL_RENDERBUFFER, bufferHandle[0]);
    GLES31.glRenderbufferStorage(GLES31.GL_RENDERBUFFER, GLES31.GL_DEPTH24_STENCIL8, width, height);
    

    注意,渲染缓冲区对象被创建,当glBindRenderbuffer第一次被调用时,除了对象绑定到指定的目标。
    glRenderbufferStorage建立数据存储的格式和大小。

    【讨论】:

    • 呃,我不知道我是怎么错过的。非常感谢您的帮助!
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多