1
我需要你的帮助了。我想使用大于屏幕尺寸的Frame Buffer Object。当我做到这一点时,FBO 1024 x 1024的分辨率会在1024 x 768分辨率下从顶部切断。我自己找不到解决方案 - 这就是为什么我要问。FBO lwjgl比屏幕尺寸大 - 我做错了什么?
代码的第一部分是我创建FBO的方式,我在激活和停用之间进行渲染。之后我使用纹理。
我在做什么错?
什么是清除帧缓冲区对象重用的最快方法?
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);
}
非常感谢您的回答。我已经尝试过,但一切都变得艰难。那么我必须解决这个问题。再次感谢你。 – Przemek 2015-02-11 09:23:28
那么,你不能将你最初渲染成1024x768表面的内容填充到1024x1024表面而不会被拉伸。如果您使用的是投影矩阵,则可能也必须对其进行调整,因为它通常包含曲面的高宽比。 – 2015-02-11 15:02:46
那么它不起作用。还有其他一些事情也应该是错误的。 FBO仍然从顶部切断。我也使用glScissors,并在渲染之前将其设置为glViewport。没有不同。这里还有什么可能是错的?我已经将OpenGL设置添加到第一篇文章。 – Przemek 2015-02-13 00:10:34