4

LWJGL APIは直接のopenGL呼び出しではありません。どこを見ても、抽象化の小さな層があります。それが軽量と呼ばれる理由だと思います。

抽象化の多くは類似しています。たとえば、この例のコードはソース全体で共通です。

public static void glBufferSubData(int target, long offset, FloatBuffer data) {
    ContextCapabilities caps = GLContext.getCapabilities();
    long function_pointer = caps.glBufferSubData;
    BufferChecks.checkFunctionAddress(function_pointer);
    BufferChecks.checkDirect(data);
    nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer);
}

ご覧のとおり、LWJGLユーザーがこの関数を呼び出してから、この関数が実際のGL関数を呼び出します。nglBufferSubDataの「n」はネイティブを表すと思います。

だから私の質問は、このコードはどういう意味ですか?私はこの関数が何をするのか考えています、それはデータをopenGLバッファオブジェクトに送信します。コードで起こっていることを理解していません。誰かが私のためにそれを分解できますか?

4

1 に答える 1

4

一部の OpenGL 機能は、拡張機能を通じて利用できます。プラットフォームが異なれば、サポートされる拡張機能や OpenGL 仕様の機能も異なります。

ContextCapabilitiesクラスは、どの機能がサポートされているかを認識しています。

long function_pointer = caps.glBufferSubData;ネイティブ OpenGL メソッドglBufferSubDataへのポインターを取得します。

BufferChecks.checkFunctionAddress(function_pointer);そのポインターが null でないかどうかを確認します。null の場合 - 機能がサポートされておらず、例外がスローされます。

BufferChecks.checkDirect(data);バッファーが直接(そして、暗黙的に非 null) かどうかを保証します。

nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer);これで、適切なデータとglBufferSubDataへの適切なポインターが得られました。ここでは、指定されたターゲット、オフセット、およびサイズ (バイト単位) で呼び出します。

于 2013-02-22T12:06:40.223 に答える