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.*;