LWJGL 使用 fbo 纹理作为着色器的输入



我正在尝试使用着色器将纹理复制到帧缓冲区对象的GL_COLOR_ATTACHMENT0。我使用了一个我的世界锻造核心模将游戏(有一些更改)渲染为GL_COLOR_ATTACHMENT1。此步骤有效,因为我可以使用glBlitFramebuffer将其复制到GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT0中的所有内容都由 Minecraft 渲染到屏幕上)。

我创建了一个着色器,它接受纹理作为输入并通过修改绘制纹理。当我更改绑定纹理(以 //FIXME 结尾的行)时,我会将游戏纹理绘制到修改GL_COLOR_ATTACHMENT0

当我尝试渲染我创建的纹理时,我只会得到一个黑屏。我尝试使用单独的帧缓冲对象来保存纹理,并将纹理与帧缓冲对象解除绑定。这两种尝试都导致了相同的黑屏。

如何使用着色器将纹理渲染为GL_COLOR_ATTACHMENT0

    //<render to GL_COLOR_ATTACHMENT1>
    //Use shader
    GL20.glUseProgram(shader.getShaderProgram());
    //Setup view
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glPushMatrix();
    GL11.glLoadIdentity();
    GL11.glOrtho(-1, 1, -1, 1, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPushMatrix();
    GL11.glLoadIdentity();
    //Render
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, shader.getVbo());
    GL20.glEnableVertexAttribArray(0);
    GL20.glVertexAttribPointer(0, 2, GL11.GL_BYTE, false, 0, 0L);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); //FIXME
    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
    GL20.glDisableVertexAttribArray(0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    //Reset view
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glPopMatrix();
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPopMatrix();
    //Reset shader
    GL20.glUseProgram(0);
    //<draw HUD>
    //<render to screen>

首先,您使用的是已弃用的OpenGL,除非您确实需要它,否则您应该跳过它。

其次,您可能希望使用此示例作为灵感。它在RENDERRESOLVE fbo之间有一个glBlitFramebuffer,但这对你没有兴趣。您应该查看通行证 2,其中:

  • 绑定默认 FBO
  • 设置视口
  • 清除颜色缓冲区
  • 设置转换矩阵
  • 绑定要渲染的纹理
  • 绑定 VAO
  • 最后它使用 glDrawArraysInstanced 渲染,但您只需使用 glDrawArrays

最新更新