Houdini环境下,PNG图片读取精度解决方法

调试了很长时间,最终发现用FreeImage_GetBits方法读取所有bit,然后用位运算暴力拼接是能够把精度对齐到Houdini HeightField File节点的

void
GL_SOP_heightfieldReader::read_png_file(const char* filename) {
	FreeImage_Initialise();
	FREE_IMAGE_FORMAT format = FreeImage_GetFIFFromFilename(filename);
	FIBITMAP* image = FreeImage_Load(format, filename, PNG_DEFAULT);

	if (!image) {
		std::cerr << "无法加载图像。" << std::endl;
		return;
	}

	int width = FreeImage_GetWidth(image);
	int height = FreeImage_GetHeight(image);

    //Height Field相关
	GEO_PrimVolume* vol = GU_PrimVolume::build(gdp);

	vol->getVoxelWriteHandle()->size(width, height, 1);
	voxel_writehandle = vol->getVoxelWriteHandle().get();

	GA_Attribute* name_attrib = gdp->addStringTuple(GA_ATTRIB_PRIMITIVE, "name", 1);
	GA_RWHandleS(name_attrib).set(0, "height");
    //Height Field相关

	BYTE* bits = FreeImage_GetBits(image);  //在这里把所有的位读取到
	int handle = 0;
	for (int y = 0; y < height; y++) {
		for (int x = 0; x < width; x++) {
			unsigned short _data = bits[handle + 1] << 8 | bits[handle];
			voxel_writehandle->setValue(x, y, 0, _data / 65535.0f);
			handle += 2;  //16 Bit Integer图,handle递增"16Bit/8Bit"
		}
		handle += 2;  //注意!这里是个坑点,可以认为是图片换行标记,一定要跳过。
	}
	FreeImage_Unload(image);
}