Unity中Shader的_Time精度问题

文章目录

  • 前言
  • 一、U方向上优化
  • 二、V方向上优化
    • 在这里插入图片描述
  • 三、最终代码
    • 1、效果
    • 2、Shader


前言

在Unity的Shader中,使用了_Time来达到UV的流动效果,普遍会出现一个问题。我们的UV值会随着时间一直增加(uv值增加了,但是因为超过1就会重复,不影响效果),在一些较老的移动端上,存储不下那么大的值,就会导致精度丢失。

  • 精度丢失前
    请添加图片描述
  • 精度丢失后(有特别明显的像素点质感)
    请添加图片描述
    我们对上一篇文章中,使用到的序列帧动画Shader,进行_Time相加后的精度优化。
  • Unity中Shader序列帧动画(U、V方向的走格)

一、U方向上优化

  • 对之前的公式取小数部分
  • u ( t ) = g ( C o l u m n ⋅ t ) C o l u m n = ⌊ C o l u m n ⋅ t ⌋ C o l u m n u(t) = \frac{g(Column·t)}{Column} = \frac{\lfloor Column·t \rfloor}{Column} u(t)=Columng(Columnt)=ColumnColumnt
  • u 2 ( t ) = f r a c ( u ( t ) ) = f r a c ( ⌊ C o l u m n ⋅ t ⌋ C o l u m n ) u_2(t) = frac(u(t)) =frac(\frac{\lfloor Column·t \rfloor}{Column}) u2(t)=frac(u(t))=frac(ColumnColumnt)
    在这里插入图片描述

o.uv.x += frac(floor(_Time.y *_Sequence.y * _Sequence.z)/_Sequence.y);


二、V方向上优化

  • 对之前的公式取小数部分
  • v ( t ) = u ( t C o l u m n ) = ⌊ C o l u m n ⋅ t C o l u m n ⌋ C o l u m n v(t) = u(\frac{t}{Column}) = \frac{\lfloor \frac{Column·t}{Column} \rfloor}{Column} v(t)=u(Columnt)=ColumnColumnColumnt
  • v 2 ( t ) = f r a c ( v ( t ) ) = f r a c ( ⌊ C o l u m n ⋅ t C o l u m n ⌋ C o l u m n ) v_2(t) = frac(v(t)) = frac(\frac{\lfloor \frac{Column·t}{Column} \rfloor}{Column}) v2(t)=frac(v(t))=frac(ColumnColumnColumnt)

在这里插入图片描述

三、最终代码

1、效果

请添加图片描述

2、Shader

Shader "MyShader/URP/P3_9"
{Properties{_Color("Color",Color) = (1,1,1,1)_MainTex("MainTex",2D) = "white"{}_Sequence("Row(X) Column(Y) Speed(Z)",Vector) = (1,1,1,1)}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}Blend SrcAlpha OneMinusSrcAlpha Zwrite OnPass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fog#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attribute{float3 vertexOS : POSITION;float2 uv : TEXCOORD0;};struct Varying{float4 vertexCS : SV_POSITION;float2 uv : TEXCOORD1;float fogCoord : TEXCOORD2;};CBUFFER_START(UnityPerMaterial)float4 _Color;float4 _MainTex_ST;half4 _Sequence;CBUFFER_ENDTEXTURE2D(_MainTex);SAMPLER(sampler_MainTex);Varying vert(Attribute v){Varying o;o.vertexCS = TransformObjectToHClip(v.vertexOS);o.uv = float2(v.uv.x/_Sequence.y,v.uv.y/_Sequence.x + (_Sequence.x - 1)/_Sequence.x);o.uv.x += frac(floor(_Time.y *_Sequence.y * _Sequence.z)/_Sequence.y);o.uv.y -= frac(floor(_Time.y *_Sequence.y * _Sequence.z / _Sequence.y)/_Sequence.x);//o.uv.x += floor(_Time.y);//o.uv = float2(v.uv.x/4,v.uv.y/4);//o.uv = TRANSFORM_TEX(v.uv,_MainTex);o.fogCoord = ComputeFogFactor(o.vertexCS.z);return o;}half4 frag(Varying i) : SV_Target{float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);float4 col = mainTex * _Color;col.rgb = MixFog(col,i.fogCoord);return col;}ENDHLSL}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/328095.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1982-2022年GIMMS 标准化差异植被指数

GIMMS 标准化差异植被指数 1982-2022 PKU GIMMS 归一化植被指数数据集(PKU GIMMS NDVI,版本 1.2)提供了从 1982 年到 2022 年以半个月为间隔、分辨率为 1/12 的一致的全球 NDVI 数据。其主要目标是解决现有领域中普遍存在的关键不确定性。全…

AI教我学编程之C#关键字

AI教我学编程系列学习第三课 — C#关键字 前言重点先知关键字分类保留字上下文关键字 对话AI首遇波澜调整指令第一次第二次第三次直到我提出如下指令 人工智能?阶段总结 知识拓展1、Ecma和ISO是什么?2、System,dllhost.exe,taskmg…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

SpringBoot配置Swagger2与Swagger3

swagger是什么? 在平时开发中,一个好的API文档可以减少大量的沟通成本,还可以帮助新加入项目的同事快速上手业务。大家都知道平时开发时,接口变化总是很多,有了变化就要去维护,也是一件比较头大的事情。尤…

IDEA TODO

今天记录一个 IDEA 工具的小技巧, TODO。比如下班前有一个小功能没完善好,此时可以在响应代码上加上 TODO 注解, //密码比对 // TODO 后期需要进行md5加密,然后再进行比对 password DigestUtils.md5DigestAsHex(password.getByt…

LeetCode 42:接雨水

一、题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,…

OpenSSL——升级

OpenSSL(Open Secure Sockets Layer)是一个开源的软件库,提供了SSL和TLS协议的实现,用于加密通信。它广泛用于安全连接,例如在网站上通过HTTPS协议进行安全的数据传输. 但是从openssl申请道德证书是不安全的。对于网站…

SpringBoot学习(二)-SpringBoot Web 开发

注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! SpringBoot Web 开发 1、静态资源 1)创建项目 2)做项目都先测试一…

关于“Python”的核心知识点整理大全64

目录 20.2.15 确保项目的安全 settings.py 20.2.16 提交并推送修改 20.2.17 创建自定义错误页面 1. 创建自定义模板 500.html settings.py settings.py 注意 views.py 20.2.18 继续开发 往期快速传送门👆(在文章最后)&#xff1a…

【Redis】非关系型数据库之Redis的介绍及安装配置

目录 前言 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.3两者的区别 1.4非关系型数据库产生的背景 1.5总结 二、Redis介绍 2.1Redis是什么 2.2Redis的优点 2.3Redis的使用场景 2.4那些数据适合放在缓存中 2.5Redis为什么那么快&#xf…

学习笔记——C++运算符之逻辑运算符

作用&#xff1a;用于根据表达式的真值返回真值或假值 逻辑运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){// 逻辑运算符 非 !int a10;//在c中&#xff0c;除了0均是真 cout<<!a<<endl;//0 cout<<!!a<<…

基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于多目标粒子群的模糊优化算

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于多目标粒子群的模糊优化算 代码 结果分析 展望 代码下载:基于多目标粒子群算法的支配解…