java - 在运行 OSX 10.8.5 的 iMac 上使用 LWJGL 创建 FBO

标签 java macos opengl lwjgl fbo

我正在尝试创建一个 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    

最佳答案

不要使用 EXT 扩展来创建 FrameBuffer,它们已在 3.x 版本中添加到核心

您应该使用核心功能而不是扩展的原因是。

您永远无法确定扩展程序是否可用,这取决于多种因素,例如。

  • 您使用的 OpenGL 版本
  • 您的显卡
  • 您的显卡版本和型号(GeForce、Cuda、Radeon 等)
  • 您的显卡供应商(Nvidia、AMD 等)

通过使用核心函数,只要他们的显卡可以运行特定的 GL 版本,大多数人就有可能能够运行该程序。

  • EXT 扩展通常仅受少数供应商支持。
  • ARB 扩展通常受到大多数(但不一定是所有)供应商的支持。
  • 每张支持程序所使用的特定 GL 版本的卡都支持核心功能。

System.out.println(GLContext.getCapabilities().GL_EXT_framebuffer_object);

With the capability returning false, and the call to generate the framebuffer throwing

嗯,这几乎证明了我关于扩展和核心功能的观点。正如核心功能所说,您只需要一 block 支持所需 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);

绑定(bind)FBO

glBindFramebuffer(GL_FRAMEBUFFER, fbo_handle);

绑定(bind)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.*;

关于java - 在运行 OSX 10.8.5 的 iMac 上使用 LWJGL 创建 FBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19800618/

相关文章:

java - 迭代器可以防止其 LinkedList 被垃圾收集吗?

java - 直接在模型上检查验证

macos - Yesod 二进制不可用

c++ - OpenGL 只显示在方法中加载的纹理?

c++ - 在 OpenGL 中将深度渲染到纹理时出现奇怪的结果

java - 如何在整数数组中找到重复的整数序列?

Java泛型捕获和比较

macOS触摸栏图标位置

objective-c - 无需启动应用程序即可提供 OSX 服务?

android - genymotion 在没有 opengl 的虚拟系统中,这可能吗?