【问题标题】:openGL on raspberry pi, indexed vertices树莓派上的openGL,索引顶点
【发布时间】:2016-06-08 22:19:56
【问题描述】:

我正在尝试在树莓派上学习一些基本的 opengl。 我遵循这些教程 https://solarianprogrammer.com/2013/05/13/opengl-101-drawing-primitives/ http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/

我遇到了一个我无法解决的问题。 我通过列出数组中的顶点成功地绘制了一个三角形,然后我尝试做同样的事情,但是使用索引,它不起作用,我不知道为什么。它编译成功并运行,但不显示三角形。

两个教程都让它变得如此简单,添加一个缓冲区并将“glDrawArrays”替换为“glDrawElements”。但我一定错过了什么..

#include <stdio.h>
#include <unistd.h>
#include "../common/startScreen.h"
#include "../common/LoadShaders.h"

// Include GLM
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

using namespace glm;

int main(int argc, const char **argv)
{
    float r=0.0;
    InitGraphics();
    printf("Screen started\n");
    // Create and compile our GLSL program from the shaders
    GLuint programID = LoadShaders( "simpletransformvertshader.glsl", "simplefragshader.glsl" );
    printf("Shaders loaded\n");

// Get a handle for our "MVP" uniform
    GLuint MatrixID = glGetUniformLocation(programID, "MVP");

    // Get a handle for our buffers
    GLuint vertexPosition_modelspaceID = glGetAttribLocation(programID, "vertexPosition_modelspace");

    // Projection matrix 
    glm::mat4 Projection = glm::perspective(45.0f, 16.0f / 9.0f, 0.1f, 100.0f);



    // Camera matrix
    glm::mat4 View       = glm::lookAt(
                                        glm::vec3(0,0,5),
                                        glm::vec3(0,0,0),
                                        glm::vec3(0,1,0),
                                               );

    //glm::mat4 myMatrix = glm::translate(10.0f, 0.0f, 0.0f);

   // Model matrix : an identity matrix (model will be at the origin)
    glm::mat4 Model      = glm::mat4(1.0f);
    // Our ModelViewProjection : multiplication of our 3 matrices
    glm::mat4 MVP        = Projection * View * Model; // Remember, matrix$

    //glm:mat4 MVP = Prpkection * View * Model;

GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
     1.0f, -1.0f, 0.0f,
     1.0f,  1.0f, 0.0f,
//      -1.0,   1.0f, 0.0f,
    };



GLuint indices[3] = {
    0,1,2,
//      2,3,0
    };



   // Set the viewport

    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_bu$


    GLuint eab;
    glGenBuffers(1, &eab);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eab);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STAT$



    do{
   // Model = glm::rotate(Model, r, glm::vec3(0.0f, 0.0f, 1.0f));

           glClear( GL_COLOR_BUFFER_BIT );

            // Use our shader
            glUseProgram(programID);

            // Send our transformation to the currently bound shader,
            // in the "MVP" uniform
            glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

            // 1rst attribute buffer : vertices
            glEnableVertexAttribArray(vertexPosition_modelspaceID);
            glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);


            glVertexAttribPointer(
                    vertexPosition_modelspaceID, 

                    3,                  // size
                    GL_FLOAT,           // type
                    GL_FALSE,           // normalized?
                    0,                  // stride
                    (void*)0            // array buffer offset
            );

// see above glEnableVertexAttribArray(vertexPosition_modelspaceID);

            // Draw the triangle !
     //      glDrawArrays(GL_TRIANGLES, 0, 3); 
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eab);
            glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);




            glDisableVertexAttribArray(vertexPosition_modelspaceID);

    updateScreen();
    }
    while(1);

    // Cleanup VBO
    glDeleteBuffers(1, &vertexbuffer);
    glDeleteBuffers(1, &eab);
    glDeleteProgram(programID);


}

【问题讨论】:

    标签: c++ linux opengl-es arm


    【解决方案1】:

    GLES 1.x/2.x 默认不支持 32 位索引。您最多可以使用 16 位索引,因此您应该将代码更改为:

    GLushort indices[3] = {...}
    [...]
    glDrawElements(..., 3, GL_UNSIGNED_SHORT, ...);
    

    请注意,在不支持GL_OES_element_index_uint 的实现中尝试使用GL_UNSIGNED_INT 作为类型参数只会导致GL_INVALID_ENUM 错误。您至少应该为调试添加一些错误检查。

    【讨论】:

    • 谢谢!它解决了这个问题!我使用的是教程中示例附带的 Makefile。我以为会没事的。看来我必须查看编译设置
    • 我建议看看使用 GLEW 检查运行时可用的功能/扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2012-12-04
    • 2014-01-18
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多