Mapbox
为Global elevation data
提供PNG
图像中编码的高度数据。高度由height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)
解码。详细信息位于https://www.mapbox.com/blog/terrain-rgb/。
我想导入高度数据以生成Unity3D
中的地形。
Texture2D dem = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/dem/12/12_3417_1536.png", typeof(Texture2D));
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
{
Color c = dem.GetPixel(i, j);
float R = c.r*255;
float G = c.g*255;
float B = c.b*255;
array[i, j] = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1f);
}
在这里,我设置了一个断点,第一个像素的rgba
值为RGBA(0.000, 0.592, 0.718, 1.000)
。 c.r
是0
。高度不正确,因为这一点代表山上某处的高度。
然后我在Photoshop
中打开图片并获取第一个像素的RGB
:R=1,G=152,B=179
。
我在C#
编写测试程序。
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap("12_3417_1536.png");
Color a = bitmap.GetPixel(0, 0);
它显示Color a
为(R,G,B,A)=(1,147,249,255)
为什么我用不同的方法得到不同的RGBA
值?哪一个是正确的?
根据下面的评论,不同的读取顺序和统一的压缩数据可能会导致rgba
处像素(0,0)
的值不同。
现在我想关注----如何将rgba(0~1)
转换为RGBA(0~255)
?
r_ps=r_unity*255
?但是,如何在r=0
处的像素PS中以单位和r=1
解释(0,0)
?
答案 0 :(得分:1)
尝试从Unity中的纹理导入设置禁用压缩(无压缩)。或者,如果在运行时获取数据,则可以使用Texture.LoadBytes()
来避免压缩工件。
答案 1 :(得分:0)
我将假设您使用的是相同的图片,并且在单独的文件夹中没有两个12_3417_1536.png
文件。
这些函数中的每一个都具有不同的概念,其中像素位于(0,0)
。不确定你的意思&#34;首先&#34;使用photoshop测试时的像素,但单位的纹理坐标从左下角开始。
当我使用paint测试左下角像素时,我获得了与photoshop相同的值。但是,如果您测试上方左上角,则会得到(1,147,249,255)
,这是bitmap.GetPixel
返回的结果。
你所获得的统一价值观似乎已经过时了。请尝试拨打dem.GetPixel(0,0)
,以便确定您正在分析最简单的案例。