不要使用 EXT 扩展来创建 FrameBuffers,它们是在 3.x 版本中添加到核心的
您应该在扩展上使用核心功能的原因是。
您永远无法确定扩展是否可用,这取决于各种因素,例如。
- 您正在使用的 OpenGL 版本
- 你的显卡
- 您的显卡版本和型号(GeForce、Cuda、Radeon 等)
- 您的显卡供应商(Nvidia、AMD 等)
通过使用核心功能,大多数人都可以运行程序,只要他们的显卡可以运行特定的 GL 版本。
- EXT 扩展通常只有少数供应商支持。
- 大多数供应商通常都支持 ARB 扩展,但不一定是所有供应商。
- 每张支持程序正在使用的特定 GL 版本的卡都支持核心功能。
System.out.println(GLContext.getCapabilities().GL_EXT_framebuffer_object);
能力返回 false,并调用生成帧缓冲区抛出
好吧,这几乎证明了我关于扩展和核心功能的观点。正如核心功能所说,您只需要一个支持所需OpenGL版本或更高版本的显卡。
我对OpenGL Extension vs OpenGL Core做了更深入的回答,你可以点击链接。
为了让 LWJGL 使用核心 Framebuffer 功能,您需要导入以下内容
import static org.lwjgl.opengl.GL30.*;
变量
以下代码中使用了以下几个变量。
int fbo_handle = -1;
int texture_handle = -1;
int rbo_depth_buffer_handle = -1;
创建 FBO
fbo_handle = glGenFramebuffers();
this.texture_handle = glGenTextures();
rbo_depth_buffer_handle = glGenRenderbuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo_handle);
glBindTexture(GL_TEXTURE_2D, texture_handle);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, (ByteBuffer) null);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_handle, 0);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth_buffer_handle);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo_depth_buffer_handle);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
System.err.println("Framebuffer configuration error");
}
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
绑定 FBO
glBindFramebuffer(GL_FRAMEBUFFER, fbo_handle);
绑定 FBO 纹理
glActiveTexture(GL_TEXTURE0); // This is for Shader usage
glBindTexture(GL_TEXTURE_2D, texture_handle);
处置 FBO
glDeleteFramebuffers(fbo_handle);
glDeleteRenderbuffers(rbo_depth_buffer_handle);
glDeleteTextures(texture_handle);
所有需要的进口
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL30.*;