Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL使用fbo纹理作为着色器的输入_Java_Opengl_Lwjgl_Minecraft Forge - Fatal编程技术网

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