VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501

Posted

技术标签:

【中文标题】VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501【英文标题】: 【发布时间】:2019-09-26 16:09:28 【问题描述】:

编写 OpenGL 程序以在屏幕上绘制正方形,但遇到无效值错误。调用MyGLCall(glVertexAttribPointer(i, 时发生错误。 MyGLCallGLCALL 的抽象,我可以将错误代码打印到控制台,如下所示。

不确定此处的值是否无效。我相信glVertexAttribPointer 的所有数据类型都是正确的,但这里缺少一些东西。

控制台输出

Rendering...
OpenGL version 3.3.0 NVIDIA 388.13
GL Extension Wrangler version 2.1.0
[!!! OpenGL ERROR!!!] (0x0501)
glVertexAttribPointer(i, element.elements_per_vertex, element.type, element.normalized, layout.get_stride(), (const void*) offset)

布局和元素数据类型

源代码

// bind vertex buffer and set memory layout
void VertexArray::add_buffer(const VertexBuffer& vb, const VertexBufferLayout& layout) 

    VertexArray::bind();
    vb.bind();
    // auto is std::vector<VertexBufferLayoutElement>
    const auto& elements = layout.get_elements();
    unsigned int offset = 0;
    for (unsigned int i = 0; i < elements.size(); i++) 
           
        const auto& element = elements[i];      
        // GL_INVALID_VALUE 0x0501
        MyGLCall(glEnableVertexAttribArray(i));
        MyGLCall(glVertexAttribPointer(i,
            element.elements_per_vertex,
            element.type,
            element.normalized,
            layout.get_stride(),
            (const void*) offset)); // heckin, what is this (const void*)???
        offset += element.elements_per_vertex * VertexBufferLayoutElement::get_size_of_type(element.type);
       

我的 VertextBufferLayout 头文件中的 VertexBufferLayoutElement 结构

struct VertexBufferLayoutElement

    // nice mem alignment bro, mem size on most machines is
    unsigned int elements_per_vertex;   // 4 bytes
    unsigned int type;                  // 4 bytes
    unsigned char normalized;           // 1 byte
    static unsigned int get_size_of_type(unsigned int type)
    
        switch (type)
        
            case GL_FLOAT:          return 4;
            case GL_UNSIGNED_INT:   return 4;
            case GL_UNSIGNED_BYTE:  return 1;
        
        ASSERT(false);
        return 0;
    
;

错误出现在上面的这个头文件中

未遵循first c spec parameter list for the arrtrib pointer function 的正确参数顺序。 GL_FLOATelements_per_vertex 交换导致错误,下面的截图是正确的顺序。

【问题讨论】:

layout.get_stride()element.elements_per_vertex的值是多少? @Rabbid76 添加了带有类型的屏幕截图 【参考方案1】:

glVertexAttribPointer 的第二个参数是元组大小,必须是 1、2、3、4 或 GL_BGRA。第三个参数是类型(例如GL_UNSIGNED_BYTEGL_FLOAT)。

您将element.elements_per_vertex 传递给第二个参数,将element.type 传递给第三个参数,这似乎是正确的。但是参数的值是交换的:

elements_per_vertex : 5126
type                : 3   

注意,5126 是 0x1406,这是枚举常量GL_FLOAT 的值。

设置

elements_per_vertex = 3
type = GL_FLOAT

解决问题。

【讨论】:

Funky: "当 sizeBGRA 时,表示四个值。每个数组元素内的值按顺序存储在内存中。但是,如果 sizeBGRA,每个数组元素的第一、二、三、四值分别取自内存中的第三、二、一、四值。" 解决了!非常感谢,当我在所有这些元素的集合上构建一个新的 VertexBufferLayoutElement 和 push_back 时,我交换了 typeelements_per_vertex(文档称之为大小)。我想我以后会打电话给elements_per_vertex 类似顶点组件的东西,因为它总是听起来像 RGBA。

以上是关于VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501的主要内容,如果未能解决你的问题,请参考以下文章

cesium源码研究之VertexArray(VAO对象)生成的两种方式

cesium源码研究之VertexArray(VAO对象)生成的两种方式

VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501

类的顶点数组问题

编辑文章 - 博客频道 - CSDN.NET

编辑文章 - 博客频道 - CSDN.NET