소스 검색

make shadow work

Kolja Strohm 1 주 전
부모
커밋
17b9a08aa6

+ 8 - 8
FactoryCraft/ChunkClosestHit.hlsl

@@ -11,21 +11,21 @@ void ChunkClosestHit(inout HitInfo currentPayload, ChunkHitAttributes attrib)
     // shadow rays
     for (int i = 0; i < currentPayload.hitCount; i++)
     {
-        tmpPayload.color[0].rgb = unpackLight(currentPayload.dayLight[i]) * dayLightFactor;
-        /*tmpPayload.hitCount = -1; // shadow ray
+        tmpPayload.hitCount = -1; // shadow ray
         RayDesc ray;
-        ray.Origin = WorldRayOrigin() + (currentPayload.distance[i] - 0.0001) * WorldRayDirection();
-        ray.Direction = -dayLightDirection;
-        ray.TMin = 0.1;
+        ray.Origin = WorldRayOrigin() + (currentPayload.distance[i] - 0.001) * WorldRayDirection();
+        ray.Direction = dayLightDirection;
+        ray.TMin = 0.00001;
         ray.TMax = 1000;
         TraceRay(TLAS,
             0, 0xFF, 0,
            0, 0, ray, tmpPayload);
+        float3 color = unpackLight(currentPayload.dayLight[i]) * dayLightFactor;
         if (tmpPayload.hitCount == 0)
         {
-            tmpPayload.color[0].rgb = tmpPayload.color[0].rgb / 2;
-        }*/
-        currentPayload.dayLight[i] = packLight(tmpPayload.color[0].rgb);
+            color = color / 2;
+        }
+        currentPayload.dayLight[i] = packLight(color);
     }
     // TODO: reflection rays
 }

+ 4 - 4
FactoryCraft/Common.hlsl

