From f55a2a03d2c0263344ca2d93648c32306c37d3e0 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Tue, 16 Jul 2024 16:44:56 +0200 Subject: [PATCH] Trying to add opacity --- res/shaders/BasePass.slang | 2 +- res/shaders/lib/BRDF.slang | 25 +++++++++++++++++++ res/shaders/raytracing/ClosestHit.slang | 4 ++- res/shaders/raytracing/RayGen.slang | 1 + res/shaders/raytracing/RayTracingData.slang | 1 + src/Editor/Asset/MeshLoader.cpp | 26 +++++++++++--------- src/Engine/Graphics/Vulkan/PipelineCache.cpp | 2 +- 7 files changed, 47 insertions(+), 14 deletions(-) diff --git a/res/shaders/BasePass.slang b/res/shaders/BasePass.slang index e2c5c1b..ff02129 100644 --- a/res/shaders/BasePass.slang +++ b/res/shaders/BasePass.slang @@ -34,6 +34,6 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target // gamma correction result = result / (result + float3(1.0)); result = pow(result, float3(1.0/2.2)); - return float4(result, 1.0f); + return float4(result, brdf.getAlpha()); } \ No newline at end of file diff --git a/res/shaders/lib/BRDF.slang b/res/shaders/lib/BRDF.slang index 802a986..8f61d4e 100644 --- a/res/shaders/lib/BRDF.slang +++ b/res/shaders/lib/BRDF.slang @@ -4,11 +4,13 @@ interface IBRDF { float3 evaluate(float3 viewDir_TS, float3 lightDir_TS, float3 lightColor); float3 evaluateAmbient(); + float getAlpha(); }; struct Phong : IBRDF { float3 baseColor; + float alpha; float3 specular; float3 normal; float3 ambient; @@ -16,6 +18,7 @@ struct Phong : IBRDF __init() { + alpha = 1; normal = float3(0, 0, 1); } @@ -33,11 +36,16 @@ struct Phong : IBRDF { return ambient; } + float getAlpha() + { + return alpha; + } }; struct BlinnPhong : IBRDF { float3 baseColor; + float alpha; float3 specularColor; float3 normal; float shininess; @@ -45,6 +53,7 @@ struct BlinnPhong : IBRDF __init() { + alpha = 1; normal = float3(0, 0, 1); } @@ -62,15 +71,21 @@ struct BlinnPhong : IBRDF { return ambient; } + float getAlpha() + { + return alpha; + } }; struct CelShading : IBRDF { float3 baseColor; + float alpha; float3 normal; __init() { + alpha = 1; normal = float3(0, 0, 1); } @@ -94,12 +109,17 @@ struct CelShading : IBRDF { return float3(0, 0, 0); } + float getAlpha() + { + return alpha; + } }; // https://learnopengl.com/PBR/Theory struct CookTorrance : IBRDF { float3 baseColor; + float alpha; float3 normal; float roughness; float metallic; @@ -107,6 +127,7 @@ struct CookTorrance : IBRDF __init() { + alpha = 1; normal = float3(0, 0, 1); roughness = 0; metallic = 0; @@ -176,4 +197,8 @@ struct CookTorrance : IBRDF { return float3(0.03) * baseColor * ambientOcclusion; } + float getAlpha() + { + return alpha; + } }; diff --git a/res/shaders/raytracing/ClosestHit.slang b/res/shaders/raytracing/ClosestHit.slang index 1e2be54..d5e43c4 100644 --- a/res/shaders/raytracing/ClosestHit.slang +++ b/res/shaders/raytracing/ClosestHit.slang @@ -39,7 +39,7 @@ void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttribu LightingParameter lightingParams = params.getLightingParameter(); MaterialParameter materialParams = params.getMaterialParameter(); let brdf = Material.prepare(materialParams); - + float3 result = float3(0, 0, 0); for(int i = 0; i < pLightEnv.numDirectionalLights; ++i) { @@ -53,5 +53,7 @@ void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttribu // gamma correction result = result / (result + float3(1.0)); result = pow(result, float3(1.0/2.2)); + + hitValue.color = result; } \ No newline at end of file diff --git a/res/shaders/raytracing/RayGen.slang b/res/shaders/raytracing/RayGen.slang index 2c35812..214ed7d 100644 --- a/res/shaders/raytracing/RayGen.slang +++ b/res/shaders/raytracing/RayGen.slang @@ -19,6 +19,7 @@ void raygen() rayDesc.TMax = 10000.0; RayPayload payload; + payload.rayDirection = rayDesc.Direction; TraceRay(pRayTracingParams.scene, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); pRayTracingParams.image[int2(LaunchID.xy)] = float4(payload.color, 1.0); diff --git a/res/shaders/raytracing/RayTracingData.slang b/res/shaders/raytracing/RayTracingData.slang index 0ab91bb..03bfe0e 100644 --- a/res/shaders/raytracing/RayTracingData.slang +++ b/res/shaders/raytracing/RayTracingData.slang @@ -17,5 +17,6 @@ struct CallablePayload struct RayPayload { + float3 rayDirection; float3 color; }; \ No newline at end of file diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index 413330d..6c76f34 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -80,6 +80,7 @@ void MeshLoader::loadTextures(const aiScene* scene, const std::filesystem::path& } } +constexpr const char* KEY_BASE_COLOR = "k_b"; constexpr const char* KEY_DIFFUSE_COLOR = "k_d"; constexpr const char* KEY_SPECULAR_COLOR = "k_s"; constexpr const char* KEY_AMBIENT_COLOR = "k_a"; @@ -270,15 +271,24 @@ void MeshLoader::loadMaterials(const aiScene* scene, const Array& result = blendKey; }; - // Diffuse addVectorParameter(KEY_DIFFUSE_COLOR, AI_MATKEY_COLOR_DIFFUSE); - std::string outputDiffuse = KEY_DIFFUSE_COLOR; + std::string outputBase = KEY_BASE_COLOR; uint32 numDiffuseTextures = material->GetTextureCount(aiTextureType_DIFFUSE); for (uint32 i = 0; i < numDiffuseTextures; ++i) { - addTextureParameter(KEY_DIFFUSE_TEXTURE, aiTextureType_DIFFUSE, i, outputDiffuse); + addTextureParameter(KEY_DIFFUSE_TEXTURE, aiTextureType_DIFFUSE, i, outputBase, {0, 1, 2, 3}); } + std::string outputDiffuse = KEY_DIFFUSE_COLOR; + expressions.add(new SwizzleExpression({0, 1, 2, -1})); + expressions.back()->key = outputDiffuse; + expressions.back()->inputs["target"].source = outputBase; + + std::string outputAlpha = "alpha"; + expressions.add(new SwizzleExpression({-1, -1, -1, 0})); + expressions.back()->key = outputDiffuse; + expressions.back()->inputs["target"].source = outputBase; + // Specular addVectorParameter(KEY_SPECULAR_COLOR, AI_MATKEY_COLOR_SPECULAR); std::string outputSpecular = KEY_SPECULAR_COLOR; @@ -335,6 +345,7 @@ void MeshLoader::loadMaterials(const aiScene* scene, const Array& MaterialNode brdf; brdf.variables["baseColor"] = outputDiffuse; + brdf.variables["alpha"] = outputAlpha; if (!outputNormal.empty()) { expressions.add(new MulExpression()); expressions.back()->key = "NormalMul"; @@ -376,15 +387,8 @@ void MeshLoader::loadMaterials(const aiScene* scene, const Array& } break; }; - bool twoSided = true; - material->Get(AI_MATKEY_TWOSIDED, twoSided); - float opacity = 1.0f; - if (std::strcmp(material->GetName().C_Str(), "3td_Africa_Grass01") == 0) - { - opacity = 0.5f; - } OMaterialAsset baseMat = new MaterialAsset(importPath, materialName); - baseMat->material = new Material(graphics, numTextures, numSamplers, numFloats, twoSided, opacity, materialName, + baseMat->material = new Material(graphics, numTextures, numSamplers, numFloats, 1, 1, materialName, std::move(expressions), std::move(parameters), std::move(brdf)); baseMat->material->compile(); graphics->getShaderCompiler()->registerMaterial(baseMat->material); diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.cpp b/src/Engine/Graphics/Vulkan/PipelineCache.cpp index f1239cc..6bc70f3 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/PipelineCache.cpp @@ -602,7 +602,7 @@ PRayTracingPipeline PipelineCache::createPipeline(Gfx::RayTracingPipelineCreateI .pStages = shaderStages.data(), .groupCount = static_cast(shaderGroups.size()), .pGroups = shaderGroups.data(), - .maxPipelineRayRecursionDepth = 1, + .maxPipelineRayRecursionDepth = 12, .layout = createInfo.pipelineLayout.cast()->getHandle(), }; VkPipeline pipelineHandle;