【问题标题】:glMapBufferRange returns null and produces a GL_INVALID_ENUM?glMapBufferRange 返回 null 并产生一个 GL_INVALID_ENUM?
【发布时间】:2020-05-19 00:16:04
【问题描述】:

这里是 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,谷歌告诉我是 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 吗?

【问题讨论】:

    标签: opengl-es buffer transform-feedback


    【解决方案1】:

    当然glMapBufferRange 会导致GL_INVALID_ENUM 错误。
    OpenGL ES 3.2 Specification - MapBufferRange

    如果目标不是表 6.1 中列出的目标之一,则会生成 INVALID_ENUM 错误。

    注意,这个 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);
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2015-09-16
      • 2019-07-05
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多