- ☀️博客主页:CSDN博客主页
- 💨本文由 萌萌的小木屋 原创,首发于 CSDN💢
- 🔥学习专栏推荐:面试汇总
- ❗️游戏框架专栏推荐:游戏实用框架专栏
- ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正
📆 未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
Unity 小科普
老规矩,先介绍一下Unity的科普小知识:
- Unity 是行业领先的实时3D开发平台。
- 包括游戏开发,电影,AR/VR,虚拟现实在内的所有创作者,可以将梦想照进现实。
- Unity提供了一套完整完善的软件解决方案,可用于创作,运营和模拟任何2D和3D的内容,进本全平台支持。
- 实际上Unity就是一个游戏引擎,大名鼎鼎的原神就是用它制作的。
Unity100个实用小技巧
需求:图片分辨率动态扩展的时候,如何保持扩展了分辨率,又不丢失原本的图片。
两种方案
第第一种:GL实现
public Texture2D ReSetTextureSize(Texture2D tex, int width, int height)
{
var rendTex = new RenderTexture(width, height, 48, RenderTextureFormat.Default);
rendTex.Create();
Graphics.SetRenderTarget(rendTex);
GL.PushMatrix();
GL.Clear(true, true, Color.clear);
GL.PopMatrix();
var mat = new Material(Shader.Find("Unlit/Transparent"));
mat.mainTexture = tex;
Graphics.SetRenderTarget(rendTex);
GL.PushMatrix();
GL.LoadOrtho();
mat.SetPass(0);
GL.Begin(GL.QUADS);
GL.TexCoord2(0, 0);
GL.Vertex3(0, 0, 0);
GL.TexCoord2(0, 1);
GL.Vertex3(0, 1, 0);
GL.TexCoord2(1, 1);
GL.Vertex3(1, 1, 0);
GL.TexCoord2(1, 0);
GL.Vertex3(1, 0, 0);
GL.End();
GL.PopMatrix();
var finalTex = new Texture2D(rendTex.width, rendTex.height, TextureFormat.RGBA64, false);
RenderTexture.active = rendTex;
finalTex.ReadPixels(new Rect(0, 0, finalTex.width, finalTex.height), 0, 0);
finalTex.Apply();
return finalTex;
}
第二种:RenderTexture实现
private Texture2D ResizeTexture(Texture2D source, int width, int height)
{
if (source != null)
{
// 创建临时的RenderTexture
RenderTexture renderTex = RenderTexture.GetTemporary(width, height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear,1);
// 复制source的纹理到RenderTexture里
Graphics.Blit(source, renderTex);
// 开启当前RenderTexture激活状态
RenderTexture previous = RenderTexture.active;
RenderTexture.active = renderTex;
// 创建修改后的纹理,保持与源纹理相同压缩格式
Texture2D resizedTexture = new Texture2D(width, height, source.format, false);
// 读取像素到创建的纹理中
resizedTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
// 应用修改到GPU上
resizedTexture.Apply();
// 停止当前RenderTexture工作
RenderTexture.active = previous;
// 释放内存
RenderTexture.ReleaseTemporary(renderTex);
GameObject.Destroy(source);
return resizedTexture;
}
else
{
return null;
}
}