LWJGL使用fbo纹理作为着色器

时间:2016-02-24 03:08:32

标签: java opengl lwjgl minecraft-forge

我正在尝试使用着色器将纹理复制到framebuffer对象的GL_COLOR_ATTACHMENT0。我使用了一个minecraft-forge coremod来渲染游戏(有一些变化)到GL_COLOR_ATTACHMENT1。此步骤正常,因为我可以使用glBlitFramebuffer将其复制到GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT0中的所有内容都会被Minecraft渲染到屏幕上。

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

当我尝试渲染我创建的纹理时,我只是得到一个黑屏。我已经尝试使用单独的framebuffer对象来保存纹理,并从framebuffer对象解除绑定纹理。这两次尝试都导致了相同的黑屏。

如何使用着色器将纹理渲染到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>

1 个答案:

答案 0 :(得分:0)

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

其次,您可能希望使用this sample作为灵感。它在glBlitFramebufferRENDER fbo之间有RESOLVE,但这对您没有兴趣。你应该看看pass 2,它在哪里:

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