我正在制作一个简单的程序,它从文件(uints和浮点数)加载顶点和三角形。
它们将在OpenGL中使用,我希望它们是16位(以节省内存),但我只知道如何转换为32位。我不想使用汇编,因为我希望它也可以在ARM上运行。
那么,是否可以将字符串转换为16位int / float?
答案 0 :(得分:3)
一个可能的答案是这样的事情:
#include <string>
#include <iostream>
std::string str1 = "345";
std::string str2 = "3.45";
int myInt(std::stoi(str1));
uint16_t myInt16(0);
if (myInt <= static_cast<int>(UINT16_MAX) && myInt >=0) {
myInt16 = static_cast<uint16_t>(myInt);
}
else {
std::cout << "Error : Manage your error the way you want to\n";
}
float myFloat(std::stof(str2));
答案 1 :(得分:0)
对于顶点坐标,您有一个浮点数X,您需要将其转换为OpenGL中的16位替代值之一:GL_SHORT或GL_UNSIGNED_SHORT或GL_HALF_FLOAT。首先,您需要决定是使用整数还是浮点。
如果您使用整数,我建议使用无符号整数,以便零映射到最小值,65536映射到最大值。对于整数,您需要确定X的有效值范围。
假设您知道X在Xmin和Xmax之间。然后,您可以通过以下方式计算GL_UNSIGNED_SHORT兼容表示:
unsigned short convert_to_GL_UNSIGNED_SHORT(float x, float xmin, float xmax) {
if (x<=xmin)
return 0;
else if (x>=xmax)
return 65535;
else
return (unsigned short)((X-Xxmin)/(X-Xmax)*65535 + 0.5)
}
如果你选择半浮动,我建议你看看16-bit floats and GL_HALF_FLOAT
对于面部索引,你有无符号的32位整数,对吗?如果它们都低于65536,您可以通过
轻松将它们转换为16位无符号短路unsigned short i16 = (unsigned short)i32;