From 4a34220cd7cec05809ccac4a4863383553b61062 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Mon, 31 Mar 2025 11:39:17 +0200 Subject: [PATCH] basic sponza import --- res/shaders/Skybox.slang | 2 +- res/shaders/ToneMapping.slang | 2 +- res/shaders/lib/StaticMeshVertexData.slang | 7 +++-- src/Editor/Asset/MeshLoader.cpp | 15 ++++++--- src/Editor/Asset/TextureLoader.cpp | 10 +++--- src/Editor/main.cpp | 8 ++--- src/Engine/Asset/TextureAsset.cpp | 3 +- src/Engine/Graphics/StaticMeshVertexData.cpp | 33 ++++++++++---------- src/Engine/Graphics/StaticMeshVertexData.h | 12 +++---- src/Engine/Graphics/Vulkan/PipelineCache.cpp | 3 +- 10 files changed, 51 insertions(+), 44 deletions(-) diff --git a/res/shaders/Skybox.slang b/res/shaders/Skybox.slang index def3e3a..f0e2aea 100644 --- a/res/shaders/Skybox.slang +++ b/res/shaders/Skybox.slang @@ -101,5 +101,5 @@ float4 fragmentMain( float factor = (output.texCoords.y - lowerLimit) / (upperLimit - lowerLimit); factor = clamp(factor, 0.0, 1.0); - return lerp(float4(pSkyboxData.fogBlend.xyz, 1), finalColor, factor) * 100; + return lerp(float4(pSkyboxData.fogBlend.xyz, 1), finalColor, factor); } \ No newline at end of file diff --git a/res/shaders/ToneMapping.slang b/res/shaders/ToneMapping.slang index 3608110..b4dd02a 100644 --- a/res/shaders/ToneMapping.slang +++ b/res/shaders/ToneMapping.slang @@ -109,7 +109,7 @@ float4 toneMapping(float2 uv : UV) : SV_Target { float3 hdrValue = pToneMappingParams.hdrInputTexture.Sample(pToneMappingParams.hdrSampler, uv).rgb; - float3 value = agx(hdrValue / 1000); + float3 value = agx(hdrValue); value = agxLook(value); value = agxEotf(value); diff --git a/res/shaders/lib/StaticMeshVertexData.slang b/res/shaders/lib/StaticMeshVertexData.slang index f597dc3..eee80af 100644 --- a/res/shaders/lib/StaticMeshVertexData.slang +++ b/res/shaders/lib/StaticMeshVertexData.slang @@ -16,8 +16,9 @@ struct StaticMeshVertexData #ifndef POS_ONLY //attributes.qTangent = qTangent[index]; attributes.normal_MS = float3(normals[index * 3 + 0], normals[index * 3 + 1], normals[index * 3 + 2]); - attributes.tangent_MS = float3(tangents[index * 3 + 0], tangents[index * 3 + 1], tangents[index * 3 + 2]); - attributes.biTangent_MS = float3(biTangents[index * 3 + 0], biTangents[index * 3 + 1], biTangents[index * 3 + 2]); + float4 tangentSign = float4(tangents[index * 4 + 0], tangents[index * 4 + 1], tangents[index * 4 + 2], tangents[index * 4 + 3]); + attributes.tangent_MS = tangentSign.xyz; + attributes.biTangent_MS = cross(attributes.normal_MS, attributes.tangent_MS) * -tangentSign.w; for(uint i = 0; i < MAX_TEXCOORDS; ++i) { attributes.texCoords[i] = float2(uint16ToFloat(texCoords[i][index * 2 + 0]), uint16ToFloat(texCoords[i][index * 2 + 1])); @@ -27,9 +28,9 @@ struct StaticMeshVertexData return attributes; } StructuredBuffer positions; + //StructuredBuffer qTangents; StructuredBuffer normals; StructuredBuffer tangents; - StructuredBuffer biTangents; StructuredBuffer color; StructuredBuffer texCoords[MAX_TEXCOORDS]; }; diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index 7bd010b..c8bb68b 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -536,7 +536,7 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const Array normals(mesh->mNumVertices); Array tangents(mesh->mNumVertices); - Array biTangents(mesh->mNumVertices); + //Array biTangents(mesh->mNumVertices); Array colors(mesh->mNumVertices); for (uint32 i = 0; i < mesh->mNumVertices; ++i) { @@ -555,10 +555,15 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const ArraymTangents[i].x, mesh->mTangents[i].y, mesh->mTangents[i].z); biTangent = Vector(mesh->mBitangents[i].x, mesh->mBitangents[i].y, mesh->mBitangents[i].z); } - normals[i] = normal; // encodeQTangent(Matrix3(tangent, biTangent, normal)); - tangents[i] = tangent; - biTangents[i] = biTangent; + normals[i] = normal; // encodeQTangent(Matrix3(tangent, biTangent, normal)); + // the fourth component encodes the sign of the bitangent. + // in the shader we calc n x t, and b = (n x t) * sign + // so we try to cross the two, and see what is the result, and if it is + // the same as b, the dot product is 1, and if they are inverse, the dot product is + // -1, which is the sign we need + tangents[i] = Vector4(tangent, dot(glm::cross(normal, tangent), biTangent)); + if (mesh->HasVertexColors(0)) { colors[i] = StaticMeshVertexData::ColorType(mesh->mColors[0][i].r * 65535, mesh->mColors[0][i].g * 65535, mesh->mColors[0][i].b * 65535); } else { @@ -572,7 +577,7 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const ArrayloadNormals(offset, normals); vertexData->loadTangents(offset, tangents); - vertexData->loadBitangents(offset, biTangents); + //vertexData->loadBitangents(offset, biTangents); vertexData->loadColors(offset, colors); Array indices(mesh->mNumFaces * 3); diff --git a/src/Editor/Asset/TextureLoader.cpp b/src/Editor/Asset/TextureLoader.cpp index d37feec..3809ac6 100644 --- a/src/Editor/Asset/TextureLoader.cpp +++ b/src/Editor/Asset/TextureLoader.cpp @@ -42,7 +42,7 @@ void TextureLoader::importAsset(TextureImportArgs args) { PTextureAsset ref = asset; asset->setStatus(Asset::Status::Loading); AssetRegistry::get().registerTexture(std::move(asset)); - import(args, ref); + getThreadPool().runAsync([=]() { import(args, ref); }); } PTextureAsset TextureLoader::getPlaceholderTexture() { return placeholderAsset; } @@ -111,13 +111,13 @@ void TextureLoader::import(TextureImportArgs args, PTextureAsset textureAsset) { ktxBasisParams basisParams = { .structSize = sizeof(ktxBasisParams), .uastc = true, - .threadCount = 14, - .compressionLevel = 3, - .uastcFlags = KTX_PACK_UASTC_LEVEL_FASTEST, + .threadCount = 1, + .compressionLevel = 2, + .uastcFlags = KTX_PACK_UASTC_LEVEL_FASTER, .uastcRDO = true, }; KTX_ASSERT(ktxTexture2_CompressBasisEx(kTexture, &basisParams)); - KTX_ASSERT(ktxTexture2_DeflateZstd(kTexture, 20)); + KTX_ASSERT(ktxTexture2_DeflateZstd(kTexture, 10)); char writer[100]; snprintf(writer, sizeof(writer), "%s version %s", "SeeleEngine", "0.0.1"); diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index c625a8b..bc5775d 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -124,10 +124,10 @@ int main() { .filePath = sourcePath / "import/models/rttest.glb", .importPath = "", }); - //AssetImporter::importMesh(MeshImportArgs{ - // .filePath = sourcePath / "import/models/main1_sponza/sponza.gltf", - // .importPath = "sponza", - //}); + AssetImporter::importMesh(MeshImportArgs{ + .filePath = sourcePath / "import/models/main1_sponza/sponza.gltf", + .importPath = "sponza", + }); // AssetImporter::importMesh(MeshImportArgs{ // .filePath = sourcePath / "import/models/town_hall.glb", // .importPath = "", diff --git a/src/Engine/Asset/TextureAsset.cpp b/src/Engine/Asset/TextureAsset.cpp index 182d6a4..c238606 100644 --- a/src/Engine/Asset/TextureAsset.cpp +++ b/src/Engine/Asset/TextureAsset.cpp @@ -31,8 +31,7 @@ void TextureAsset::load(ArchiveBuffer& buffer) { Serialization::load(buffer, ktxData); KTX_ASSERT( ktxTexture_CreateFromMemory(ktxData.data(), ktxData.size(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, (ktxTexture**)&ktxHandle)); - - ktxTexture2_TranscodeBasis(ktxHandle, KTX_TTF_BC7_RGBA, 0); + ktxTexture2_TranscodeBasis(ktxHandle, KTX_TTF_RGBA32, 0); Gfx::PGraphics graphics = buffer.getGraphics(); TextureCreateInfo createInfo = { diff --git a/src/Engine/Graphics/StaticMeshVertexData.cpp b/src/Engine/Graphics/StaticMeshVertexData.cpp index 6fc802a..60f39c3 100644 --- a/src/Engine/Graphics/StaticMeshVertexData.cpp +++ b/src/Engine/Graphics/StaticMeshVertexData.cpp @@ -41,11 +41,12 @@ void StaticMeshVertexData::loadTangents(uint64 offset, const Array& std::memcpy(tanData.data() + offset, data.data(), data.size() * sizeof(TangentType)); dirty = true; } -void StaticMeshVertexData::loadBitangents(uint64 offset, const Array& data) { + +/*void StaticMeshVertexData::loadBitangents(uint64 offset, const Array& data) { assert(offset + data.size() <= head); std::memcpy(bitData.data() + offset, data.data(), data.size() * sizeof(BiTangentType)); dirty = true; -} +}*/ void StaticMeshVertexData::loadColors(uint64 offset, const Array& data) { assert(offset + data.size() <= head); @@ -71,17 +72,17 @@ void StaticMeshVertexData::serializeMesh(MeshId id, ArchiveBuffer& buffer) { Array pos(numVertices); Array nor(numVertices); Array tan(numVertices); - Array bit(numVertices); + //Array bit(numVertices); Array col(numVertices); std::memcpy(pos.data(), posData.data() + offset, numVertices * sizeof(PositionType)); std::memcpy(nor.data(), norData.data() + offset, numVertices * sizeof(NormalType)); std::memcpy(tan.data(), tanData.data() + offset, numVertices * sizeof(TangentType)); - std::memcpy(bit.data(), bitData.data() + offset, numVertices * sizeof(BiTangentType)); + //std::memcpy(bit.data(), bitData.data() + offset, numVertices * sizeof(BiTangentType)); std::memcpy(col.data(), colData.data() + offset, numVertices * sizeof(ColorType)); Serialization::save(buffer, pos); Serialization::save(buffer, nor); Serialization::save(buffer, tan); - Serialization::save(buffer, bit); + //Serialization::save(buffer, bit); Serialization::save(buffer, col); } @@ -101,22 +102,22 @@ uint64 StaticMeshVertexData::deserializeMesh(MeshId id, ArchiveBuffer& buffer) { Array pos; Array nor; Array tan; - Array bit; + //Array bit; Array col; Serialization::load(buffer, pos); Serialization::load(buffer, nor); Serialization::load(buffer, tan); - Serialization::load(buffer, bit); + //Serialization::load(buffer, bit); Serialization::load(buffer, col); loadPositions(offset, pos); loadNormals(offset, nor); loadTangents(offset, tan); - loadBitangents(offset, bit); + //loadBitangents(offset, bit); loadColors(offset, col); result += pos.size() * sizeof(PositionType); result += nor.size() * sizeof(NormalType); result += tan.size() * sizeof(TangentType); - result += bit.size() * sizeof(BiTangentType); + //result += bit.size() * sizeof(BiTangentType); result += col.size() * sizeof(ColorType); return result; } @@ -136,10 +137,10 @@ void StaticMeshVertexData::init(Gfx::PGraphics _graphics) { .name = TANGENTS_NAME, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER, }); - descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{ + /*descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{ .name = BITANGENTS_NAME, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER, - }); + });*/ descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{ .name = COLORS_NAME, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER, @@ -161,7 +162,7 @@ void StaticMeshVertexData::destroy() { positions = nullptr; normals = nullptr; tangents = nullptr; - biTangents = nullptr; + //biTangents = nullptr; colors = nullptr; descriptorSet = nullptr; descriptorLayout = nullptr; @@ -179,7 +180,7 @@ void StaticMeshVertexData::resizeBuffers() { posData.resize(verticesAllocated); norData.resize(verticesAllocated); tanData.resize(verticesAllocated); - bitData.resize(verticesAllocated); + //bitData.resize(verticesAllocated); colData.resize(verticesAllocated); for (size_t i = 0; i < MAX_TEXCOORDS; ++i) { texData[i].resize(verticesAllocated); @@ -212,14 +213,14 @@ void StaticMeshVertexData::updateBuffers() { }, .name = "Tangents", }); - biTangents = graphics->createShaderBuffer(ShaderBufferCreateInfo{ + /*biTangents = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { .size = verticesAllocated * sizeof(BiTangentType), .data = (uint8*)bitData.data(), }, .name = "BiTangents", - }); + });*/ colors = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { @@ -243,7 +244,7 @@ void StaticMeshVertexData::updateBuffers() { descriptorSet->updateBuffer(POSITIONS_NAME, 0, positions); descriptorSet->updateBuffer(NORMALS_NAME, 0, normals); descriptorSet->updateBuffer(TANGENTS_NAME, 0, tangents); - descriptorSet->updateBuffer(BITANGENTS_NAME, 0, biTangents); + //descriptorSet->updateBuffer(BITANGENTS_NAME, 0, biTangents); descriptorSet->updateBuffer(COLORS_NAME, 0, colors); for (uint32 i = 0; i < MAX_TEXCOORDS; ++i) { descriptorSet->updateBuffer(TEXCOORDS_NAME, i, texCoords[i]); diff --git a/src/Engine/Graphics/StaticMeshVertexData.h b/src/Engine/Graphics/StaticMeshVertexData.h index 20d3815..ca6bdb9 100644 --- a/src/Engine/Graphics/StaticMeshVertexData.h +++ b/src/Engine/Graphics/StaticMeshVertexData.h @@ -10,8 +10,8 @@ class StaticMeshVertexData : public VertexData { public: using PositionType = Vector; using NormalType = Vector; - using TangentType = Vector; - using BiTangentType = Vector; + using TangentType = Vector4; + //using BiTangentType = Vector; using TexCoordType = U16Vector2; using ColorType = U16Vector; @@ -22,7 +22,7 @@ class StaticMeshVertexData : public VertexData { void loadTexCoords(uint64 offset, uint64 index, const Array& data); void loadNormals(uint64 offset, const Array& data); void loadTangents(uint64 offset, const Array& data); - void loadBitangents(uint64 offset, const Array& data); + //void loadBitangents(uint64 offset, const Array& data); void loadColors(uint64 offset, const Array& data); virtual void serializeMesh(MeshId id, ArchiveBuffer& buffer) override; virtual uint64 deserializeMesh(MeshId id, ArchiveBuffer& buffer) override; @@ -46,15 +46,15 @@ class StaticMeshVertexData : public VertexData { constexpr static const char* NORMALS_NAME = "normals"; Gfx::OShaderBuffer tangents; constexpr static const char* TANGENTS_NAME = "tangents"; - Gfx::OShaderBuffer biTangents; - constexpr static const char* BITANGENTS_NAME = "biTangents"; + //Gfx::OShaderBuffer biTangents; + //constexpr static const char* BITANGENTS_NAME = "biTangents"; Gfx::OShaderBuffer colors; constexpr static const char* COLORS_NAME = "colors"; Array posData; Array texData[MAX_TEXCOORDS]; Array norData; Array tanData; - Array bitData; + //Array bitData; Array colData; Gfx::ODescriptorLayout descriptorLayout; Gfx::PDescriptorSet descriptorSet; diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.cpp b/src/Engine/Graphics/Vulkan/PipelineCache.cpp index a2b6c03..80283eb 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/PipelineCache.cpp @@ -592,7 +592,8 @@ PRayTracingPipeline PipelineCache::createPipeline(Gfx::RayTracingPipelineCreateI }); } } - uint32 hash = CRC::Calculate(shaderStages.data(), sizeof(VkPipelineShaderStageCreateInfo) * shaderStages.size(), CRC::CRC_32()); + uint32 hash = CRC::Calculate(shaderStages.data(), sizeof(VkPipelineShaderStageCreateInfo) * shaderStages.size(), CRC::CRC_32(), + createInfo.pipelineLayout->getHash()); hash = CRC::Calculate(shaderGroups.data(), sizeof(VkRayTracingShaderGroupCreateInfoKHR) * shaderGroups.size(), CRC::CRC_32(), hash); if (rayTracingPipelines.contains(hash)) { return rayTracingPipelines[hash];