为什么我的属性值在 OpenGL 中隐式转换为浮点数?

问题描述 投票:0回答:1

我目前遇到了奇怪的行为。

详情:

在顶点着色器中,我将位置 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;

并查看脸部的位移。

这个演员阵容为何以及何时发生?

c++ opengl glsl
1个回答
0
投票

为什么我的属性值在 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);
© www.soinside.com 2019 - 2024. All rights reserved.