GPU动画实现的最后一步是在shader中重新进行顶点采样。

将动画数据存在一张图片上,每帧动画数据就是一行,因此每个顶点的位置由2个属性确定

1.帧数

2.顶点ID

帧数 = 当前时间 / 动画时间

顶点ID则通过UNITY_VERTEX_INPUT_INSTANCE_ID,Unity会自动将该顶点ID传入

因此,在shade中,进行如下定义,这里直接用最简单的unlit shader示例

            struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;uint vid : SV_VERTEXID;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID};

在顶点着色器中,直接进行顶点位置修改,通过顶点ID和动画时间计算取得顶点的位置。

            v2f vert (appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v, o);float4 uv_anim = float4((v.vid + 0.5) * UNITY_ACCESS_INSTANCED_PROP(Props, _AnimTex_TexelSize).x, _Time.y / UNITY_ACCESS_INSTANCED_PROP(Props, _AnimTime),0.0,0.0);v.vertex = float4(tex2Dlod(_AnimTex, uv_anim).xyz,1.0);//v.vertex.y = v.vertex.y - 0.5;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv * UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST).xy + UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST).zw;return o;}

片元着色器不用特别处理,直接采样输出即可


着色器源码如下

Properties{_MainTex ("Texture", 2D) = "white" {}_AnimTex ("Texture", 2D) = "white" {}_AnimTime ("AnimTime", float) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma target 3.5#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_instancing#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;uint vid : SV_VERTEXID;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID};CBUFFER_START(UnityPerMaterial)sampler2D _MainTex;sampler2D _AnimTex;//float4 _MainTex_ST;UNITY_INSTANCING_BUFFER_START(Props)UNITY_DEFINE_INSTANCED_PROP(float4, _AnimTex_TexelSize)UNITY_DEFINE_INSTANCED_PROP(float4, _MainTex_ST)UNITY_DEFINE_INSTANCED_PROP(float, _AnimTime)UNITY_INSTANCING_BUFFER_END(Props)CBUFFER_ENDv2f vert (appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v, o);float4 uv_anim = float4((v.vid + 0.5) * UNITY_ACCESS_INSTANCED_PROP(Props, _AnimTex_TexelSize).x, _Time.y / UNITY_ACCESS_INSTANCED_PROP(Props, _AnimTime),0.0,0.0);v.vertex = float4(tex2Dlod(_AnimTex, uv_anim).xyz,1.0);//v.vertex.y = v.vertex.y - 0.5;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv * UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST).xy + UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST).zw;return o;}fixed4 frag (v2f i) : SV_Target{UNITY_SETUP_INSTANCE_ID(i);fixed4 col = tex2D(_MainTex, i.uv);//return float4(1.0,1.0,1.0,1.0) * _Time.y;return col;}ENDCG}}

[Unity] GPU动画实现(五)——渲染GPU动画相关推荐

  1. WPF中的动画——(五)路径动画

    路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了. 路径动画中最常用的是MatrixAnimati ...

  2. 动画基础,3种动画方式

    WPF编程学习--动画 WPF中的动画--(一)基本概念 WPF中的动画--(二)From/To/By 动画 WPF中的动画--(三)时间线(TimeLine) WPF中的动画--(四)缓动函数 WP ...

  3. unity 一万个具有相同动画的物体渲染

    unity 一万个量具有相同动画的物体渲染 先显示效果,帧率在70左右 性能分析 大量具有相同动画的物体,首先想到的是GPU Instancing 首先Skin Mesh合并,一个物体下面的所有mes ...

  4. 08.Unity ShaderGraph实例(使用PBR渲染精灵动画)

    相关资源下载 创建精灵Sheet 制作精灵动画 ShaderGraph:怎么定义精灵贴图 ShaderGraph:怎么剔除Alpha Node:Sample Texture 2D Node:Repla ...

  5. 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家

    根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛,最终获奖结果出炉啦. 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份.在宣布最 ...

  6. chrome 硬件渲染(GPU Accelerated Compositing in Chrome)

    原文链接 http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome chrom ...

  7. 2021 年最佳 3D 渲染 GPU

    高质量的视觉图形对于媒体.电影.平面设计.动画.空间研究.建筑.室内设计等行业至关重要.所有这些行业都依赖于渲染过程来获得各种专业项目的所有结果.过去几年,GPU渲染技术如风暴般席卷IT行业.虽然 G ...

  8. KeyShot 11 Pro for Mac(3D渲染和动画制作) V11.3.2.2中文安装+更新内容

    keyshot11 pro for mac最新版已经全面升级,功能强大,操作好用,并且实现简体中文界面.keyshot 11是一款基于mac平台开发的的3D渲染工具,是非常强大的光线追踪与全域光渲染软 ...

  9. Javascript高性能动画与页面渲染

    No setTimeout, No setInterval 如果你不得不使用setTimeout或者setInterval来实现动画,那么原因只能是你需要精确的控制动画.但我认为至少在现在这个时间点, ...

  10. 小程序 mathjs渲染公式_Mac 3D渲染和动画制作----KeyShot 9 Pro

    KeyShot 9 Pro for Mac是应用在Mac上的一款3D渲染和动画制作软件,keyshot是您快速创建精彩视觉效果所需的一切.在实时3D渲染工作流程显示结果即时,缩短了创建逼真的产品拍摄的 ...

最新文章

  1. python not函数_python 函数
  2. 数据库的字段是date java里面能用timestamp吗_数据库中DATETIME,DATE和TIMESTAMP类型 的区别...
  3. Spring学习笔记15--注解Bean
  4. 三分钟了解Mysql的表级锁——《深究Mysql锁》
  5. yum list失败
  6. TensorFlow 教程 --进阶指南--3.6增加一个新 Op
  7. 使用 Request.QueryString 接受参数时,跟编码有关的一些问题
  8. ssh相互访问不用密码
  9. 【转】重装系统后找不到硬盘
  10. asp.net core 返回的Server Kestrel是什么
  11. 大数据第一季--java基础(day2)-徐培成-专题视频课程
  12. 目前常用的4种备份系统架构
  13. aliyun - ddns
  14. 阿里巴巴按关键字搜索新品数据 API
  15. 【C基础】(1ul<<5)|(1ul<<4)|(1ul<<2)
  16. 2020-10-19(JS收官答题卡)
  17. redis修改端口号
  18. jquery根据属性查询元素
  19. java获取数字_java 获取String中的数字
  20. 基于SpringBoot软件工程专业教辅平台课程子系统

热门文章

  1. 这样提案,设计比较容易落地
  2. ZBrush教程:移动笔使用教程
  3. zabbix使用snmp监控交换机
  4. 音频格式m4a怎么转换成mp3
  5. yml没绿标,java,resources未识别不变色
  6. [附源码]java毕业设计运动器材网上销售系统
  7. Python爬虫利器二之Beautiful Soup的用法
  8. 360私有云容器镜像仓库简介
  9. 国学精髓——应用性智慧的经典语句!
  10. c语言六角填数答案,六角填数