glMapBufferRange returns null 并产生一个 GL_INVALID_ENUM?
glMapBufferRange returns null and produces a GL_INVALID_ENUM?
此处为 OpenGL ES 3.0。我正在尝试像这样读回 TRANSFORM_FEEDBACK 缓冲区的内容:
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
GLES30.glEnable(GL_RASTERIZER_DISCARD);
GLES30.glDrawArrays( GLES30.GL_POINTS, 0, mNumVertices );
GLES30.glDisable(GL_RASTERIZER_DISCARD);
GLES30.glEndTransformFeedback();
int error1 = GLES30.glGetError();
Log.e("mesh", "begin, error="+error1);
ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange( GLES30.GL_TRANSFORM_FEEDBACK, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);
if( buffer!=null )
{
// use it
}
else
{
int error2 = GLES30.glGetError();
Log.e("mesh", "failed to map tf buffer, error="+error2);
}
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
输出为
E: begin, error=0
E: failed to map tf buffer, error=1280
即看起来确实像 glMapBufferRange() 生成错误 1280,Google 告诉我是 GL_INVALID_ENUM.
问题:
根据 https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml,glMapBufferRange 永远不会产生这样的错误。只有 GL_INVALID_VALUE、GL_INVALID_OPERATION 和 GL_OUT_OF_MEMORY ?
当然 glMapBufferRange
会导致 GL_INVALID_ENUM
错误。
参见 OpenGL ES 3.2 Specification - MapBufferRange
An INVALID_ENUM error is generated if target is not one of the targets listed in table 6.1.
请注意,此 khronos 页面不是 OpenGL (ES) 规范。此页面仅用于帮助和 wiki 目的。
枚举常量 GL_TRANSFORM_FEEDBACK
是操作 glBindTransformFeedback
的目标。
glMapBufferRange
的有效目标是 GL_TRANSFORM_FEEDBACK_BUFFER
:
ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange(
GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);
此处为 OpenGL ES 3.0。我正在尝试像这样读回 TRANSFORM_FEEDBACK 缓冲区的内容:
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
GLES30.glEnable(GL_RASTERIZER_DISCARD);
GLES30.glDrawArrays( GLES30.GL_POINTS, 0, mNumVertices );
GLES30.glDisable(GL_RASTERIZER_DISCARD);
GLES30.glEndTransformFeedback();
int error1 = GLES30.glGetError();
Log.e("mesh", "begin, error="+error1);
ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange( GLES30.GL_TRANSFORM_FEEDBACK, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);
if( buffer!=null )
{
// use it
}
else
{
int error2 = GLES30.glGetError();
Log.e("mesh", "failed to map tf buffer, error="+error2);
}
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
输出为
E: begin, error=0
E: failed to map tf buffer, error=1280
即看起来确实像 glMapBufferRange() 生成错误 1280,Google 告诉我是 GL_INVALID_ENUM.
问题:
根据 https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml,glMapBufferRange 永远不会产生这样的错误。只有 GL_INVALID_VALUE、GL_INVALID_OPERATION 和 GL_OUT_OF_MEMORY ?
当然 glMapBufferRange
会导致 GL_INVALID_ENUM
错误。
参见 OpenGL ES 3.2 Specification - MapBufferRange
An INVALID_ENUM error is generated if target is not one of the targets listed in table 6.1.
请注意,此 khronos 页面不是 OpenGL (ES) 规范。此页面仅用于帮助和 wiki 目的。
枚举常量 GL_TRANSFORM_FEEDBACK
是操作 glBindTransformFeedback
的目标。
glMapBufferRange
的有效目标是 GL_TRANSFORM_FEEDBACK_BUFFER
:
ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange(
GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);