FBO lwjgl 大于屏幕尺寸 - 我做错了什么?

FBO lwjgl bigger than Screen Size - What I'm doing wrong?

我又需要你的帮助了。我想使用大于屏幕尺寸的帧缓冲区对象。当我这样做时,FBO 尺寸 1024 x 1024 从分辨率 1024 x 768 的顶部被截断。我自己找不到解决方案 - 这就是我问的原因。

代码的第一部分是我创建 FBO 的方式,我在激活和停用之间进行渲染。后来我用texture.

我做错了什么?

清除帧缓冲区对象以供重用的最快方法是什么?

public FrameBufferObject(int width, int height) {
    this.width = width;
    this.height = height;
    texture = glGenTextures();
    frameBufferObject = GL30.glGenFramebuffers();
    activate();
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_BYTE, BufferUtils.createByteBuffer(4 * width * height));
    GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    deactivate();
}

public void activate() {
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBufferObject);
}

public void deactivate();
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
}

OpenGL 设置:

private static void initializeOpenGL() {
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_MULTISAMPLE);
    glEnable(GL_BLEND);
    glEnable(GL_SCISSOR_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0, 0, 0, 0);
}

您需要在绑定后、开始渲染之前使用 FBO 维度调用 glViewport()。请注意,视口尺寸是全局状态,而不是每个帧缓冲区的状态,因此当您再次渲染到默认帧缓冲区时,您还必须将它们重新设置。

根据您在问题中使用的数字(您显然不想在实际代码中使用硬编码数字):

public void activate() {
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBufferObject);
    glViewport(0, 0, 1024, 1024);
}

public void deactivate();
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
    glViewport(0, 0, 1024, 768);
}