我正在尝试使用着色器将纹理复制到帧缓冲区对象的GL_COLOR_ATTACHMENT0
。我使用了一个我的世界锻造核心模将游戏(有一些更改)渲染为GL_COLOR_ATTACHMENT1
。此步骤有效,因为我可以使用glBlitFramebuffer
将其复制到GL_COLOR_ATTACHMENT0
(GL_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,除非您确实需要它,否则您应该跳过它。
其次,您可能希望使用此示例作为灵感。它在RENDER
和RESOLVE
fbo之间有一个glBlitFramebuffer
,但这对你没有兴趣。您应该查看通行证 2,其中:
- 绑定默认 FBO
- 设置视口
- 清除颜色缓冲区
- 设置转换矩阵
- 绑定要渲染的纹理
- 绑定 VAO
- 最后它使用
glDrawArraysInstanced
渲染,但您只需使用glDrawArrays