Opengl es 仅Nexus 4设备上的VAO错误

Opengl es 仅Nexus 4设备上的VAO错误,opengl-es,nexus-4,vao,Opengl Es,Nexus 4,Vao,当我使用顶点数组对象时,我在使用OpenGLES2的Nexus4上遇到了一个奇怪的错误 以下是一些信息: 当我不使用VAO时,一切正常 无论有无VAO,其他设备和iPad2上的一切都能正常工作 glGetError()未返回错误 由于错误,游戏中出现了一些小故障(一些元素出现了另一个现象) 我的VBO是动态的(我用glBufferData更新它们) 以下是错误: Adreno-ES20(16818)::验证顶点属性状态:在绘图调用中未启用顶点属性 这是我的代码: void Renderer:

当我使用顶点数组对象时,我在使用OpenGLES2的Nexus4上遇到了一个奇怪的错误

以下是一些信息:

  • 当我不使用VAO时,一切正常
  • 无论有无VAO,其他设备和iPad2上的一切都能正常工作
  • glGetError()未返回错误
  • 由于错误,游戏中出现了一些小故障(一些元素出现了另一个现象)
  • 我的VBO是动态的(我用glBufferData更新它们)
以下是错误:

Adreno-ES20(16818)::验证顶点属性状态:在绘图调用中未启用顶点属性

这是我的代码:

void Renderer::setVertexBuffer( Uint32 stream, const Base* vertexBuffer, std::size_t stride, Uint32 startVertex, Uint32 endVertex )
{
    static const bool VAOSupported = this->isExtensionPresent(VertexArrayObject);
    if( VAOSupported )
    {
        if( vertexBuffer->vao.isReady() == false )
        {
            // Bind VAO.
            glBindVertexArrayOES( vertexBuffer->vao.getId() );

            // Bind filled VBO.
            glCheck( glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer->getId() ) );

            // Set attributs with vertex format.
            this->applyVertexFormat( startVertex, endVertex );

            // Unbind buffer and VAO.
            glBindVertexArrayOES(0);

            vertexBuffer->vao.isReady(true);
        }

        glBindVertexArrayOES( vertexBuffer->vao.getId() );
    }
    else
    {
        glBindVertexArrayOES(0);
        glCheck( glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer->getId() ) );
        this->applyVertexFormat( startVertex, endVertex );
    }
}

////////////////////////////////////////////////////////////
void Renderer::setIndexBuffer( const Buffer* indexBuffer, std::size_t stride )
{
    glCheck( glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer->getId() ) );
    this->usedIndexBufferStride = stride;
}

////////////////////////////////////////////////////////////
void Renderer::applyVertexFormat( Uint32 startVertex, Uint32 endVertex )
{
    const Uint32 stride = this->vertexFormat->getStride();
    for( Uint32 i = 0; i < this->vertexFormat->getAttributCount(); i++ )
    {
        const VertexElement& element = this->vertexFormat->getAttribut(i);

        glCheck( glEnableVertexAttribArray( element.usage ) );
        glCheck( glVertexAttribPointer( element.usage,
                                       element.type,
                                       element.type,
                                       element.normalize,
                                       stride,
                                       BUFFER_OFFSET(element.offset + startVertex * stride ) ) );
    }
}

您确定
usage
是定义指针与哪个属性数组关联的字段的合适名称吗?缓冲区对象已具有名为usage的属性(例如,
GL\u DYNAMIC\u DRAW
)<代码>位置可能更有意义

但是,代码中有一个更严重的问题:
element.type
不能同时是数据的类型和组件的数量
glvertexattributepointer(…)
只接受1234组件,像
GL\u FLOAT
这样的枚举器的值4大很多

假设
glCheck(…)
正确包装了
glGetError(…)
,这种情况应该表明
GL\u无效值


这使我相信,
void Renderer::applyVertexFormat(Uint32 startVertex,Uint32 endVertex)
中的循环从未触发。

Oups,这是从代码复制/粘贴期间的一个错误,此错误不存在(使用glvertexattributepointer)。“这让我相信您的循环”->我在代码的这一部分添加了一个printf来测试和编程,这是一个非常奇怪的问题。我将尝试使用eclipse工具调试OpenGL,以查看命令顺序,并查看命令是否正确调用。谢谢
renderer->setFormat(geometry->getFormat()); // Only save a pointer to the format to use in apply method.
renderer->setVertexBuffer(geometry->getVertexBuffer());
renderer->setIndexBuffer(geometry->getIndexBuffer());
renderer->draw(GL_TRIANGLES, geometry->indiceCount);