我正在尝试使用着色器将纹理复制到framebuffer对象的GL_COLOR_ATTACHMENT0
。我使用了一个minecraft-forge coremod来渲染游戏(有一些变化)到GL_COLOR_ATTACHMENT1
。此步骤正常,因为我可以使用glBlitFramebuffer
将其复制到GL_COLOR_ATTACHMENT0
(GL_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>
答案 0 :(得分:0)
首先,您使用已弃用的OpenGL,除非确实需要,否则应跳过它。
其次,您可能希望使用this sample作为灵感。它在glBlitFramebuffer
和RENDER
fbo之间有RESOLVE
,但这对您没有兴趣。你应该看看pass 2,它在哪里:
glDrawArraysInstanced
渲染,但您只需使用glDrawArrays
代替