@@ -9,10 +9,10 @@
 
 struct [raypayload] HitInfo
 {
-    float4 color[MAX_TRANSPACENT_HITS] : write(closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
-float distance[MAX_TRANSPACENT_HITS] : write(anyhit) : read(anyhit, closesthit);
-int dayLight[MAX_TRANSPACENT_HITS] : write(closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
-int dynamicLight[MAX_TRANSPACENT_HITS] : write(closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
+    float4 color[MAX_TRANSPACENT_HITS] : write(caller, closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
+float distance[MAX_TRANSPACENT_HITS] : write(caller, anyhit) : read(anyhit, closesthit);
+int dayLight[MAX_TRANSPACENT_HITS] : write(caller, closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
+int dynamicLight[MAX_TRANSPACENT_HITS] : write(caller, closesthit, anyhit, miss) : read(caller, anyhit, closesthit, miss);
 int hitCount : write(caller, anyhit, closesthit, miss) : read(caller, anyhit, closesthit, miss);
 };
 

+ 1 - 1
FactoryCraft/Constants.h

@@ -3,7 +3,7 @@
 #define CHUNK_SIZE   16
 #define WORLD_HEIGHT 500
 #ifdef _DEBUG
-#    define CHUNK_VISIBILITY_RANGE 1
+#    define CHUNK_VISIBILITY_RANGE 10
 #else
 #    define CHUNK_VISIBILITY_RANGE 20
 #endif

+ 9 - 35
FactoryCraft/CustomDX12API.cpp

@@ -49,11 +49,12 @@ void CustomDX12API::initializePipeline()
     { // add default shaders
         pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
             0, DX12_SHADER_REGISTER_S_SAMPLER, 0, 0, SAMPLER_DESCRIPTOR_HEAP);
-        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(2,
+        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
+            firstTextureHeapIndex,
             DX12_SHADER_REGISTER_T_SHADER_RESOURCE,
             0,
             1,
-            TEXTURE_DESCRIPTOR_HEAP,
+            GLOBAL_DESCRIPTOR_HEAP,
             1);
         globalLightBufferOffset
             = pipeline->zGlobalSignature()
@@ -62,16 +63,10 @@ void CustomDX12API::initializePipeline()
         globalTLASoffset = pipeline->zGlobalSignature()
                                ->addRegisterUsageLinkedToShaderBindingTable(
                                    DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
-        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(0,
-            DX12_SHADER_REGISTER_U_UNORDERED_ACCESS,
-            0,
-            0,
-            TEXTURE_DESCRIPTOR_HEAP);
-        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(1,
-            DX12_SHADER_REGISTER_U_UNORDERED_ACCESS,
-            1,
-            0,
-            TEXTURE_DESCRIPTOR_HEAP);
+        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
+            0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
+        pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
+            1, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
         globalRayGenerationSettingsOffset
             = pipeline->zGlobalSignature()
                   ->addRegisterUsageLinkedToShaderBindingTable(
@@ -81,12 +76,6 @@ void CustomDX12API::initializePipeline()
             CustomCustomRayGenShader, sizeof(CustomCustomRayGenShader));
         // RayGen from RayGen.hlsl
         DX12ShaderSignature* rayGenSignature = new DX12ShaderSignature();
-        // rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
-        //    0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
-        // rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
-        //    1, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
-        // rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
-        // 2, DX12_SHADER_REGISTER_B_CONST_BUFFER, 0);
         defaultRayGenerationShaderFunction = new DX12ShaderFunction(
             "RayGen", rayGenSignature, DX12_SHADER_FUNCTION_TYPE_RAY_GEN);
         rayGenShader->addFunction(defaultRayGenerationShaderFunction);
@@ -135,7 +124,7 @@ void CustomDX12API::initializePipeline()
         defaultHitGroup->setPayloadSize(28 * DEFAULT_MAX_TRANSPARENT_HITS + 4);
         defaultHitGroup->setAnyHitShaderFunction(anyHitFunction);
         defaultHitGroup->setClosestHitShaderFunction(closestHitFunction);
-        pipeline->addHitGroup(defaultHitGroup);
+        pipeline->addHitGroup(defaultHitGroup); 
 
         // Chunk ray traversal shaders
         DX12ShaderSignature* chunkHitSignature = new DX12ShaderSignature();
@@ -276,12 +265,6 @@ int CustomDX12API::fillGlobalShaderParams(
     directCommandQueue->zCommandList()->SetComputeRootConstantBufferView(
         *globalLightBufferOffset,
         lightInfoBuffer->zBuffer()->GetGPUVirtualAddress());
-    directCommandQueue->zCommandList()->SetComputeRootShaderResourceView(
-        *globalTLASoffset,
-        zTLAS->zResultBuffer()->zBuffer()->GetGPUVirtualAddress());
-    directCommandQueue->zCommandList()->SetComputeRootConstantBufferView(
-        *globalRayGenerationSettingsOffset,
-        rayGenSettingsBuffer->zBuffer()->GetGPUVirtualAddress());
     return result;
 }
 
@@ -290,7 +273,7 @@ void CustomDX12API::renderWorld(Framework::World3D* zWorld,
     DX12ShaderBindingTable* zSBT,
     int& objectIndex)
 {
-    Mat4<float> identity = Mat4<float>::identity();
+     Mat4<float> identity = Mat4<float>::identity();
     for (const Model3DCollection* collection : zWorld->getCollections())
     {
         const Dimension* dim = dynamic_cast<const Dimension*>(collection);
@@ -414,12 +397,3 @@ void CustomDX12API::renderWorld(Framework::World3D* zWorld,
     }
     DirectX12::renderWorld(zWorld, zTLAS, zSBT, objectIndex);
 }
-
-void CustomDX12API::initializeTextureDescriptorHeap()
-{
-    textureDescriptorHeap->addTextureInput(
-        DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, defaultRenderTarget);
-    textureDescriptorHeap->addTextureInput(
-        DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, uiTexture);
-    DirectX12::initializeTextureDescriptorHeap();
-}

+ 0 - 3
FactoryCraft/CustomDX12API.h

@@ -25,8 +25,6 @@ private:
     int* sbtSimpleBlocksVertexDataBufferOffset;
     int* sbtSimpleBlocksIndexOffsetBufferOffset;
     int* globalLightBufferOffset;
-    int* globalTLASoffset;
-    int* globalRayGenerationSettingsOffset;
     Framework::DX12ShaderHitGroup* chunkHitGroup;
     Framework::DX12ShaderHitGroup* simpleBlocksHitGroup;
     Framework::DX12Buffer* lightInfoBuffer;
@@ -51,5 +49,4 @@ public:
         Framework::DX12TLAS* zTLAS,
         Framework::DX12ShaderBindingTable* zSBT,
         int& objectIndex) override;
-    void initializeTextureDescriptorHeap() override;
 };

+ 13 - 9
FactoryCraft/CustomRayGen.hlsl

@@ -1,17 +1,22 @@
 #include "Common.hlsl"
 
+
 [shader("raygeneration")]
 void RayGen()
 {
-  // Initialize the ray payload
+    // Initialize the ray payload
     HitInfo rayPayload;
     rayPayload.hitCount = 0;
-    for (int i = 0; i < MAX_TRANSPACENT_HITS; i++)
+    rayPayload.color[0] = float4(0, 0, 0, 0);
+    rayPayload.color[1] = float4(0, 0, 0, 0);
+    rayPayload.color[2] = float4(0, 0, 0, 0);
+    rayPayload.color[3] = float4(0, 0, 0, 0);
+    rayPayload.color[4] = float4(0, 0, 0, 0);
+    for (int index = 0; index < MAX_TRANSPACENT_HITS; index++)
     {
-        rayPayload.color[i] = float4(0, 0, 0, 0.f);
-        rayPayload.dayLight[i] = 0;
-        rayPayload.dynamicLight[i] = 0;
-        rayPayload.distance[i] = 0;
+        rayPayload.distance[index] = 0.f;
+        rayPayload.dayLight[index] = 0;
+        rayPayload.dynamicLight[index] = 0;
     }
     float3 color = float3(0, 0, 0);
 
@@ -33,17 +38,16 @@ void RayGen()
         ray.TMax = maxDistance;
         TraceRay(TLAS, /*RayFlags*/0, /*InstanceInclusionMask*/0xFF, /*RayContributionToHitGroupIndex*/0,
             /*MultiplierForGeometryContributionToHitGroupIndex*/0, /*MissShaderIndex*/0, ray, rayPayload);
-        float dayLightFactor = 1.f; // TODO: set this based on time
         float3 minLight = float3(0.1f, 0.1f, 0.1f);
         float3 dayLight = unpackLight(rayPayload.dayLight[rayPayload.hitCount - 1]);
         float3 dynamicLight = unpackLight(rayPayload.dynamicLight[rayPayload.hitCount - 1]);
-        float3 light = max(minLight, max(dynamicLight, dayLight * dayLightFactor));
+        float3 light = max(minLight, max(dynamicLight, dayLight));
         color = rayPayload.color[rayPayload.hitCount - 1].rgb * light;
         for (int i = rayPayload.hitCount - 2; i >= 0; i--)
         {
             dayLight = unpackLight(rayPayload.dayLight[i]);
             dynamicLight = unpackLight(rayPayload.dynamicLight[i]);
-            light = max(minLight, max(dynamicLight, dayLight * dayLightFactor));
+            light = max(minLight, max(dynamicLight, dayLight));
             color = rayPayload.color[i].rgb * light * rayPayload.color[i].a + color * (1 - rayPayload.color[i].a);
         }
     }

+ 2 - 1
FactoryCraft/FactoryCraft.vcxproj

@@ -388,7 +388,8 @@ copy "..\..\..\..\..\Allgemein\Network\x64\Release\Network.dll" "network.dll"</C
       <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">6.8</ShaderModel>
       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
       </PreprocessorDefinitions>
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">COMPILE</PreprocessorDefinitions>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+      </PreprocessorDefinitions>
       <EntryPointName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
       </EntryPointName>
       <EntryPointName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">