Skip to content

Commit bb85cfd

Browse files
Merge pull request #10 from MangoButtermilch/fixes-+-improvements
Fixes + improvements
2 parents 16e45ea + 58c5aa1 commit bb85cfd

2 files changed

Lines changed: 11 additions & 12 deletions

File tree

6. Infinite Grass Rendering/Assets/Shaders/GrassBillboardPass.hlsl

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@ struct VertexOutput
2020
float2 uv : TEXCOORD0;
2121
float3 normal : NORMAL;
2222
float3 dynamicWorldPos: TEXCOORD3;//world position moved by wind and other things
23-
float3 staticWorldPos: TEXCOORD4;//static world position for sampling a texture
24-
float3 scale: TEXCOORD5;
2523
float distToCam: TEXCOORD6;
2624
float textureNoise: TEXCOORD7;
27-
uint lodIndex : TEXCOORD8;
2825
};
2926

3027
//individuall buffers per material
@@ -93,7 +90,7 @@ void Applyfog(inout float4 color, float3 positionWS)
9390
#endif
9491
}
9592

96-
void ApplyTexColor(float3 worldPos, float2 uv, float textureNoise, out float4 texCol) {
93+
void ApplyTexColor(float2 uv, float textureNoise, out float4 texCol) {
9794
uv = uv * agr_billboardTextures_ST.xy + agr_billboardTextures_ST.zw;
9895
float index = floor(textureNoise * (agr_billboardTextureCount));
9996
texCol = SAMPLE_TEXTURE2D_ARRAY(agr_billboardTextures, sampler_agr_billboardTextures, uv, index);
@@ -106,7 +103,6 @@ VertexOutput vert (VertexInput input, uint instanceID : SV_InstanceID)
106103

107104
uint index = instanceData.trsIndex;
108105
uint lodIndex = instanceData.lodIndex;
109-
output.lodIndex = lodIndex;
110106

111107
#ifdef SHADOW_CASTER_PASS
112108
if (lodIndex > 0)
@@ -127,7 +123,6 @@ VertexOutput vert (VertexInput input, uint instanceID : SV_InstanceID)
127123

128124
//applying transformation matrix
129125
float3 staticWorldPos = mul(mat, float4(vertex.xyz, 1));
130-
output.staticWorldPos = staticWorldPos;
131126

132127
float3 camPos = _WorldSpaceCameraPos;
133128
output.distToCam = distance(staticWorldPos, camPos);
@@ -144,7 +139,6 @@ VertexOutput vert (VertexInput input, uint instanceID : SV_InstanceID)
144139
noise = (noise - .5) * 2.;
145140
scale = GetScaleFromMatrix(mat);
146141
}
147-
output.scale = scale;
148142

149143

150144
//to keep bottom part of mesh at its position
@@ -159,12 +153,12 @@ VertexOutput vert (VertexInput input, uint instanceID : SV_InstanceID)
159153
//distortion based on view
160154
float3 viewDisplacement = mul(UNITY_MATRIX_VP, input.normal) * dynamicWorldPos.z;
161155
dynamicWorldPos.xz += ((1. - viewDisplacement) * 0.0001) * output.uv.y;
162-
output.dynamicWorldPos = dynamicWorldPos;
156+
output.dynamicWorldPos = dynamicWorldPos;
163157

164158
output.vertex = mul(UNITY_MATRIX_VP, float4(dynamicWorldPos, 1));
165159

166160
//generating texture noise in vertex stage to improve performance
167-
output.textureNoise = GetGrassNoise(output.staticWorldPos);
161+
output.textureNoise = GetGrassNoise(staticWorldPos);
168162

169163
output.normal = (agr_flatShading < 0) ? input.normal : 0;
170164
return output;
@@ -179,7 +173,7 @@ float4 frag (VertexOutput input) : SV_Target
179173
float4 texCol = 0;
180174
float noise = input.textureNoise;
181175

182-
ApplyTexColor(input.staticWorldPos, input.uv, noise, texCol);
176+
ApplyTexColor(input.uv, noise, texCol);
183177

184178
texCol.a *= (1. - fade);
185179
if (texCol.a < agr_alphaCutoff) {

6. Infinite Grass Rendering/Assets/Shaders/GrassRenderer.compute

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,12 @@ float3 GenerateInstancePos(float3 chunkPos, uint instanceSeed) {
182182
}
183183

184184
void GenerateChunkData(uint i, float3 chunkPos, out float3 instancePos, out uint instanceSeed, out float2 terrainUV, out float gradientNoise) {
185-
instanceSeed = SimpleHash(i + chunkPos.x + chunkPos.z) ;
185+
uint cx = asuint(chunkPos.x); //example 8.0f to 0x41000000
186+
uint cz = asuint(chunkPos.z);
187+
188+
uint chunkHash = SimpleHash(cx * 2246822519u ^ cz * 3266489917u);
189+
instanceSeed = SimpleHash(chunkHash ^ (i * 2654435761u));
190+
186191
instancePos = GenerateInstancePos(chunkPos, instanceSeed);
187192
terrainUV = WorldToTerrainUV(instancePos);
188193
Unity_GradientNoise_Deterministic_float(terrainUV, scaleNoiseScale, gradientNoise);
@@ -236,7 +241,7 @@ void InitInstanceTransforms(uint3 id : SV_DispatchThreadID)
236241
float3 instancePos;
237242
float2 uv;
238243

239-
for (uint i = 0; i < count; i++)
244+
for (uint i = 0; i < instancesPerChunk; i++)
240245
{
241246
GenerateChunkData(i, chunkPos, instancePos, instanceSeed, uv, gradientNoise);
242247
//This condition has to match the one in InitChunkInstanceCount() in order to skip the exact same invalid instances.

0 commit comments

Comments
 (0)