android - 渲染索引三角形在 Opengl ES 2.0 的跟踪器中显示模式 GL_MAP_INVALIDATE_RANGE_BIT

标签 android opengl-es

我正在尝试使用以下代码呈现一些索引 VBO 三角形:

    letterFrameSP.useProgram();
            glBindBuffer(GL_ARRAY_BUFFER, letterFrame.getBufferVertex());
            glVertexAttribPointer(
                    letterFrameSP.getaPositionLocation(),
                    3,
                    GL_FLOAT,
                    false,
                    letterFrame.getStride(),
                    0);
            glEnableVertexAttribArray(letterFrameSP.getaPositionLocation());
            glVertexAttribPointer(
                    letterFrameSP.getaNormalLocation(),
                    3,
                    GL_FLOAT,
                    false,
                    letterFrame.getStride(),
                    3*Math3dUtil.BYTES_PER_FLOAT);
            glEnableVertexAttribArray(letterFrameSP.getaNormalLocation());
            glVertexAttribPointer(
                    letterFrameSP.getaCubeIndex(),
                    1,
                    GL_FLOAT,
                    false,
                    letterFrame.getStride(),
                    (3+3)*Math3dUtil.BYTES_PER_FLOAT);
            glEnableVertexAttribArray(letterFrameSP.getaCubeIndex());
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,letterFrame.getBufferIndex());
glDrawElements(
                        GLES20.GL_TRIANGLES,
                        letterFrame.getTriangleIndexCount(),
                        GL_UNSIGNED_SHORT,
                        0);

屏幕是黑色的,呈现任何三角形。我使用 Tracer For Opengl ES,结果如下:

glClear(mask = 16640)
glUseProgram(program = 3)
glBindBuffer(target = GL_ARRAY_BUFFER, buffer = 2)
glVertexAttribPointer(indx = 1101, size = 3, type = GL_FLOAT, normalized = false, stride = 28, ptr = 0x0)
glEnableVertexAttribArray(index = 1101)
glVertexAttribPointer(indx = -1, size = 3, type = GL_FLOAT, normalized = false, stride = 28, ptr = 0xc)
glEnableVertexAttribArray(index = -1)
glVertexAttribPointer(indx = 0, size = 1, type = GL_FLOAT, normalized = false, stride = 28, ptr = 0x18)
glEnableVertexAttribArray(index = 0)
glBindBuffer(target = GL_ELEMENT_ARRAY_BUFFER, buffer = 1)
glUniformMatrix4fv(location = 0, count = 1, transpose = false, value = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -20.0, 1.0])
glUniformMatrix4fv(location = 0, count = 1, transpose = false, value = [3.2629604, 0.0, 0.0, 0.0, 0.0, 2.4142134, 0.0, 0.0, 0.0, 0.0, -1.020202, -1.0, 0.0, 0.0, 18.383839, 20.0])
glUniform3f(location = 1229, x = 0,000000, y = 10,000000, z = -10,000000)
glUniform1fv(location = 1230, count = 128, v = [0.0])
glUniform4f(location = 1231, x = 1,000000, y = 0,500000, z = 0,500000, w = 1,000000)
glDrawElements(mode = GL_MAP_INVALIDATE_RANGE_BIT, count = 3840, type = GL_UNSIGNED_SHORT, indices = 0x0)
glBindBuffer(target = GL_ARRAY_BUFFER, buffer = 0)
glBindBuffer(target = GL_ELEMENT_ARRAY_BUFFER, buffer = 0)
glDisableVertexAttribArray(index = 1101)
glDisableVertexAttribArray(index = -1)
glDisableVertexAttribArray(index = 0)
eglSwapBuffers

下一行是什么意思?

glDrawElements(mode = GL_MAP_INVALIDATE_RANGE_BIT, count = 3840, type = GL_UNSIGNED_SHORT, indices = 0x0)

我在 glDrawElements 函数中使用模式 GLES20.GL_TRIANGLES,但在跟踪器中出现 GL_MAP_INVALIDATE_RANGE_BIT。为什么?

最佳答案

使用 protobuf 编码的捕获轨迹仅包含参数的数值。

GL_TRIANGLESGL_MAP_INVALIDATE_RANGE_BIT 具有相同的值。来自官方 OpenGL 头文件:

#define GL_TRIANGLES                      0x0004
...
#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004

跟踪显示工具不是很智能,它选择了错误的数值枚举表示。

这两个具有相同值的“枚举”在常规 OpenGL 使用中不是问题,因为它们永远不会用作相同 API 调用的可能参数:

  • GL_MAP_INVALIDATE_RANGE_BIT 是位掩码的一个可能值,并且只能传递给特定的 API 调用,如 glMapBufferRange(),需要相应的位掩码值。
  • GL_TRIANGLES 是一个常规枚举,作为参数传递给 glDraw*() 调用。它恰好有一个非常低的值,因为它是 OpenGL 原始版本中定义的第一个值。

所以这是无害的。如果跟踪显示工具知道哪些参数对哪些 API 调用有效,它就可以轻松显示正确的值。

关于android - 渲染索引三角形在 Opengl ES 2.0 的跟踪器中显示模式 GL_MAP_INVALIDATE_RANGE_BIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28300695/

相关文章:

java - jetty : store request-specific information

android - 在 openGl android(Wear) 中绘制基于图像的纹理

iphone - glDrawElements VAO/VBO 在 iOS 上崩溃

ios - 在不使用 GLKIT 的情况下创建(从头开始)iOS 7.0 OpenGL ES 2.0 应用程序时出现问题

android - Galaxy S4 Android 4.4.2 上的 OpenGL 3

android - android 2.3.5 和 2.3.6 上的 HttpURLConnection

android - Eclipse:JNI代码调试问题

java - 约束布局 : Unable to Wrap_Content and Stack RecyclerView Items

android - 适用于 Android 的 AIR 3 native 扩展 - 我可以/如何包含第 3 方库吗?

c++ - 为什么在调用 glDrawArrays 之前不需要绑定(bind)顶点缓冲区对象?