菜鸟教程小白 发表于 2022-12-12 15:59:33

ios - 顶点数组对象在 OpenGL 4.1 中没有正确绑定(bind)


                                            <p><p>我正在将一些绘图代码从 OpenGLES 2.0 移植到 OpenGL 4.0,并且在绑定(bind)我的顶点数组对象时遇到了问题。当我运行 glValidateProgram 时出现此错误:<code>Validation Failed: No vertex array object bound</code></p>

<p>这是我用于绘图的代码:</p>

<pre><code>void RendererRender(RendererRef* renderer) {

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glUseProgram(program);

    glViewport(0, 0, renderer-&gt;viewportWidth, renderer-&gt;viewportHeight);
    glClearColor(0.2, 0.3, 0.4, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(M_PI/4.0, 1.0f, 0.1f, 10000.0f);

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeLookAt(0,0,-10,
                                          0,0,0,
                                          0,1,0);

    glUniformMatrix4fv(modelViewMatrixUniformLocation, 1, GL_FALSE, modelViewMatrix.m);
    glUniformMatrix4fv(projectionMatrixUniformLocation, 1, GL_FALSE, projectionMatrix.m);

    glGetError();

    glBindVertexArray(triangleVAOId);
    if(!validateProgram(program)){
      NSLog(@&#34;Error validating program&#34;);
      glGetError();
    }

    glPointSize(10.0f);
    glDrawElements(GL_POINTS, 3, GL_UNSIGNED_SHORT, NULL);

}
</code></pre>

<p>因此,似乎此时 VAO 肯定应该被绑定(bind)。 VAO 是使用以下代码生成的:</p>

<pre><code>typedef struct {
    GLfloat position;
} Vertex;


GLuint buildVAO(int vertexCount, Vertex* vertexData, GLushort* indexData, BOOL hasTexture)
{

    GLuint vaoId;
    GLuint indexId;

    //generate the VAO &amp; bind
    glGenVertexArrays(1, &amp;vaoId);
    glBindVertexArray(vaoId);

    GLuint positionBufferId;

    //generate the VBO &amp; bind
    glGenBuffers(1, &amp;positionBufferId);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferId);

    //populate the buffer data
    glBufferData(GL_ARRAY_BUFFER,
               vertexCount*sizeof(Vertex),
               vertexData,
               GL_DYNAMIC_DRAW);

    //setup the attribute pointer to reference the vertex position attribute
    glEnableVertexAttribArray(kVertexPositionAttributeLocation);
    glVertexAttribPointer(kVertexPositionAttributeLocation,
                        kVertexSize,
                        kPositionVertexTypeEnum,
                        GL_FALSE,
                        sizeof(Vertex),
                        (void*)offsetof(Vertex, position));

    }

    //create &amp; bind index information
    glGenBuffers(1, &amp;indexId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexCount*sizeof(GLushort), indexData, GL_DYNAMIC_DRAW);

    //restore default state
    glBindVertexArray(0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    return vaoId;
}
</code></pre>

<p>我注意到的另一件事是我从 <code>glGenVertexArrays</code> 得到的 VAO id 是一个很大的值,例如 1606408096,在我工作的示例中,它总是类似于 1 或 2 .</p>

<p>这一切都发生在主线程上。</p>

<p>知道可能出了什么问题吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>想通了——原来是因为我使用了错误版本的 <code>glGenVertexArray</code>。</p>

<p>我之前有过这样的声明:</p>

<pre><code>#define glGenVertexArrays glGenVertexArraysAPPLE
</code></pre>

<p>事实证明,这仅在 3.0 之前的 OpenGL 版本上是必需的。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 顶点数组对象在 OpenGL 4.1 中没有正确绑定(bind),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32067530/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32067530/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 顶点数组对象在 OpenGL 4.1 中没有正确绑定(bind)