前提・実現したいこと
orthographicSizeを変動させたときに生じるちらつきを直したい
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Diagnostics; 5public class CameraScript : MonoBehaviour 6{ 7 private Camera m_cam; 8 private float zoomSpeed = 10f * 3; 9 private float scrollSpeed = 20f * 5; 10 private float dragSpeed = 0.5f; 11 public Vector2 zoom = new Vector2(3f, 100f); 12 [HideInInspector] 13 public float targetZoom; 14 private bool wait = true; 15 public Camera cam 16 { 17 get 18 { 19 if(this.m_cam == null) 20 { 21 this.m_cam = base.GetComponent<Camera>(); 22 } 23 return this.m_cam; 24 } 25 } 26 public float currentZoom 27 { 28 get 29 { 30 return this.cam.orthographicSize; 31 } 32 set 33 { 34 if(this.cam.orthographicSize == value) 35 { 36 return; 37 } 38 this.cam.orthographicSize = value; 39 } 40 } 41 private void Start() 42 { 43 Application.targetFrameRate = 60; 44 this.currentZoom = 60f; 45 this.targetZoom = 60f; 46 base.transform.position = new Vector3(base.transform.position.x, base.transform.position.y, 47 -this.currentZoom); 48 base.StartCoroutine("Starter"); 49 } 50 [DebuggerHidden] 51 private IEnumerator Starter() 52 { 53 this.zoomSpeed /= 2f; 54 yield return new WaitForSeconds(1f); 55 this.targetZoom = 60f; 56 /*while(this.currentZoom > 33f) 57 { 58 yield return new WaitForSeconds(0.333f); 59 }*/ 60 this.zoomSpeed *= 2f; 61 this.wait = false; 62 } 63 private void Update() 64 { 65 if (!this.wait) 66 { 67 this.MovementKeyboardGame(); 68 this.MovementMouseGame(); 69 this.ZoomMouse(); 70 } 71 } 72 private void FixedUpdate() 73 { 74 this.GoToTargetZoom(); 75 } 76 private void MovementMouseGame() 77 { 78 if (Input.GetMouseButton(2)) 79 { 80 base.transform.Translate(-new Vector3(Input.GetAxis("Mouse X") * this.dragSpeed * Time.deltaTime * 100f, Input.GetAxis("Mouse Y") * this.dragSpeed * Time.deltaTime * 100f, 0f)); 81 } 82 } 83 84 private void MovementKeyboardGame() 85 { 86 base.transform.Translate(new Vector3(Input.GetAxis("Horizontal") * this.scrollSpeed * Time.deltaTime, Input.GetAxis("Vertical") * this.scrollSpeed * Time.deltaTime, 0f)); 87 } 88 89 private void ZoomMouse() 90 { 91 if (Input.GetAxis("Mouse ScrollWheel") != 0f) 92 { 93 this.targetZoom -= Input.GetAxis("Mouse ScrollWheel") * this.zoomSpeed; 94 this.targetZoom = Mathf.Clamp(this.targetZoom, this.zoom.x, this.zoom.y); 95 } 96 } 97 98 private void GoToTargetZoom() 99 { 100 if (this.currentZoom != this.targetZoom) 101 { 102 float num = Mathf.Clamp(Mathf.Abs(this.currentZoom - this.targetZoom), 0.3f, 0.5f); 103 float t = Time.deltaTime * this.zoomSpeed * num; 104 float num2 = Mathf.Lerp(this.currentZoom, this.targetZoom, t); 105 if (Mathf.Abs(num2 - this.targetZoom) < 0.01f) 106 { 107 this.currentZoom = this.targetZoom; 108 } 109 else 110 { 111 this.currentZoom = num2; 112 } 113 if (this.currentZoom >= 5f && this.currentZoom != -base.transform.position.z) 114 { 115 base.transform.Translate(new Vector3(0f, 0f, -(this.currentZoom + base.transform.position.z))); 116 } 117 } 118 } 119} 120
試したこと
Graphics.DrawMeshで正方形のメッシュを100×100描画しているのですが、上記スクリプトを使用してカメラのorthographicSizeを動的に変更させると、描画しているテクスチャにちらつきが生じてしまいます。
対策方法を調べたのですが、現状出て来なかったので、どうしても分からず質問しました。ちらつきをなくす方法はあるでしょうか?
Unity2D 描画がちらつくの方法では解決しませんでした。
・使用しているシェーダーのコード
ShaderLab
1Shader "Unlit/World" 2{ 3 Properties 4 { 5 [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {} 6 7 // 見た目調整用プロパティを変更、前回と異なり大きくするほど鋭くなる 8 [PowerSlider(10)] _EdgeSharpness ("Edge Sharpness", Range(0, 100.0)) = 10.0 9 10 _EdgeDist ("Edge Disturbance", Range(0.0, 1.0)) = 0.05 11 _EdgeDistFreq ("Edge Disturbance Frequency", Range(0.0, 16.0)) = 4.0 12 } 13 14 SubShader 15 { 16 Tags { "RenderType"="Opaque" } 17 18 Pass 19 { 20 CGPROGRAM 21 #pragma vertex vert 22 #pragma fragment frag 23 #include "UnityCG.cginc" 24 25 // 頂点アトリビュートからはUV関連を削除 26 struct appdata 27 { 28 float4 vertex : POSITION; 29 float4 color : COLOR; 30 }; 31 32 // tileUvには(0, 0)、(1, 0)、(0, 1)、(1, 1)のいずれかが入る 33 struct v2f 34 { 35 float4 vertex : SV_POSITION; 36 float2 tileUv : TEXCOORD0; 37 float weight : TEXCOORD1; 38 float2 modelPos : TEXCOORD2; 39 }; 40 41 inline float random(float2 st) { 42 return frac(sin(dot(st, float2(12.9898, 78.233))) * 43758.5453123); 43 } 44 45 float noise(float2 st) 46 { 47 float2 i = floor(st); 48 float2 f = frac(st); 49 float a = random(i); 50 float b = random(i + float2(1.0, 0.0)); 51 float c = random(i + float2(0.0, 1.0)); 52 float d = random(i + float2(1.0, 1.0)); 53 float2 u = f * f * (3.0 - 2.0 * f); 54 55 return dot(float2(lerp(a, b, u.x), lerp(c - a, d - b, u.x)), float2(1.0, u.y)); 56 } 57 58 float fractal(float2 st) 59 { 60 float4 amp = float4(1.0, 0.5, 0.25, 0.125); 61 float4 v; 62 63 v.x = noise(st); 64 st = st * 2.0 + float2(14.1421356237, 17.3205080757); 65 v.y = noise(st); 66 st = st * 2.0 + float2(22.360679775, 26.4575131106); 67 v.z = noise(st); 68 st = st * 2.0 + float2(31.4159265359, 27.1828182846); 69 v.w = noise(st); 70 71 return dot(v, amp) / dot(1.0, amp); 72 } 73 74 sampler2D _MainTex; 75 float4 _MainTex_ST; 76 float4 _MainTex_TexelSize; 77 float _EdgeSharpness; 78 float _EdgeDist; 79 float _EdgeDistFreq; 80 81 // ユニフォーム変数を追加 82 #define TYPE_COUNT_MAX 8 83 int _TypeCount; 84 float4 _TypeUvs[TYPE_COUNT_MAX / 2]; 85 float2 _TileSize; 86 float _TypeLevels[TYPE_COUNT_MAX]; 87 88 float4 _Color; 89 90 v2f vert(appdata v) 91 { 92 v2f o; 93 o.tileUv = v.color.xy; 94 o.weight = v.color.a; 95 o.modelPos = v.vertex.xy; 96 o.vertex = UnityObjectToClipPos(v.vertex); 97 return o; 98 } 99 100 fixed4 frag(v2f i) : SV_Target 101 { 102 // まずは前回同様weightを計算する 103 float f = dot(float2(_EdgeDist, 1.0 - _EdgeDist), float2(fractal(i.modelPos * _EdgeDistFreq), 0.5)); 104 float upper = 1.0 - 2.0 * (1.0 - i.weight) * (1.0 - f); 105 float lower = 2.0 * i.weight * f; 106 float weight = lerp(lower, upper, step(0.5, i.weight)); 107 108 // weightを比較してどの範囲にいるか判定し、それを越えない最大のインデックスを調べる 109 uint index = 0; 110 [unroll(TYPE_COUNT_MAX)] 111 for (int k = 0; k < _TypeCount; k++) 112 { 113 if (_TypeLevels[k] < weight) 114 { 115 index = k + 1; 116 continue; 117 } 118 break; 119 } 120 index = min(index, _TypeCount - 1); 121 122 // さらに、その一つ下・一つ上のインデックスを求めておく 123 uint prevIndex = index > 0 ? index - 1 : 0; 124 uint nextIndex = min(index + 1, _TypeCount - 1); 125 126 // 範囲の下限・上限の高さを取得し、lowerLevelを0、upperLevelを1としたときのweightの位置を調べる 127 float lowerLevel = (index == prevIndex) ? 0.0 : _TypeLevels[prevIndex]; 128 float upperLevel = (index == nextIndex) ? 1.0 : _TypeLevels[index]; 129 float weightInRange = (lowerLevel == upperLevel) ? 0.0 : (weight - lowerLevel) / (upperLevel - lowerLevel); 130 131 // weightInRangeが0.5以上かどうかでnextIndex、prevIndexのいずれかを選択する 132 uint edgeIndex = weightInRange >= 0.5 ? nextIndex : prevIndex; 133 134 // weightInRangeが0.5の時0、そこより範囲境界に近いほど1になるような値を作る 135 // このとき_EdgeSharpness乗して、カーブを適宜鋭くする 136 float edgeFactor = saturate(pow(abs(weightInRange * 2.0 - 1.0), _EdgeSharpness)); 137 138 // 範囲中心および範囲境界に対応するUVを取得し、そこからそれぞれ色を取得する 139 float4 edgeVector = _TypeUvs[edgeIndex / 2]; 140 float4 centerVector = _TypeUvs[index / 2]; 141 float2 edgeUv = lerp(edgeVector.xy, edgeVector.zw, edgeIndex % 2); 142 float2 centerUv = lerp(centerVector.xy, centerVector.zw, index % 2); 143 float2 uvOffset = i.tileUv * _TileSize; 144 fixed4 edgeColor = tex2D(_MainTex, edgeUv + uvOffset); 145 fixed4 centerColor = tex2D(_MainTex, centerUv + uvOffset); 146 147 // 範囲中心でcenterColorが100%、境界部分でcenterColorとedgeColorが 148 // 50%混合になるように2つの色を混ぜ合わせる 149 return lerp(centerColor, edgeColor, edgeFactor * 0.5); 150 } 151 ENDCG 152 } 153 } 154}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/06 22:07
2019/12/06 22:15
退会済みユーザー
2019/12/06 22:30
2019/12/06 22:54
退会済みユーザー
2019/12/06 22:57
2019/12/07 04:19
退会済みユーザー
2019/12/07 06:36