前提・実現したいこと
テクスチャの反復周期を長くしたい
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5 6public class GenerateTerrain : MonoBehaviour 7{ 8 Mesh mesh; 9 Mesh treeMesh; 10 Matrix4x4[][] matrices; 11 int count; 12 public Material material; 13 public Material treeMaterial; 14 public int rows = 250; 15 public int columns = 250; 16 private void Start() 17 { 18 mesh = new Mesh(); 19 mesh.vertices = new Vector3[] { 20 new Vector3 (0, 0, 0), 21 new Vector3 (0, 1, 0), 22 new Vector3 (1, 0, 0), 23 new Vector3 (1, 1, 0), 24 }; 25 26 mesh.uv = new Vector2[] { 27 new Vector2 (0, 0), 28 new Vector2 (0, 1), 29 new Vector2 (1, 0), 30 new Vector2 (1, 1), 31 }; 32 33 mesh.triangles = new int[] { 34 0, 1, 2, 35 1, 3, 2, 36 }; 37 38 mesh.RecalculateNormals(); 39 mesh.RecalculateBounds(); 40 41 // 各インスタンスの姿勢はMatrix4x4として与える 42 count = rows * columns; 43 var flatMatrices = new Matrix4x4[count]; 44 for (var i = 0; i < rows; i++) 45 { 46 for (var j = 0; j < columns; j++) 47 { 48 var index = (i * columns) + j; 49 50 var position = new Vector3(j, i, 0.0f); 51 52 var rotation = Quaternion.identity; 53 54 var scale = Vector3.one; 55 56 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 57 } 58 } 59 60 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 61 matrices = flatMatrices.Select((m, i) => (m, i / 1023)) 62 .GroupBy(t => t.Item2) 63 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 64 } 65 66 void Update() 67 { 68 foreach (var m in matrices) 69 { 70 Graphics.DrawMeshInstanced(mesh, 0, material, m); 71 } 72 } 73} 74
ShaderLab
1Shader "Unlit/Terrain" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 [IntRange] _Magnification ("Magnification", Range(1, 32)) = 8 7 } 8 SubShader 9 { 10 Tags { "Queue"="Transparent" "RenderType"="Transparent" } 11 LOD 100 12 13 Pass 14 { 15 ZWrite Off 16 ZTest Always 17 Blend SrcAlpha OneMinusSrcAlpha 18 19 CGPROGRAM 20 #pragma vertex vert 21 #pragma fragment frag 22 #pragma multi_compile_instancing 23 // make fog work 24 #pragma multi_compile_fog 25 26 #include "UnityCG.cginc" 27 28 struct appdata 29 { 30 float4 vertex : POSITION; 31 float2 uv : TEXCOORD0; 32 UNITY_VERTEX_INPUT_INSTANCE_ID 33 }; 34 35 struct v2f 36 { 37 float2 uv : TEXCOORD0; 38 UNITY_FOG_COORDS(1) 39 float4 vertex : SV_POSITION; 40 }; 41 42 sampler2D _MainTex; 43 float4 _MainTex_ST; 44 int _Magnification; 45 46 v2f vert (appdata v) 47 { 48 v2f o; 49 UNITY_SETUP_INSTANCE_ID(v) 50 o.vertex = UnityObjectToClipPos(v.vertex); 51 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 52 UNITY_TRANSFER_FOG(o,o.vertex); 53 o.uv = v.vertex.xy / _Magnification; 54 return o; 55 } 56 57 fixed4 frag (v2f i) : SV_Target 58 { 59 // sample the texture 60 fixed4 col = tex2D(_MainTex, i.uv); 61 // apply fog 62 UNITY_APPLY_FOG(i.fogCoord, col); 63 return col; 64 } 65 ENDCG 66 } 67 } 68} 69
試したこと
1024×1024の画像を使って、タイル数250×250のメッシュを生成しているため、テクスチャが潰れて見えてしまいます。シェーダーを使って、タイル数32×32のマップにしてみようとしましたが、単純に拡大されるだけで、上手くいきません。
どのように書き換えればよいでしょうか? 回答お願いします。加えて、こういったタイリングに関するシェーダーの勉強法なども出来れば教えてもらいたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/19 05:02