news 2026/6/10 18:42:16

【Unity】实现Quad瓦片(MeshRenderer)渲染图集图片

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Unity】实现Quad瓦片(MeshRenderer)渲染图集图片

使用Mesh Renderer渲染图集图片,并保证图片不变形效果(采用GPU Instancing优化合批)

创建一个Quad物体,材质Shader如下,将图集图片通过SpriteAtlas加载出来得到Sprite对象进行后面的传参操作即可进行渲染出图集图片。

Texture2D texture = sprite.texture; m_QuadSpriteRenderer.sharedMaterial = mat; //皮肤共享材质 m_QuadSpriteRenderer.sharedMaterial.SetTexture("_Tex", texture); //非instanced贴图设置 MaterialPropertyBlock mpb = new MaterialPropertyBlock(); //最好静态统一一个对象 m_QuadSpriteRenderer.GetPropertyBlock(mpb); Vector4 rectUV = DataUtility.GetOuterUV(sprite); mpb.SetVector("atlasSpriteRectUV", rectUV); //实例instanced数据设置 m_QuadSpriteRenderer.SetPropertyBlock(mpb); Vector2 size = new Vector2(texture.width, texture.height); float width = rectUV.z - rectUV.x; //width=小图片宽度/大图片宽度 float height = rectUV.w - rectUV.y; //height=小图片高度/大图片高度 float scaleX = size.x * width / 128f; //小图片宽度比例缩小值=大图片宽度*width/128f (128是小图片资源本身的宽度) float scaleY = size.y * height / 128f;//小图片高度比例缩小值=大图片高度*height/128f(128是小图片资源本身的高度) m_QuadSpriteRenderer.transform.localScale = new Vector3(scaleX, scaleY, 1); //为什么是有这个缩小值是因为小图片放到图集里后,小图片的透明部分会裁剪掉,导致小图片实际会缩小, //所以要进行计算出这个缩小值才能还原出正确的图片显示,不然可能小图片会变形。
Shader "Custom/QuadSprite" { Properties { _Tex("Tex", 2D) = "white"{} } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } Pass { Tags { "LightMode" = "ForwardBase" } Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma multi_compile_instancing #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID }; UNITY_INSTANCING_BUFFER_START(Props) //Props是BUFFER块名称访问时使用到 //属性块里的属性全部类似写到这里 UNITY_DEFINE_INSTANCED_PROP(float4, atlasSpriteRectUV) UNITY_INSTANCING_BUFFER_END(Props) sampler2D _Tex; float4 _Tex_ST; inline float2 NormalizeAtlasSpriteUV(float2 uv) { float4 data = UNITY_ACCESS_INSTANCED_PROP(Props, atlasSpriteRectUV); float width = data.z - data.x; float height = data.w - data.y; return float2((uv.x - data.x) / width, (uv.y - data.y) / height); } inline float2 ReverseNormalizeAtlasSpriteUV(float2 uv) { float4 data = UNITY_ACCESS_INSTANCED_PROP(Props, atlasSpriteRectUV); float2 r = uv; r.x = data.x + (data.z - data.x) * r.x; r.y = data.y + (data.w - data.y) * r.y; return r; } v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v, o); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _Tex); return o; } fixed4 frag (v2f i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); i.uv.xy = ReverseNormalizeAtlasSpriteUV(i.uv.xy); fixed4 col = tex2D(_Tex, i.uv); i.uv.xy = NormalizeAtlasSpriteUV(i.uv.xy); return col; } ENDCG } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:10:14

C++内存序

在 C 中&#xff0c;内存序&#xff08;Memory Order&#xff09;是多线程编程中原子操作的重要概念&#xff0c;它用于控制原子操作的内存同步行为。C11 引入了 <atomic> 头文件&#xff0c;提供了内存序来控制多线程环境下的内存访问顺序。内存序的作用内存序主要解决两…

作者头像 李华
网站建设 2026/6/10 12:57:00

深度测评2026最新!9款AI论文软件评测:本科生毕业论文全场景推荐

深度测评2026最新&#xff01;9款AI论文软件评测&#xff1a;本科生毕业论文全场景推荐 2026年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文辅助工具在学术领域的应用日益广泛。对于本科生而言&#xff0c;撰写毕业论文不…

作者头像 李华
网站建设 2026/6/10 13:00:00

新手进阶Python:给办公助手加定时功能,自动处理任务不用盯

大家好&#xff01;我是CSDN的Python新手博主&#xff5e; 上一篇我们整合了Excel、Word、PDF、OCR的全能办公助手&#xff0c;很多小伙伴反馈“如果能定时自动运行就好了&#xff0c;比如每天早上8点自动处理Excel数据、生成报表并发送给领导&#xff0c;不用我手动点”。今天…

作者头像 李华
网站建设 2026/6/10 15:22:43

linux redis简单操作

linux redis简单操作 1、centOS 系统安装redis https://blog.csdn.net/weixin_42835409/article/details/119562074 2、安装完成后终端输入redis-cli 报 redis-cli -bash: redis-cli: command not found 问题解决 进入到redis文件下src/bin目录下 将redis-cli 复制到 /usr/loc…

作者头像 李华
网站建设 2026/5/27 9:24:37

为什么“缓存“能提高系统性能?——从 CPU 缓存到分布式缓存

&#x1f4a8; 为什么"缓存"能提高系统性能&#xff1f;——从 CPU 缓存到分布式缓存 ⚡大家好&#xff0c;我是无限大&#xff0c;欢迎收看十万个为什么系列文章 希望今天的内容能对大家有所帮助想象一下&#xff1a;你去图书馆借一本书&#xff0c;每次都要从书架上…

作者头像 李华