顶点属性uint被隐式转换为float的原因与解决方法
问题根源
你遇到的隐式转换,核心原因是
未正确配置整数类型的顶点属性
:
OpenGL默认会对顶点缓冲区中的整数数据执行浮点转换,即使着色器中声明了
uint
输入变量——因为你使用的
glVertexAttribFormat
是针对
浮点型顶点属性
的配置函数。当用它处理整数数据时,驱动会先将缓冲区中的
GL_UNSIGNED_INT
值转换为对应float值,再把该float值的二进制位直接作为
uint
类型传递给着色器。这就导致原本的uint值
2
(二进制
0x00000002
)被转换为float值
2.0
(二进制
0x40000000
),最终着色器中读取到的是
0x40000000
。
解决方法
要让OpenGL直接传递整数数据而不做浮点转换,必须使用
整数版本的顶点属性配置函数
:
-
将
glVertexAttribFormat
替换为
glVertexAttribIFormat
:
glVertexAttribIFormat(1, 1, GL_UNSIGNED_INT, 0);
这个函数会明确告知OpenGL,该顶点属性为整数类型,直接将缓冲区中的
GL_UNSIGNED_INT
数据原样传递给着色器的
uint
输入变量,全程无类型转换。
-
确保启用该顶点属性数组(若尚未启用):
glEnableVertexAttribArray(1);
额外修正点
你的
glGetTexImage
调用存在拼写错误:
GL_UNSINGNED_INT
应改为
GL_UNSIGNED_INT
,否则会导致函数调用失败,读取到错误数据。
内容的提问来源于stack exchange,提问作者Nekomiya Kasane