VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501
Posted
技术标签:
【中文标题】VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501【英文标题】: 【发布时间】:2019-09-26 16:09:28 【问题描述】:编写 OpenGL 程序以在屏幕上绘制正方形,但遇到无效值错误。调用MyGLCall(glVertexAttribPointer(i,
时发生错误。 MyGLCall
是 GLCALL
的抽象,我可以将错误代码打印到控制台,如下所示。
不确定此处的值是否无效。我相信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_FLOAT
和 elements_per_vertex
交换导致错误,下面的截图是正确的顺序。
【问题讨论】:
layout.get_stride()
和element.elements_per_vertex
的值是多少?
@Rabbid76 添加了带有类型的屏幕截图
【参考方案1】:
glVertexAttribPointer
的第二个参数是元组大小,必须是 1、2、3、4 或 GL_BGRA
。第三个参数是类型(例如GL_UNSIGNED_BYTE
、GL_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: "当 size 为BGRA
时,表示四个值。每个数组元素内的值按顺序存储在内存中。但是,如果 size为BGRA
,每个数组元素的第一、二、三、四值分别取自内存中的第三、二、一、四值。"
解决了!非常感谢,当我在所有这些元素的集合上构建一个新的 VertexBufferLayoutElement 和 push_back
时,我交换了 type
和 elements_per_vertex
(文档称之为大小)。我想我以后会打电话给elements_per_vertex
类似顶点组件的东西,因为它总是听起来像 RGBA。以上是关于VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501的主要内容,如果未能解决你的问题,请参考以下文章
cesium源码研究之VertexArray(VAO对象)生成的两种方式
cesium源码研究之VertexArray(VAO对象)生成的两种方式