c - 如何将 textureImage 中的字节转换为浮点数?
问题描述
我必须将TextureImage[][][]
它输入的GLubyte
(每个元素代表纹理图像中不同颜色的像素)转换为GLfloat
代表颜色的变量。我必须在没有任何openGL命令的情况下完成它。这是我的代码:
GLubyte TextureImage[TEXTURE_SIZE][TEXTURE_SIZE][3];
GLfloat pixColor1 , pixColor2 , pixColor3;
pixColor1 = (GLfloat)(GLint)TextureImage[t][s][0];
pixColor2 = (GLfloat)(GLint)TextureImage[t][s][1];
pixColor3 = (GLfloat)(GLint)TextureImage[t][s][2];
pixColor1 /= 255.0;
pixColor2 /= 255.0;
pixColor3 /= 255.0;
解决方案
“......将textureImage中的一个字节转换为一个浮点数?”
先说一句:
根据OpenGL规范:
...
GL
类型不是C
类型。因此,例如, 在本文档之外GLtype int
被称为GLint
,并且不一定等同于C
typeint
。实现必须准确使用表中指示的位数来表示 GL 类型。
因此,尽管我们不知道确切的C
类型GLint
是什么,但我们确实知道它是 32 位宽(4 个字节),而不是 8 位(1 个字节),就像byte
(native type unsigned char
)那样
提出问题如何将 textureImage 中的字节转换为浮点数?似乎对你真正在做什么感到怀疑,因为类型GLint
不是==
. byte
这经不起
因为 OpenGL 是一个植根于 C 的库,所以类型转换与其他任何类型的转换一样,使用类型转换时要小心:
在这种情况下,标准中为两者指定的宽度GLint
都是GLfloat
32 位宽,但单独的宽度并不能消除风险,正如@Margaret Bloom 在评论中提到的那样:
请注意,整数不能安全地转换为浮点数。浮点数的一种有效实现(实际上是几乎所有架构上使用的一种)是通过 IEEE754 binary32 格式。这只有 23 位尾数。像 0xFFFFFFFF 这样的数字不能完全转换为浮点数。
话虽如此,类型转换在语法上与任何其他类型转换在语法上相同C
该声明 :
pixColor1 = (GLfloat)(GLint)TextureImage[t][s][0];
// ^^^^^^^ this part is not necessary but does not change the assigned value
pixColor1 = (GLfloat)TextureImage[t][s][0];//modified to eliminate (GLint)
有效地将包含的值转换TextureImage[t][s][0]
为 a GLfloat
。C
与下面的纯示例相同:
float someFloatVal = (float)someIntegerArray[a][b][c];
推荐阅读
- r - 在 mutate 语句中动态引用列名 - dplyr
- macos - 如何使用 ffmpeg 从 docker 容器访问内置网络摄像头?
- redis - Redis Pub/Sub 和 Redis Streams 有多相似?
- python - 如何检查熊猫系列中是否存在一组值(包括 nans)?
- c++ - 为什么我需要在成员初始化器列表中重复我的基类的模板参数?
- html - 在 Wordpress 标题菜单上添加图标
- javascript - 反应 - 下拉值不动态更新
- vue.js - 在 VueJs 中使用全路径绑定动态图像源
- flutter - 如何增加芯片尺寸?
- mysql - 使用 sql 函数在给定正确名称的情况下查找表中可能不包含字符“a”或“A”的名称计数