Java LWJGL使用fbo纹理作为着色器的输入
我正在尝试使用着色器将纹理复制到帧缓冲区对象的Java LWJGL使用fbo纹理作为着色器的输入,java,opengl,lwjgl,minecraft-forge,Java,Opengl,Lwjgl,Minecraft Forge,我正在尝试使用着色器将纹理复制到帧缓冲区对象的GL\u COLOR\u ATTACHMENT0。我使用minecraft forge coremod将游戏渲染为GL\u COLOR\u ATTACHMENT1。这一步很有效,因为我可以使用glBlitFramebuffer将其复制到GL\u COLOR\u ATTACHMENT0(Minecraft会将GL\u COLOR\u ATTACHMENT0中的所有内容呈现到屏幕上) 我创建了一个着色器,它接受纹理作为输入,并通过修改绘制纹理。当我更改绑
GL\u COLOR\u ATTACHMENT0
。我使用minecraft forge coremod将游戏渲染为GL\u COLOR\u ATTACHMENT1
。这一步很有效,因为我可以使用glBlitFramebuffer
将其复制到GL\u COLOR\u ATTACHMENT0
(Minecraft会将GL\u COLOR\u ATTACHMENT0
中的所有内容呈现到屏幕上)
我创建了一个着色器,它接受纹理作为输入,并通过修改绘制纹理。当我更改绑定纹理(以//FIXME
结尾的线条)时,我会将游戏纹理绘制到GL\u COLOR\u ATTACHMENT0
当我尝试渲染我创建的纹理时,我只得到一个黑屏。我尝试使用单独的帧缓冲区对象来保存纹理,并从帧缓冲区对象解除纹理绑定。这两次尝试都导致了相同的黑屏
如何使用着色器将纹理渲染到GL\u COLOR\u 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>
//
//使用着色器
GL20.glUseProgram(shader.getShaderProgram());
//设置视图
GL11.glMatrixMode(GL11.GLU投影);
GL11.glPushMatrix();
GL11.glLoadIdentity();
GL11.glOrtho(-1,1,-1,1,-1,1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glLoadIdentity();
//渲染
GL15.glBindBuffer(GL15.GL_数组_BUFFER,shader.getVbo());
GL20.GlenableVertexAttributeArray(0);
GL20.glvertexattributepointer(0,2,GL11.GL_字节,false,0,0L);
GL11.glBindTexture(GL11.GL_TEXTURE_2D,纹理)//修理工
GL11.GLDrawArray(GL11.GLU三角形,0,6);
GL11.glBindTexture(GL11.GL_TEXTURE_2D,0);
GL20.glDisableVertexAttributeArray(0);
GL15.glBindBuffer(GL15.GL_数组_BUFFER,0);
//重置视图
GL11.glMatrixMode(GL11.GLU投影);
GL11.glPopMatrix();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPopMatrix();
//重置着色器
GL20.glUseProgram(0);
//
//
首先,您使用的是不推荐使用的OpenGL,除非您确实需要它,否则应该跳过它
第二,你可能想用它作为灵感。它在RENDER
和RESOLVE
fbo之间有一个glBlitFramebuffer
,但您对此不感兴趣。相反,您应该查看以下内容:
- 绑定默认的fbo
- 设置视口
- 清除颜色缓冲区
- 设置转换矩阵
- 绑定要渲染的纹理
- 绑定vao
- 最后,它使用
进行渲染,但您只需使用glDrawArraysInstanced
glDrawArrays