[Unity] GPU动画实现(五)——渲染GPU动画
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动画相关推荐
- WPF中的动画——(五)路径动画
路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了. 路径动画中最常用的是MatrixAnimati ...
- 动画基础,3种动画方式
WPF编程学习--动画 WPF中的动画--(一)基本概念 WPF中的动画--(二)From/To/By 动画 WPF中的动画--(三)时间线(TimeLine) WPF中的动画--(四)缓动函数 WP ...
- unity 一万个具有相同动画的物体渲染
unity 一万个量具有相同动画的物体渲染 先显示效果,帧率在70左右 性能分析 大量具有相同动画的物体,首先想到的是GPU Instancing 首先Skin Mesh合并,一个物体下面的所有mes ...
- 08.Unity ShaderGraph实例(使用PBR渲染精灵动画)
相关资源下载 创建精灵Sheet 制作精灵动画 ShaderGraph:怎么定义精灵贴图 ShaderGraph:怎么剔除Alpha Node:Sample Texture 2D Node:Repla ...
- 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家
根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛,最终获奖结果出炉啦. 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份.在宣布最 ...
- chrome 硬件渲染(GPU Accelerated Compositing in Chrome)
原文链接 http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome chrom ...
- 2021 年最佳 3D 渲染 GPU
高质量的视觉图形对于媒体.电影.平面设计.动画.空间研究.建筑.室内设计等行业至关重要.所有这些行业都依赖于渲染过程来获得各种专业项目的所有结果.过去几年,GPU渲染技术如风暴般席卷IT行业.虽然 G ...
- KeyShot 11 Pro for Mac(3D渲染和动画制作) V11.3.2.2中文安装+更新内容
keyshot11 pro for mac最新版已经全面升级,功能强大,操作好用,并且实现简体中文界面.keyshot 11是一款基于mac平台开发的的3D渲染工具,是非常强大的光线追踪与全域光渲染软 ...
- Javascript高性能动画与页面渲染
No setTimeout, No setInterval 如果你不得不使用setTimeout或者setInterval来实现动画,那么原因只能是你需要精确的控制动画.但我认为至少在现在这个时间点, ...
- 小程序 mathjs渲染公式_Mac 3D渲染和动画制作----KeyShot 9 Pro
KeyShot 9 Pro for Mac是应用在Mac上的一款3D渲染和动画制作软件,keyshot是您快速创建精彩视觉效果所需的一切.在实时3D渲染工作流程显示结果即时,缩短了创建逼真的产品拍摄的 ...
最新文章
- python not函数_python 函数
- 数据库的字段是date java里面能用timestamp吗_数据库中DATETIME,DATE和TIMESTAMP类型 的区别...
- Spring学习笔记15--注解Bean
- 三分钟了解Mysql的表级锁——《深究Mysql锁》
- yum list失败
- TensorFlow 教程 --进阶指南--3.6增加一个新 Op
- 使用 Request.QueryString 接受参数时,跟编码有关的一些问题
- ssh相互访问不用密码
- 【转】重装系统后找不到硬盘
- asp.net core 返回的Server Kestrel是什么
- 大数据第一季--java基础(day2)-徐培成-专题视频课程
- 目前常用的4种备份系统架构
- aliyun - ddns
- 阿里巴巴按关键字搜索新品数据 API
- 【C基础】(1ul<<5)|(1ul<<4)|(1ul<<2)
- 2020-10-19(JS收官答题卡)
- redis修改端口号
- jquery根据属性查询元素
- java获取数字_java 获取String中的数字
- 基于SpringBoot软件工程专业教辅平台课程子系统