我现在遇到了一个奇怪的行为。
详细信息:
在顶点着色器中,我将位置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面孔.
为什么以及何时发生了这种情况?
1条答案
按热度按时间vcirk6k61#
为什么我的属性值在OpenGL中隐式转换为浮点数?
因为这就是它是如何指定的。
glVertexAttribFormat
指定如何将缓冲区中的数据解释为浮点数,但glVertexAttribIFormat
指定如何将数据解释为整数。此函数指定着色器程序的数据必须如何转换。由于顶点着色器输入的类型无法猜测,不同的类型有不同的函数。type 参数只指定源数据的类型,而不是目标数据的类型。所以如果属性的类型是uint
,则必须使用glVertexAttribIFormat
。glVertexAttribFormat(1, 1, GL_UNSIGNED_INT, GL_FALSE, 0);
个字符串