Unity:从地形创建纹理
Unity: Create a texture from Terrain
我有一个程序生成的 Terrain
,基于 Unity's Terrain System
。
现在我想要 Terrain
中的 Map
,不是小地图而是完整地图,保存为 2D Texture
。
首先我想到了一个RenderTexture
,但是如果我拿一个Camera
来捕捉整个Terrain
,结果取决于分辨率方面,我也有问题原因Terrain
的 width
是 3.2x
length
.
有没有更好的办法解决这个问题?
此问题有四种解决方案(按优先顺序排列):
显示缩放到屏幕垂直分辨率的图像,并创建水平滚动机制。对于屏幕外的目标,这可能需要额外的指示器。
以完整或均匀缩小的分辨率显示地图,并使用完整的 X、Y 滚动。
缩小图像以适合屏幕宽度。这将在屏幕的顶部和底部创建 "Letterbox" 边框。
将整个图像缩放到屏幕分辨率。导致严重失真。
宽高比问题没有"magic bullet"解决方案。
制作一个新相机并将其放置在地形上。
确保它处于正字模式
将 camera.aspect
字段设置为 terrainData.size.x / terrainData.size.z
将 camera.orthographicSize
字段设置为 terrainData.size.z/2f
确保相机框架与地形轴对齐。类似于 cam.transform.LookAt(terrain.GetPosition(), terrain.transform.forward);
的东西可以解决问题。
然后,您应该能够创建具有您想要的像素分辨率的 RenderTexture
(基于 Rafal Wiliński 的 this answer):
int resHeight = 1000;
int resWidth = Mathf.RoundToInt(resHeight * camera.aspect);
RenderTexture rt = new RenderTexture(resWidth, resHeight, 24);
camera.targetTexture = rt; //Create new renderTexture and assign to camera
Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false); //Create new texture
camera.Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0); //Apply pixels from camera onto Texture2D
camera.targetTexture = null;
RenderTexture.active = null; //Clean
Destroy(rt); //Free memory
那么,您的地形将在 screenshot
中被捕获
我有一个程序生成的 Terrain
,基于 Unity's Terrain System
。
现在我想要 Terrain
中的 Map
,不是小地图而是完整地图,保存为 2D Texture
。
首先我想到了一个RenderTexture
,但是如果我拿一个Camera
来捕捉整个Terrain
,结果取决于分辨率方面,我也有问题原因Terrain
的 width
是 3.2x
length
.
有没有更好的办法解决这个问题?
此问题有四种解决方案(按优先顺序排列):
显示缩放到屏幕垂直分辨率的图像,并创建水平滚动机制。对于屏幕外的目标,这可能需要额外的指示器。
以完整或均匀缩小的分辨率显示地图,并使用完整的 X、Y 滚动。
缩小图像以适合屏幕宽度。这将在屏幕的顶部和底部创建 "Letterbox" 边框。
将整个图像缩放到屏幕分辨率。导致严重失真。
宽高比问题没有"magic bullet"解决方案。
制作一个新相机并将其放置在地形上。
确保它处于正字模式
将
camera.aspect
字段设置为terrainData.size.x / terrainData.size.z
将
camera.orthographicSize
字段设置为terrainData.size.z/2f
确保相机框架与地形轴对齐。类似于
cam.transform.LookAt(terrain.GetPosition(), terrain.transform.forward);
的东西可以解决问题。
然后,您应该能够创建具有您想要的像素分辨率的 RenderTexture
(基于 Rafal Wiliński 的 this answer):
int resHeight = 1000;
int resWidth = Mathf.RoundToInt(resHeight * camera.aspect);
RenderTexture rt = new RenderTexture(resWidth, resHeight, 24);
camera.targetTexture = rt; //Create new renderTexture and assign to camera
Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false); //Create new texture
camera.Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0); //Apply pixels from camera onto Texture2D
camera.targetTexture = null;
RenderTexture.active = null; //Clean
Destroy(rt); //Free memory
那么,您的地形将在 screenshot