我目前遇到了奇怪的行为。
详情:
在顶点着色器中,我将位置 1 处的属性声明为
uint
:
layout (location = 1) in uint VS_In_ID
我将其声明为 C 中的
GL_UNSIGNED_INT
,步长 1:
glVertexAttribFormat(1, 1, GL_UNSIGNED_INT, GL_FALSE, 0);
我正确上传了一堆 unsigned int 数据(我通过调用
glGetBufferSubData
确保了这一点):
glBindBuffer(GL_ARRAY_BUFFER, data.idsVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLuint) * data.numPoints, data.ids, GL_STATIC_DRAW);
glBindVertexBuffer(1, data.idsVBO, 0, sizeof(GLuint));
该属性渲染到由
配置的纹理(绑定在
GL_COLOR_ATTACHMENT_1
)
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, config.bufferWidth, config.bufferHeight, 0,
GL_RED_INTEGER, GL_UNSIGNED_INT, NULL);
数据由
获取glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSINGNED_INT, data);
但最后,我发现我上传的值(全部指定为“2”)被隐式转换为浮点数,例如,当我获取应该为2的值时,我得到了0x40000000,这是一个浮点数2!
这个结论不是在获取后得出的,而是在着色器中使用类似的东西得出的
if (VS_In_ID == 0x40000000)
gl_Position.x = gl_Position.x + 1.0f;
并查看脸部的位移。
这个演员阵容为何以及何时发生?
为什么我的属性值在 OpenGL 中隐式转换为浮点数?
glVertexAttribFormat
生成浮点数数组,而 glVertexAttribIFormat
生成整数数组。 type参数仅指定源数据的类型,但不指定创建的数组的类型。因此,如果属性 id 的类型为 uint
,则必须使用 glVertexAttribIFormat
。
glVertexAttribFormat(1, 1, GL_UNSIGNED_INT, GL_FALSE, 0);
glVertexAttribIFormat(1, 1, GL_UNSIGNED_INT, GL_FALSE, 0);