我有工作代码使用 glMapBufferRange()
来自android上的opengl es 3.0,如下所示:
glBindBuffer(GL_ARRAY_BUFFER, myVertexBufferName);
glBufferData(GL_ARRAY_BUFFER, myVertexBufferSize, null, GL_STATIC_DRAW);
ByteBuffer mappedBuffer = (ByteBuffer)glMapBufferRange(
GL_ARRAY_BUFFER,
0, myVertexBufferSize,
GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
// [fill buffer...]
glUnmapBuffer(GL_ARRAY_BUFFER);
我的问题是关于贬低选举的结果 glMapBufferRange()
至 ByteBuffer
在第三行。 glMapBufferRange()
声明为返回 Buffer
: public static Buffer glMapBufferRange (int target, int offset, int length, int access)
在我的测试平台上,函数返回 ByteBuffer
所以cast是可行的,但是对所有支持opengles3+的平台或android版本进行这种假设似乎并不安全。虽然它看起来很合理,但我还没有找到任何文档来保证它,而且如果它得到了保证,那么似乎应该将函数声明为返回 ByteBuffer
.
正确的使用方法是什么(最好有文档支持) Buffer
退回人 glMapBufferRange()
?
1条答案
按热度按时间tvokkenx1#
正如你已经发现的,文件是缺乏的。但是仍然有一个相当确凿的参考:opengljava绑定的实现是公共android源代码的一部分。
如果您看一下
glMapBufferRange()
,它位于文件glmapbufferrange.cpp中,您可以看到缓冲区是通过调用名为NewDirectByteBuffer()
. 基于此,可以安全地假设缓冲区确实是一个ByteBuffer
.虽然供应商可以更改android代码,但似乎不太可能有人会更改java绑定的行为(除了修复bug)。如果您担心在以后的android版本中实现可能会发生变化,那么您当然可以使用标准的java类型检查:
或者你可以用更细致的思考,从打电话开始
getClass()
在返回的缓冲区上。下一个问题当然是,如果返回的缓冲区不是ByteBuffer
. 对我来说这是唯一有意义的类型。