Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 OpenGL绘制多个纹理_Java_Opengl_Lwjgl - Fatal编程技术网

Java OpenGL绘制多个纹理

Java OpenGL绘制多个纹理,java,opengl,lwjgl,Java,Opengl,Lwjgl,我正在尝试将场景的数据绘制到多个纹理。纹理以颜色形式保存漫反射、法线和位置。渲染场景时,仅绘制一个纹理。gl_FragData[0]在带有附件gl_COLOR_ATTACHMENT2的纹理中结束。如果我将gl_FragData[0]切换为“漫反射”,则为“正常”。或者定位GL_COLOR_ATTACHMENT2纹理的数据是正确的,因此我知道着色器中的数据是正确的,但前两个纹理最终为空白 int fbo = glGenFramebuffer(); glBindFramebuffer(GL_FRAM

我正在尝试将场景的数据绘制到多个纹理。纹理以颜色形式保存漫反射、法线和位置。渲染场景时,仅绘制一个纹理。gl_FragData[0]在带有附件gl_COLOR_ATTACHMENT2的纹理中结束。如果我将gl_FragData[0]切换为“漫反射”,则为“正常”。或者定位GL_COLOR_ATTACHMENT2纹理的数据是正确的,因此我知道着色器中的数据是正确的,但前两个纹理最终为空白

int fbo = glGenFramebuffer();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
addTextureAttachment(GL_COLOR_ATTACHMENT0);
addTextureAttachment(GL_COLOR_ATTACHMENT1);
addTextureAttachment(GL_COLOR_ATTACHMENT2);
Material.unbindAllTextures();

public void addTextureAttachment(int attachment) {
    int id = glGenTextures();
    glBindTexture(GL_TEXTURE_2D, id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer)null);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, id, 0);
    textures.add(new Texture(id, width, height));
}
在渲染之前我称之为

public void bindAsRenderTarget() {
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glViewport(0, 0, width, height);
    glDrawBuffers(GL_COLOR_ATTACHMENT0);
    glDrawBuffers(GL_COLOR_ATTACHMENT1);
    glDrawBuffers(GL_COLOR_ATTACHMENT2);
}

我已经解决了这个问题。当我调用glDrawBuffers 3次时,我只需要调用一个不同的glDrawBuffers,它接收包含int GL_COLOR_附件0、1和2的ByteBuffer,如下所示:

    ByteBuffer buffer = BufferUtils.createByteBuffer(3 * 4);
    buffer.putInt(GL_COLOR_ATTACHMENT0);
    buffer.putInt(GL_COLOR_ATTACHMENT1);
    buffer.putInt(GL_COLOR_ATTACHMENT2);
    buffer.flip();

    glDrawBuffers(3, buffer);

有一个关于MRT渲染的部分: