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 - 功能并引发异常。

BufferChecks.checkDirect(data);确保缓冲区是否是直接的(并且隐含地,非空)。

nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer);现在我们有了正确的数据和指向glBufferSubData的正确指针,在这里我们使用指定的目标、偏移量和字节大小来调用它。

于 2013-02-22T12:06:40.223 回答