From 0772f148c4dd3bf8f8a87b1405debfac3fcb64ef Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 25 Nov 2021 01:13:53 +0100 Subject: [PATCH] Improve the AO pass --- src/lightmap/cpuraytracer.cpp | 2 +- src/lightmap/glsl_rgen_ambient.h | 2 +- src/lightmap/gpuraytracer.cpp | 4 +- src/lightmap/levelmesh.cpp | 74 +++++++++++++++++++++----------- src/lightmap/levelmesh.h | 3 +- 5 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/lightmap/cpuraytracer.cpp b/src/lightmap/cpuraytracer.cpp index 93b243e..b310f82 100644 --- a/src/lightmap/cpuraytracer.cpp +++ b/src/lightmap/cpuraytracer.cpp @@ -377,7 +377,7 @@ void CPURaytracer::CreateHemisphereVectors() vec3 H; H.x = Xi.x * 2.0f - 1.0f; H.y = Xi.y * 2.0f - 1.0f; - H.z = RadicalInverse_VdC(i) + 0.01f; + H.z = 1.5f - length(Xi); H = normalize(H); HemisphereVectors.push_back(H); } diff --git a/src/lightmap/glsl_rgen_ambient.h b/src/lightmap/glsl_rgen_ambient.h index 3b56cb9..c82c7d2 100644 --- a/src/lightmap/glsl_rgen_ambient.h +++ b/src/lightmap/glsl_rgen_ambient.h @@ -80,7 +80,7 @@ void main() for (uint i = 0; i < SampleCount; i++) { vec2 Xi = Hammersley(i, SampleCount); - vec3 H = normalize(vec3(Xi.x * 2.0f - 1.0f, Xi.y * 2.0f - 1.0f, RadicalInverse_VdC(i) + 0.01f)); + vec3 H = normalize(vec3(Xi.x * 2.0f - 1.0f, Xi.y * 2.0f - 1.0f, 1.5 - length(Xi))); vec3 L = H.x * tangent + H.y * bitangent + H.z * N; traceRayEXT(acc, gl_RayFlagsOpaqueEXT, 0xff, 3, 0, 3, origin, minDistance, L, 32768, 0); ambience += clamp(payload.hitAttenuation / aoDistance, 0.0, 1.0); diff --git a/src/lightmap/gpuraytracer.cpp b/src/lightmap/gpuraytracer.cpp index b3f52e4..eea25b5 100644 --- a/src/lightmap/gpuraytracer.cpp +++ b/src/lightmap/gpuraytracer.cpp @@ -84,7 +84,7 @@ void GPURaytracer::Raytrace(LevelMesh* level) vec3 H; H.x = Xi.x * 2.0f - 1.0f; H.y = Xi.y * 2.0f - 1.0f; - H.z = RadicalInverse_VdC(i) + 0.01f; + H.z = 1.5f - length(Xi); H = normalize(H); HemisphereVectors.push_back(H); } @@ -191,7 +191,7 @@ void GPURaytracer::UploadTasks(const TraceTask* tasks, size_t size) if (task.id >= 0) { Surface* surface = mesh->surfaces[task.id].get(); - vec3 pos = surface->lightmapOrigin + surface->lightmapSteps[0] * (float)task.x + surface->lightmapSteps[1] * (float)task.y; + vec3 pos = surface->lightmapOrigin + surface->lightmapSteps[0] * (task.x + 0.5f) + surface->lightmapSteps[1] * (task.y + 0.5f); startPositions[i] = vec4(pos, (float)task.id); } else diff --git a/src/lightmap/levelmesh.cpp b/src/lightmap/levelmesh.cpp index 5849602..8c55d53 100644 --- a/src/lightmap/levelmesh.cpp +++ b/src/lightmap/levelmesh.cpp @@ -135,10 +135,10 @@ void LevelMesh::BuildSurfaceParams(Surface* surface) // round off dimentions for (i = 0; i < 3; i++) { - bounds.min[i] = samples * Math::Floor(bounds.min[i] / samples); - bounds.max[i] = samples * Math::Ceil(bounds.max[i] / samples); + bounds.min[i] = samples * (Math::Floor(bounds.min[i] / samples) - 1); + bounds.max[i] = samples * (Math::Ceil(bounds.max[i] / samples) + 1); - roundedSize[i] = (bounds.max[i] - bounds.min[i]) / samples + 1; + roundedSize[i] = (bounds.max[i] - bounds.min[i]) / samples; } tCoords[0] = vec3(0.0f); @@ -184,7 +184,32 @@ void LevelMesh::BuildSurfaceParams(Surface* surface) height = (textureHeight - 2); } - surface->lightmapCoords.resize(surface->numVerts * 2); + surface->lightmapCoords.resize(surface->numVerts); + for (i = 0; i < surface->numVerts; i++) + { + vec3 tDelta = surface->verts[i] - bounds.min; + surface->lightmapCoords[i].x = dot(tDelta, tCoords[0]); + surface->lightmapCoords[i].y = dot(tDelta, tCoords[1]); + } + + /* + surface->coveragemask.resize(width * height); + if (surface->type == ST_FLOOR || surface->type == ST_CEILING) + { + int count = surfaces[i]->numVerts; + for (i = 0; i < count; i++) + { + MarkEdge(surface, i, i + 1 % count); + } + } + else // triangle strip + { + MarkEdge(surface, 0, 2); + MarkEdge(surface, 2, 3); + MarkEdge(surface, 3, 1); + MarkEdge(surface, 1, 0); + } + */ surface->textureCoords[0] = tCoords[0]; surface->textureCoords[1] = tCoords[1]; @@ -209,10 +234,8 @@ void LevelMesh::BuildSurfaceParams(Surface* surface) surface->lightmapSteps[0] = tCoords[0] * (float)samples; surface->lightmapSteps[1] = tCoords[1] * (float)samples; - int sampleWidth = surface->lightmapDims[0]; - int sampleHeight = surface->lightmapDims[1]; - surface->samples.resize(sampleWidth * sampleHeight); - surface->indirect.resize(sampleWidth * sampleHeight); + surface->samples.resize(width * height); + surface->indirect.resize(width * height); } BBox LevelMesh::GetBoundsFromSurface(const Surface* surface) @@ -305,12 +328,13 @@ void LevelMesh::FinishSurface(Surface* surface) uint16_t* currentTexture = textures[surface->lightmapNum]->Pixels(); - // calculate texture coordinates + // calculate final texture coordinates for (int i = 0; i < surface->numVerts; i++) { - vec3 tDelta = surface->verts[i] - surface->bounds.min; - surface->lightmapCoords[i * 2 + 0] = (dot(tDelta, surface->textureCoords[0]) + x + 0.5f) / (float)textureWidth; - surface->lightmapCoords[i * 2 + 1] = (dot(tDelta, surface->textureCoords[1]) + y + 0.5f) / (float)textureHeight; + auto& u = surface->lightmapCoords[i].x; + auto& v = surface->lightmapCoords[i].y; + u = (u + x) / (float)textureWidth; + v = (v + y) / (float)textureHeight; } surface->lightmapOffs[0] = x; @@ -881,33 +905,33 @@ void LevelMesh::AddLightmapLump(FWadWriter& wadFile) { for (int j = count - 1; j >= 0; j--) { - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j * 2]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j * 2 + 1]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j].y); } } else if (surfaces[i]->type == ST_CEILING) { for (int j = 0; j < count; j++) { - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j * 2]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j * 2 + 1]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[j].y); } } else { // zdray uses triangle strip internally, lump/gzd uses triangle fan - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[0]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[1]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[0].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[0].y); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[4]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[5]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[2].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[2].y); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[6]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[7]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[3].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[3].y); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[2]); - lumpFile.WriteFloat(surfaces[i]->lightmapCoords[3]); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[1].x); + lumpFile.WriteFloat(surfaces[i]->lightmapCoords[1].y); } } @@ -954,7 +978,7 @@ void LevelMesh::Export(std::string filename) int uvindex = MeshUVIndex[vertexidx]; outvertices[vertexidx] = MeshVertices[vertexidx]; - outuv[vertexidx] = vec2(surface->lightmapCoords[uvindex * 2], surface->lightmapCoords[uvindex * 2 + 1]); + outuv[vertexidx] = surface->lightmapCoords[uvindex]; outnormal[vertexidx] = surface->plane.Normal(); outface.Push(vertexidx); diff --git a/src/lightmap/levelmesh.h b/src/lightmap/levelmesh.h index 0c64df7..e96d0f3 100644 --- a/src/lightmap/levelmesh.h +++ b/src/lightmap/levelmesh.h @@ -64,7 +64,8 @@ struct Surface BBox bounds; int numVerts; std::vector verts; - std::vector lightmapCoords; + std::vector lightmapCoords; + //std::vector coveragemask; std::vector samples; std::vector indirect; SurfaceType type;