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

q5iwbnjs  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(183)

我现在遇到了一个奇怪的行为。
详细信息:
在顶点着色器中,我将位置1处的属性声明为uint

layout (location = 1) in uint VS_In_ID

字符串
我在C中声明为GL_UNSIGNED_INT,stride 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的值时,我得到了0x 40000000,这是一个浮点数2!
这个结论不是在获取后得出的,而是在着色器中使用以下内容得出的,

if (VS_In_ID == 0x40000000) 
    gl_Position.x = gl_Position.x + 1.0f;


and to see the displacement位移of the faces面孔.
为什么以及何时发生了这种情况?

vcirk6k6

vcirk6k61#

为什么我的属性值在OpenGL中隐式转换为浮点数?
因为这就是它是如何指定的。glVertexAttribFormat指定如何将缓冲区中的数据解释为浮点数,但glVertexAttribIFormat指定如何将数据解释为整数。此函数指定着色器程序的数据必须如何转换。由于顶点着色器输入的类型无法猜测,不同的类型有不同的函数。type 参数只指定源数据的类型,而不是目标数据的类型。所以如果属性的类型是uint,则必须使用glVertexAttribIFormat
glVertexAttribFormat(1, 1, GL_UNSIGNED_INT, GL_FALSE, 0);

glVertexAttribIFormat(1, 1, GL_UNSIGNED_INT, 0);

字符串

相关问题