我在Android上使用OpenGL-es3.0中的glMapBufferRange()编写了工作代码,如下所示:
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()为declared to return a Buffer
public static Buffer glMapBufferRange (int target, int offset, int length, int access)
在我的测试平台上,这个函数会返回ByteBuffer的一个子类,所以强制转换可以正常工作,但是在支持OpenGL-ES 3+的所有平台或安卓版本上做这样的假设似乎并不安全。尽管这看起来很合理,但我还没有找到任何文档来保证它,而且如果它得到了保证,似乎应该将该函数声明为返回ByteBuffer。
使用glMapBufferRange()返回的Buffer的正确方式(最好有文档支持)是什么
发布于 2015-04-29 10:50:50
正如您已经发现的,文档是缺乏的。但是仍然有一个相当确凿的参考: Android绑定的实现是公共OpenGL源代码的一部分。
如果查看glMapBufferRange.cpp文件中的glMapBufferRange()的JNI包装器的实现,就会发现缓冲区是通过调用名为NewDirectByteBuffer()的函数来分配的。基于此,似乎可以安全地假设缓冲区确实是一个ByteBuffer。
虽然供应商可以更改Android代码,但似乎任何人都不太可能更改Java绑定的行为(可能只是为了修复bug)。如果您担心在以后的Android版本中实现可能会发生变化,那么您当然可以使用标准的Java类型检查:
Buffer buf = glMapBufferRange(...);
ByteBuffer byteBuf = null;
if (buf instanceof ByteBuffer) {
byteBuf = (ByteBuffer)buf;
}或者,您可以使用更复杂的反射,首先在返回的缓冲区上调用getClass()。下一个问题当然是,如果返回的缓冲区不是ByteBuffer,该怎么办。对我来说,这是唯一有意义的类型。
https://stackoverflow.com/questions/29921348
复制相似问题