当前位置: 首页 > news >正文

【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 } } }
http://www.jsqmd.com/news/212108/

相关文章:

  • 【课程设计/毕业设计】基于python-CNN深度学习的水果识别
  • MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序
  • Thinkphp和Laravel框架的茶叶购物网上商城系统 潇湘知茶小程序_dyo5sig5
  • 【状态估计】基于LQR控制和卡尔曼滤波算法实现二维四旋翼的状态估计(噪声传感器数据)附Matlab代码
  • 【毕业设计】基于深度学习python-CNN的水果识别
  • 2026免费好用的AIPPT工具榜:智能演示文稿制作新纪元
  • Thinkphp和Laravel框架的蛋糕甜品烘焙教程微信小程序设计与实现_6uy1k94r
  • Java进阶07 嵌套类
  • 计算机深度学习毕设实战-卷神经网络基于深度学习的土豆疾病识别
  • 【毕业设计】机器学习 基于python-cnn深度学习的罗马数据集训练识别
  • Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
  • 从执行到管理:SOP思维,是你必须掌握的职场杠杆
  • Kafka 基础概念
  • 【毕业设计】机器学习基于python深度学习的苹果和西红柿识别
  • knife4j+springboot3.4异常无法正确展示文档
  • 深度学习计算机毕设之基于深度学习的土豆疾病识别卷神经网络
  • LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
  • Python高效计算斐波那契数列
  • AWS OpenSearch Service TLS 策略升级指南
  • 深度学习毕设项目:基于人工智能深度学习的土豆疾病识别
  • LangChain-08 Query SQL DB 通过GPT自动查询SQL
  • 使用dify搭建爬虫Agent工作流
  • 【课程设计/毕业设计】基于深度学习机器学习的土豆疾病识别
  • 内驱力:点燃自我成长的发动机
  • Katalon平台的集成生态
  • Python代码实现示例解析
  • 深度学习毕设项目:基于python深度学习的苹果和西红柿识别
  • 新手进阶Python:给办公助手加定时功能,自动处理任务不用盯
  • FastAPI 极简教程1
  • 计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度Matlab代码