首页 > 解决方案 > 如何将 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;

标签: copengl

解决方案


“......将textureImage中的一个字节转换为一个浮点数?”

先说一句:

根据OpenGL规范

...GL 类型不是C类型。因此,例如, 在本文档之外GLtype int被称为GLint,并且不一定等同于Ctype int。实现必须准确使用表中指示的位数来表示 GL 类型。

因此,尽管我们不知道确切的C类型GLint是什么,但我们确实知道它是 32 位宽(4 个字节),而不是 8 位(1 个字节),就像byte(native type unsigned char)那样

提出问题如何将 textureImage 中的字节转换为浮点数?似乎对你真正在做什么感到怀疑,因为类型GLint不是==. byte这经不起

因为 OpenGL 是一个植根于 C 的库,所以类型转换与其他任何类型的转换一样,使用类型转换时要小心:

在这种情况下,标准中为两者指定的宽度GLint都是GLfloat32 位宽,但单独的宽度并不能消除风险,正如@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 GLfloatC与下面的纯示例相同:

float someFloatVal = (float)someIntegerArray[a][b][c];

推荐阅读