繁体   English   中英

OpenGL ES 2.0渲染到帧缓冲区/纹理导致黑色纹理

[英]OpenGL ES 2.0 render to framebuffer/texture results in black texture

我正在使用libgdx,但这几乎是香草opengl es 2.0的东西。 只是尝试在所有地方都忽略Gdx.gl前缀^^我正在台式机和android设备上对其进行测试,两种情况都是相同的。

我的窗口调整大小事件中包含以下代码。 如果已经创建了帧缓冲区和关联的纹理,则应该删除它们,然后将一些新的纹理设为合适的大小。 我不确定这是否像我一样删除纹理和帧缓冲区是否正确。

    if (depthTexture >= 0)
    {
        Gdx.gl.glDeleteTexture(depthTexture);
        depthTexture = -1;
    }
    if (colorTexture >= 0)
    {
        Gdx.gl.glDeleteTexture(colorTexture);
        colorTexture = -1;
    }
    if (depthBuffer >= 0)
    {
        Gdx.gl.glDeleteFramebuffer(depthBuffer);
        depthBuffer = -1;
    }

    IntBuffer intBuffer = BufferUtils.newIntBuffer(16); // See http://lwjgl.org/forum/index.php?topic=1314.0;wap2
    intBuffer.clear();
    Gdx.gl.glGenFramebuffers(1, intBuffer);
    frameBuffer = intBuffer.get(0);


    intBuffer.clear();
    Gdx.gl.glGenTextures(1, intBuffer);
    colorTexture = intBuffer.get(0);
    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, colorTexture);
    Gdx.gl.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_RGBA, width, height
            , 0, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, null);

    Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_NEAREST);
    Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_NEAREST);

    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, 0);

    intBuffer.clear();
    Gdx.gl.glGenTextures(1, intBuffer);
    depthTexture = intBuffer.get(0);
    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, depthTexture);
    Gdx.gl.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_DEPTH_COMPONENT, width, height
            , 0, GL20.GL_DEPTH_COMPONENT, GL20.GL_UNSIGNED_SHORT, null);

    Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_NEAREST);
    Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_NEAREST);

    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, 0);


    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, frameBuffer);

    Gdx.gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_COLOR_ATTACHMENT0
            , GL20.GL_TEXTURE_2D, colorTexture, 0);

    Gdx.gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT
            , GL20.GL_TEXTURE_2D, depthTexture, 0);


    int status = Gdx.gl.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
    if (status != GL20.GL_FRAMEBUFFER_COMPLETE)
    {
        System.out.println("frame buffer not complete. status " + Integer.toHexString(status));
        System.exit(0);
    }


    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);

    status = Gdx.gl.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
    if (status != GL20.GL_FRAMEBUFFER_COMPLETE)
    {
        System.out.println("default buffer not complete. status " + Integer.toHexString(status));
        System.exit(0);
    }

我完全不确定在设置渲染缓冲区或颜色纹理或深度纹理附件时是否犯了错误。 无论如何,进入渲染循环

            // update cameras and things


    // setup rendering to off screen framebuffer
    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, frameBuffer);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);    
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    // draw things

    // setup rendering to default framebuffer

    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    shader.begin();

    // setup shader stuff 

    Gdx.gl.glActiveTexture(0);
    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, depthTexture);
    shader.setUniformi("u_fbDepth", 0);

    Gdx.gl.glActiveTexture(1);
    Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, colorTexture);
    shader.setUniformi("u_fbColor", 1);

    // draw things with shader 

    shader.end();

同样,我不确定我是否以正确的方式进行设置。 希望这里的想法很明确。 渲染到屏幕外的帧缓冲区,然后使用该帧缓冲区中的深度颜色纹理作为纹理,以在渲染到默认帧缓冲区的最终着色器中进行采样。

但是,片段着色器中的深度和颜色纹理只是空的。 黑屏。 我知道片段着色器不是问题-如果我采样不同的纹理,则可以看到预期的纹理。 我知道画图本身不是问题-如果我将要渲染的内容直接渲染到屏幕外的帧缓冲区到默认的帧缓冲区,我会看到我期望的结果。

我知道了。 设置活动纹理有些麻烦。 函数glActiveTexture需要GL_TEXTURE0类型的常量之一,但着色器统一只希望是常量名称中的整数。

基本上

Gdx.gl.glActiveTexture(0);
Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, depthTexture);
shader.setUniformi("u_fbDepth", 0);

Gdx.gl.glActiveTexture(1);
Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, colorTexture);
shader.setUniformi("u_fbColor", 1);

需要成为

Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, depthTexture);
shader.setUniformi("u_fbDepth", 0);

Gdx.gl.glActiveTexture(GL20.GL_TEXTURE1);
Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, colorTexture);
shader.setUniformi("u_fbColor", 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM