0

lwjgl でテクスチャにレンダリングする FBO を作成しようとしています。コードは 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 で、このコンピューターはまだ 1 年しか経っていないので、なぜ 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

FrameBuffers の作成に EXT 拡張を使用しないでください。バージョン 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 がフレームバッファのコア関数を使用するには、次のものをインポートする必要があります。

import static org.lwjgl.opengl.GL30.*;

変数

次のコードでは、次の 2 つの変数が使用されています。

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 に答える