Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带ebo的openglvao_C++_Opengl_Vbo_Vao - Fatal编程技术网

C++ 带ebo的openglvao

C++ 带ebo的openglvao,c++,opengl,vbo,vao,C++,Opengl,Vbo,Vao,我目前正在空闲时间学习OpenGL,最近我遇到了一个我不理解的“错误” 问题是,我没有任何错误,只是屏幕上没有显示任何内容。我正在使用OpenGL和SFML 这是我的密码。以下是我的方法: void CreateObjet(GLuint& vao, GLuint& vbo, GLuint& ebo, GLuint& textureLocation) //I create my arrays here.. Don't worry they are fine. C

我目前正在空闲时间学习OpenGL,最近我遇到了一个我不理解的“错误”

问题是,我没有任何错误,只是屏幕上没有显示任何内容。我正在使用OpenGL和SFML

这是我的密码。以下是我的方法:

void CreateObjet(GLuint& vao, GLuint& vbo, GLuint& ebo, GLuint& textureLocation)

//I create my arrays here.. Don't worry they are fine.

CreateTexture(textureLocation);

glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);

glGenVertexArrays (1, &vao);
glBindVertexArray (vao); //On travaille dans le VAO

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

        glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
        glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
        glEnableVertexAttribArray(0);

        glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
        glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3* sizeof(GLfloat)));
        glEnableVertexAttribArray(1);

        glBufferData (GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
        glVertexAttribPointer (2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6* sizeof(GLfloat)));
        glEnableVertexAttribArray(2);

        //EBO
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indiceFinal), indiceFinal, GL_STATIC_DRAW); 

glBindVertexArray(0);
我知道我的问题不在于着色器,因为我使用GlshaderRiv()在控制台中没有收到任何错误

我想知道我的订单做得是否正确

  • 我创建了一个VBO和一个EBO
  • 我创建了一个VAO
  • 我绑定当前VAO以修改它
  • 我将当前VBO绑定到VAO中
  • 我在VBO中绑定我的第一个数组(顶点位置向量3f),并将它们以正确的偏移量和步幅放置在第一个指针中
  • 我将第二个数组(颜色位置向量3f)绑定到VBO中,并将它们以正确的偏移量和步幅放在第一个指针中
  • 我在VBO中绑定我的第三个数组(纹理位置向量2f),并将它们以正确的偏移量和步幅放在第一个指针中
  • 我在VAO中绑定了一个EBO
  • 我用元素位置(向量3u)绑定EBO
  • 我将VAO从内存中解除绑定,因为我的绘图循环在代码中的时间比较晚,因此,我不想白白使用内存空间。别担心,在我画画之前,我把glBindVertexArray(&vao)
    这看起来绝对不对。您正在将所有属性的值写入同一缓冲区,每个属性都会覆盖上一个:

    glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
    glEnableVertexAttribArray(0);
    
    glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    ...
    
    当您进行第二次
    glBufferData()
    调用时,它将用
    颜色
    数据覆盖先前存储在缓冲区中的
    数据

    误解可能是关于
    glvertexattributepointer()
    的作用。它指定给定属性来自哪个缓冲区,以及数据布局(组件计数、类型等)。但它不会创建缓冲区数据的副本或类似的内容。绘制调用时,要使用的属性数据仍必须存储在缓冲区中

    要解决此问题,您必须为每个属性使用不同的缓冲区,或者排列属性数据,以便所有3个属性的值都可以存储在同一缓冲区中。
    glVertexAttribPointer()
    调用的参数实际上表明,您打算将所有交织的属性值存储在同一缓冲区中。要使其正常工作,您必须相应地排列属性值,然后通过一个
    glBufferData()
    调用将它们存储在缓冲区中

    为此需要的内存安排将依次包含第一个顶点的所有属性值,然后是第二个顶点的值等。使用
    pi
    顶点的位置
    i
    ci
    颜色和
    ti
    纹理坐标,正确的内存布局为:

    p0x p0y p0z c0r c0g c0b t0s t0t
    p1x p1y p1z c1r c1g c1b t1s t1t
    p2x p2y p2z c2r c2g c2b t2s t2t
    ...
    

    glBindVertexArray(&vao)
    肯定是错误的,因为这是变量的地址,而不是对象的名称。还有,为什么你认为不绑定VAO可以节省内存?你说的我都做了。我创建了两个新的缓冲区,生成了它们,然后正确地完成了我的订单。遗憾的是,我仍然没有在屏幕上显示任何内容:(