You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中属性值为何被隐式转换为float类型?

顶点属性uint被隐式转换为float的原因与解决方法

问题根源

你遇到的隐式转换,核心原因是未正确配置整数类型的顶点属性
OpenGL默认会对顶点缓冲区中的整数数据执行浮点转换,即使着色器中声明了uint输入变量——因为你使用的glVertexAttribFormat是针对浮点型顶点属性的配置函数。当用它处理整数数据时,驱动会先将缓冲区中的GL_UNSIGNED_INT值转换为对应float值,再把该float值的二进制位直接作为uint类型传递给着色器。这就导致原本的uint值2(二进制0x00000002)被转换为float值2.0(二进制0x40000000),最终着色器中读取到的是0x40000000

解决方法

要让OpenGL直接传递整数数据而不做浮点转换,必须使用整数版本的顶点属性配置函数

  1. glVertexAttribFormat替换为glVertexAttribIFormat
glVertexAttribIFormat(1, 1, GL_UNSIGNED_INT, 0);

这个函数会明确告知OpenGL,该顶点属性为整数类型,直接将缓冲区中的GL_UNSIGNED_INT数据原样传递给着色器的uint输入变量,全程无类型转换。

  1. 确保启用该顶点属性数组(若尚未启用):
glEnableVertexAttribArray(1);

额外修正点

你的glGetTexImage调用存在拼写错误:GL_UNSINGNED_INT应改为GL_UNSIGNED_INT,否则会导致函数调用失败,读取到错误数据。

内容的提问来源于stack exchange,提问作者Nekomiya Kasane

火山引擎 最新活动