赞
踩
在Unity的Shader中,使用了_Time来达到UV的流动效果,普遍会出现一个问题。我们的UV值会随着时间一直增加(uv值增加了,但是因为超过1就会重复,不影响效果),在一些较老的移动端上,存储不下那么大的值,就会导致精度丢失。
o.uv.x += frac(floor(_Time.y *_Sequence.y * _Sequence.z)/_Sequence.y);
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 On Pass { 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_END TEXTURE2D(_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 } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。