0

我正在尝试创建一个 FBO 以渲染到 lwjgl 中的纹理。该代码在 Linux 和 Windows 上运行良好,但在我的 iMac 上却是平淡无奇。

相关行如下

 System.out.println(GLContext.getCapabilities().GL_EXT_framebuffer_object); 
    framebuffers[0] = glGenFramebuffersEXT();    

能力返回 false,并调用生成帧缓冲区抛出

 Exception: java.lang.IllegalStateException: Function is not supported    

这是您尝试调用不受支持的函数时所期望的。mac 中的显卡是 NVIDIA GeForce GTX 675MX 1024 MB,鉴于这台电脑只有一年的历史,我对为什么不支持 FBO 有点困惑。

这里的苹果文档https://developer.apple.com/library/mac/documentation/graphicsimaging/conceptual/opengl-macprogguide/OpenGLProg_MacOSX.pdf指出,如果 FBO 不可用,我应该使用 PBO。好的,我可以这样做,但是在 PBO 的相关部分中它指出

"Important: Pixel buffers are deprecated starting with OS X v10.7 and are 
 not supported by the OpenGL 3.2 Core profile; use framebuffer objects instead."

所以我似乎在这里追逐我的尾巴。我有 OSX > 10.7 但没有 FBO :S
我的问题是,这是 Mac 上的 opengl、Mac 上的 fbo 或 Mac 上的 lwjgl 的已知问题,我应该怎么做才能解决这个问题。

顺便说一句,如果有帮助,我有以下信息。

 LWJGL Version: 2.9.0
OpenGL Verison: 3.2 NVIDIA-8.16.74 310.40.00.10f02
OpenGL Shader Version: 1.50    
4

1 回答 1

3

不要使用 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.*;
于 2013-11-05T23:02:22.827 回答