From c70558d103d6cdd0fe84fc69ce30038cedde7814 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Tue, 15 Oct 2019 07:34:36 -0400 Subject: [PATCH 01/24] README update initial --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b0189d0..92f782c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 5 - DirectX Procedural Raytracing** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Taylor Nelms + * [LinkedIn](https://www.linkedin.com/in/taylor-k-7b2110191/), [twitter](https://twitter.com/nelms_taylor) +* Tested on: Windows 10, Intel i3 Coffee Lake 4-core 3.6GHz processor, 16GB RAM, NVidia GeForce GTX1650 4GB ### (TODO: Your README) From 12cb44840ee43f0916324c7aa0d546f0a668b461 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Tue, 15 Oct 2019 08:32:52 -0400 Subject: [PATCH 02/24] First attempt at not fucking up the code --- .../DXR-DynamicBuffers.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-DynamicBuffers.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-DynamicBuffers.cpp index e3ff63c..926756d 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-DynamicBuffers.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-DynamicBuffers.cpp @@ -111,7 +111,10 @@ void DXProceduralProject::CreateConstantBuffers() // structured buffers are for structs that have dynamic data (e.g lights in a scene, or AABBs in this case) void DXProceduralProject::CreateAABBPrimitiveAttributesBuffers() { + auto device = m_deviceResources->GetD3DDevice(); + auto num_objects = m_aabbs.size(); + m_aabbPrimitiveAttributeBuffer.Create(device, num_objects, 1, L"AABB Primitive Attribute Buffer"); } // LOOKAT-2.1: Update camera matrices stored in m_sceneCB. @@ -164,6 +167,11 @@ void DXProceduralProject::UpdateAABBPrimitiveAttributes(float animationTime) // You can infer what the bottom level AS space to local space transform should be. // The intersection shader tests in this project work with local space, but the geometries are provided in bottom level // AS space. So this data will be used to convert back and forth from these spaces. + auto transformMatrix = XMMatrixMultiply(mScale, mRotation); + transformMatrix = XMMatrixMultiply(transformMatrix, mTranslation); + auto invTransformMatrix = XMMatrixInverse(nullptr, transformMatrix); + m_aabbPrimitiveAttributeBuffer[primitiveIndex].localSpaceToBottomLevelAS = transformMatrix; + m_aabbPrimitiveAttributeBuffer[primitiveIndex].bottomLevelASToLocalSpace = invTransformMatrix; }; UINT offset = 0; From 6dbfdbcdce6b856284060d72cbb9ca8761155e13 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Wed, 16 Oct 2019 13:54:30 -0400 Subject: [PATCH 03/24] I think I got through 2.3 who knows though since I cannot debug --- .../DXR-HitGroup.cpp | 33 +++++++++++++++++-- .../DXR-RootSignature.cpp | 27 ++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp index 33899bd..7ed508f 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" + #include "stdafx.h" #include "DXProceduralProject.h" #include "CompiledShaders\Raytracing.hlsl.h" @@ -29,7 +29,28 @@ void DXProceduralProject::CreateHitGroupSubobjects(CD3D12_STATE_OBJECT_DESC* ray // TODO-2.3: AABB geometry hit groups. Very similar to triangles, except now you have to *also* loop over the primitive types. { + for (UINT rayType = 0; rayType < RayType::Count; rayType++) + { + for (UINT primitiveType = 0; primitiveType < IntersectionShaderType::Count; primitiveType++) { + auto hitGroup = raytracingPipeline->CreateSubobject(); + if (rayType == RayType::Radiance) + { + hitGroup->SetClosestHitShaderImport(c_closestHitShaderNames[GeometryType::AABB]); + // We import the closest hit shader name + if (primitiveType == IntersectionShaderType::AnalyticPrimitive) { + hitGroup->SetIntersectionShaderImport(c_intersectionShaderNames[IntersectionShaderType::AnalyticPrimitive]); + } + if (primitiveType == IntersectionShaderType::VolumetricPrimitive) { + hitGroup->SetIntersectionShaderImport(c_intersectionShaderNames[IntersectionShaderType::VolumetricPrimitive]); + } + + } + // We tell the hitgroup that it should export into the correct shader hit group name, with the correct type + hitGroup->SetHitGroupExport(c_hitGroupNames_AABBGeometry[primitiveType][rayType]); + hitGroup->SetHitGroupType(D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE); + } + } } } @@ -54,6 +75,14 @@ void DXProceduralProject::CreateLocalRootSignatureSubobjects(CD3D12_STATE_OBJECT // TODO-2.3: AABB geometry hitgroup/local root signature association. // Very similar to triangles, except now one for each primitive type. { - + auto localRootSignature = raytracingPipeline->CreateSubobject(); + localRootSignature->SetRootSignature(m_raytracingLocalRootSignature[LocalRootSignature::Type::AABB].Get()); + + auto rootSignatureAssociation = raytracingPipeline->CreateSubobject(); + rootSignatureAssociation->SetSubobjectToAssociate(*localRootSignature); + rootSignatureAssociation->AddExports(c_hitGroupNames_AABBGeometry[IntersectionShaderType::AnalyticPrimitive]); + rootSignatureAssociation->AddExports(c_hitGroupNames_AABBGeometry[IntersectionShaderType::VolumetricPrimitive]); + + } } \ No newline at end of file diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp index 2dff8b5..23e9d00 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp @@ -21,6 +21,7 @@ void DXProceduralProject::CreateRootSignatures() // TODO-2.2: In range index 1 (the second range), initialize 2 SRV resources at register 1: indices and vertices of triangle data. // This will effectively put the indices at register 1, and the vertices at register 2. + ranges[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 1); // TODO-2.2: Initialize all the parameters of the GlobalRootSignature in their appropriate slots. @@ -39,6 +40,23 @@ void DXProceduralProject::CreateRootSignatures() // t registers --> SRV // b registers --> CBV CD3DX12_ROOT_PARAMETER rootParameters[GlobalRootSignature::Slot::Count]; + /* OutputView = 0, + AccelerationStructure, + SceneConstant, + AABBattributeBuffer, + VertexBuffer, + Count BECAUSE *APPARENTLY* THIS IS HOW WE DOCUMENT THINGS + */ + //g_renderTarget : register(u0); + rootParameters[GlobalRootSignature::Slot::OutputView].InitAsDescriptorTable(1, &ranges[0]); + //g_indices : register(t1, space0);g_vertices : register(t2, space0); + rootParameters[GlobalRootSignature::Slot::VertexBuffers].InitAsDescriptorTable(2, &ranges[1]); + //g_scene : register(t0, space0) + rootParameters[GlobalRootSignature::Slot::AccelerationStructure].InitAsShaderResourceView(0); + //g_sceneCB : register(b0); + rootParameters[GlobalRootSignature::Slot::SceneConstant].InitAsConstantBufferView(0); + //g_AABBPrimitiveAttributes : register(t3, space0); + rootParameters[GlobalRootSignature::Slot::AABBattributeBuffer].InitAsShaderResourceView(3); // Finally, we bundle up all the descriptors you filled up and tell the device to create this global root signature! CD3DX12_ROOT_SIGNATURE_DESC globalRootSignatureDesc(ARRAYSIZE(rootParameters), rootParameters); @@ -67,7 +85,14 @@ void DXProceduralProject::CreateRootSignatures() // to register 1, this overlap is allowed since we are talking about *local* root signatures // --> the values they hold will depend on the shader function the local signature is bound to! { - + namespace RootSignatureSlots = LocalRootSignature::AABB::Slot; + CD3DX12_ROOT_PARAMETER rootParameters[RootSignatureSlots::Count]; + rootParameters[RootSignatureSlots::MaterialConstant].InitAsConstants(SizeOfInUint32(PrimitiveConstantBuffer), 1); + rootParameters[RootSignatureSlots::GeometryIndex].InitAsConstants(SizeOfInUint32(PrimitiveInstanceConstantBuffer), 2); + + CD3DX12_ROOT_SIGNATURE_DESC localRootSignatureDesc(ARRAYSIZE(rootParameters), rootParameters); + localRootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE; + SerializeAndCreateRaytracingRootSignature(localRootSignatureDesc, &m_raytracingLocalRootSignature[LocalRootSignature::Type::Triangle]); } } } From 05a7a3991a82a822e5eaee9021b01c7ea33aed28 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Wed, 16 Oct 2019 15:05:26 -0400 Subject: [PATCH 04/24] geometry todos through 2.5 --- .../DXR-Geometry.cpp | 36 +++++++++++++--- .../DXR-Pipeline.cpp | 2 + tools/testthefuckinggrid.py | 43 +++++++++++++++++++ 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 tools/testthefuckinggrid.py diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index 9d93504..c8de087 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -60,6 +60,7 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() auto device = m_deviceResources->GetD3DDevice(); // Set up AABBs on a grid. + // But fucking why though? It seems *super* arbitrary { // 9x3 slots = 9 slots. Note that one procedural geometry can take up multiple slots. // You could have a small sphere that takes up 1 slot, and another that is giant and takes up 4 slots. @@ -71,14 +72,14 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // The division by 2 centers the grid. The base position is still at the -x,-z corner. const XMFLOAT3 basePosition = { - -(aabbGrid.x * c_aabbWidth + (aabbGrid.x - 1) * c_aabbDistance) / 2.0f, - -(aabbGrid.y * c_aabbWidth + (aabbGrid.y - 1) * c_aabbDistance) / 2.0f, - -(aabbGrid.z * c_aabbWidth + (aabbGrid.z - 1) * c_aabbDistance) / 2.0f, + -(aabbGrid.x * c_aabbWidth + (aabbGrid.x - 1) * c_aabbDistance) / 2.0f,//-(6+4)/2=-5 + -(aabbGrid.y * c_aabbWidth + (aabbGrid.y - 1) * c_aabbDistance) / 2.0f,//-(2+0)/2=-1 + -(aabbGrid.z * c_aabbWidth + (aabbGrid.z - 1) * c_aabbDistance) / 2.0f,//-(6+4)/2=-5 }; // The stride is "how much to move" for the next slot. This is basically the size of a slot + it's separation from its direct // neighbor - XMFLOAT3 stride = XMFLOAT3(c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance); + XMFLOAT3 stride = XMFLOAT3(c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance);//(4, 4, 4) // TODO-2.5: Lookup the DXR API for the D3D12_RAYTRACING_AABB struct and fill up this lamda function that creates // and returns an D3D12_RAYTRACING_AABB for you. @@ -87,11 +88,27 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() auto InitializeAABB = [&](auto& offsetIndex, auto& size) { D3D12_RAYTRACING_AABB aabb{}; + //center coordinate for our (0, 0) index point + XMFLOAT3 baseCenter = { basePosition.x + c_aabbWidth / 2.0f, + basePosition.y + c_aabbWidth / 2.0f, + basePosition.z + c_aabbWidth / 2.0f}; + XMFLOAT3 myCenter = baseCenter;// + offsetIndex * stride + myCenter.x += offsetIndex.x * stride.x; + myCenter.y += offsetIndex.y * stride.y; + myCenter.x += offsetIndex.z * stride.z; + aabb.MaxX = myCenter.x + size.x / 2.0f; + aabb.MaxY = myCenter.y + size.y / 2.0f; + aabb.MaxZ = myCenter.z + size.z / 2.0f; + aabb.MinX = myCenter.x - size.x / 2.0f; + aabb.MinY = myCenter.y - size.y / 2.0f; + aabb.MinZ = myCenter.z - size.z / 2.0f; + return aabb; }; m_aabbs.resize(IntersectionShaderType::TotalPrimitiveCount); UINT offset = 0; + //THIS IS WHERE WE ARE HARDCODING SOME GEOMETRY BECAUSE WHY WOULDN'T WE I GUESS // Analytic primitives. { using namespace AnalyticPrimitive; @@ -110,12 +127,19 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // TODO-2.5: Allocate an upload buffer for this AABB data. // The base data lives in m_aabbs.data() (the stuff you filled in!), but the allocationg should be pointed // towards m_aabbBuffer.resource (the actual D3D12 resource that will hold all of our AABB data as a contiguous buffer). - + AllocateUploadBuffer(device, m_aabbs.data(), sizeof(m_aabbs.data()), &m_aabbBuffer.resource); + //AllocateUploadBuffer(device, vertices, sizeof(vertices), &m_vertexBuffer.resource); + + UINT descriptorIndexAB = CreateBufferSRV(&m_aabbBuffer, m_aabbs.size(), sizeof(m_aabbs[0])); + //UINT descriptorIndexIB = CreateBufferSRV(&m_indexBuffer, sizeof(indices) / 4, 0); + //UINT descriptorIndexVB = CreateBufferSRV(&m_vertexBuffer, ARRAYSIZE(vertices), sizeof(vertices[0])); + //ThrowIfFalse(descriptorIndexVB == descriptorIndexIB + 1, L"Vertex Buffer descriptor index must follow that of Index Buffer descriptor index"); } } // TODO-2.5: Build geometry used in the project. As easy as calling both functions above :) void DXProceduralProject::BuildGeometry() { - + BuildPlaneGeometry(); + BuildProceduralGeometryAABBs(); } \ No newline at end of file diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp index c9501ac..ba0c985 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp @@ -19,6 +19,7 @@ void DXProceduralProject::CreateRaytracingPipelineStateObject() // DXIL library CreateDxilLibrarySubobject(&raytracingPipeline); + // TODO: figure out why these instructions are telling me to do something they already did // TODO-2.4: Hit groups. Call the function you filled in in DXR-HitGroup.cpp. CreateHitGroupSubobjects(&raytracingPipeline); @@ -28,6 +29,7 @@ void DXProceduralProject::CreateRaytracingPipelineStateObject() UINT attributeSize = sizeof(struct ProceduralPrimitiveAttributes); shaderConfig->Config(payloadSize, attributeSize); + // TODO: figure out why these instructions are telling me to do something they already did // TODO-2.4: Local root signature and shader association. Call the other function you did in in DXR-HitGroup.cpp. CreateLocalRootSignatureSubobjects(&raytracingPipeline); diff --git a/tools/testthefuckinggrid.py b/tools/testthefuckinggrid.py new file mode 100644 index 0000000..8a6aa0b --- /dev/null +++ b/tools/testthefuckinggrid.py @@ -0,0 +1,43 @@ +import sys + + +c_aabbWidth = 2 +c_aabbDistance = 2 + +aabbGrid = [3, 1, 3] + +def getBasePosition(): + result = (\ + -(aabbGrid[0] * c_aabbWidth + (aabbGrid[0] - 1) * c_aabbDistance) / 2.0, + -(aabbGrid[1] * c_aabbWidth + (aabbGrid[1] - 1) * c_aabbDistance) / 2.0, + -(aabbGrid[2] * c_aabbWidth + (aabbGrid[2] - 1) * c_aabbDistance) / 2.0) + return result + +def centerForCoord(xcoord, ycoord, zcoord, basePos): + cx = basePos[0] + xcoord * (c_aabbWidth + c_aabbDistance) + c_aabbWidth / 2.0 + cy = basePos[1] + ycoord * (c_aabbWidth + c_aabbDistance) + c_aabbWidth / 2.0 + cz = basePos[2] + zcoord * (c_aabbWidth + c_aabbDistance) + c_aabbWidth / 2.0 + + return (cx, cy, cz) + +def getCenters(): + result = [] + basePos = getBasePosition() + for i in range(aabbGrid[0]): + for j in range(aabbGrid[1]): + for k in range(aabbGrid[2]): + result.append(centerForCoord(i, j, k, basePos)) + + + return result + + + +def main(): + print("Base position:") + print(getBasePosition()) + print("Centers:") + print(getCenters()) + +if __name__ == "__main__": + main() From 1601303bf184ef5d256a78caec20512511e540ce Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Thu, 17 Oct 2019 07:19:29 -0400 Subject: [PATCH 05/24] some progress on acceleration structures --- .../DXR-AccelerationStructure.cpp | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index 084077a..ec00402 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -5,7 +5,7 @@ using namespace std; using namespace DX; -// LOOKAT-2.6, TODO-2.6: Build geometry descs for the bottom-level AS for the plane and for the procedural geometries in the scene. +// LOOKAT-2.6, TDO-2.6: Build geometry descs for the bottom-level AS for the plane and for the procedural geometries in the scene. // A bottom-level AS is a unique (or multiple) piece(s) of geometry, each for each type of object in your scene. // Example: if you had 2 boxes in your scene, then you would make 1 bottom level AS for 1 box // and then 2 different instances. @@ -25,13 +25,23 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetGPUVirtualAddress()) // The number of elements of a D3D12 resource can be accessed from GetDesc().Width (e.g m_indexBuffer.resource->GetDesc().Width) auto& geometryDesc = geometryDescs[BottomLevelASType::Triangle][0]; geometryDesc = {}; - + + geometryDesc.Flags = geometryFlags; + geometryDesc.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES; + geometryDesc.Triangles.IndexBuffer = m_indexBuffer.resource->GetGPUVirtualAddress(); + geometryDesc.Triangles.IndexCount = m_indexBuffer.resource->GetDesc().Width; + geometryDesc.Triangles.IndexFormat = m_indexBuffer.resource->GetDesc().Format; + + m_vertexBuffer.cpuDescriptorHandle; + geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 3 * sizeof(float) };//TODO: this is probably wrong so fix it + geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width; + geometryDesc.Triangles.VertexFormat = m_vertexBuffer.resource->GetDesc().Format; } { @@ -43,8 +53,14 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetGPUVirtualAddress() + + intersectionType * geometryDesc.AABBs.AABBs.StrideInBytes; + } + // TDO-2.6: Fill the AABB geometry desc for every procedural geometry. LOOK AT THIS BECAUSE I DEFINITELY MESSED IT UP - // TODO-2.6: Fill the AABB geometry desc for every procedural geometry. // Look-up what a D3D12_RAYTRACING_GEOMETRY_AABBS_DESC structs needs to be filled in correctly. // Remember to use m_aabbBuffer to get the AABB geometry data you previously filled in. // Note: Having separate geometries allows of separate shader record binding per geometry. @@ -53,7 +69,7 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(array& geometryDescs, D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS buildFlags) { auto device = m_deviceResources->GetD3DDevice(); @@ -66,8 +82,14 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto // The bottom-level inputs are the geometries you build in BuildGeometryDescsForBottomLevelAS() // Again, these tell the AS where the actual geometry data is and how it is laid out. - // TODO-2.6: fill the bottom-level inputs. Consider using D3D12_ELEMENTS_LAYOUT_ARRAY as the DescsLayout. + // TDO-2.6: fill the bottom-level inputs. Consider using D3D12_ELEMENTS_LAYOUT_ARRAY as the DescsLayout. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS &bottomLevelInputs = bottomLevelBuildDesc.Inputs; + bottomLevelInputs.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL; + bottomLevelInputs.Flags = buildFlags; + bottomLevelInputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY; + bottomLevelInputs.NumDescs = geometryDescs.size(); + bottomLevelInputs.pGeometryDescs = geometryDescs.data(); + // Query the driver for resource requirements to build an acceleration structure. We've done this for you. @@ -105,9 +127,11 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto AllocateUAVBuffer(device, bottomLevelPrebuildInfo.ResultDataMaxSizeInBytes, &bottomLevelAS, initialResourceState, L"BottomLevelAccelerationStructure"); } - // TODO-2.6: Now that you have the scratch and actual bottom-level AS desc, pass their GPU addresses to the bottomLevelBuildDesc. + // TDO-2.6: Now that you have the scratch and actual bottom-level AS desc, pass their GPU addresses to the bottomLevelBuildDesc. // Consider reading about D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC. // This should be as easy as passing the GPU addresses to the struct using GetGPUVirtualAddress() calls. + bottomLevelBuildDesc.ScratchAccelerationStructureData = scratch->GetGPUVirtualAddress(); + bottomLevelBuildDesc.DestAccelerationStructureData = bottomLevelAS->GetGPUVirtualAddress(); // Fill up the command list with a command that tells the GPU how to build the bottom-level AS. @@ -123,11 +147,16 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto m_dxrCommandList->BuildRaytracingAccelerationStructure(&bottomLevelBuildDesc, 0, nullptr); } - // TODO-2.6: After we finished building the bottom-level AS, save all the info in + // TDO-2.6: After we finished building the bottom-level AS, save all the info in // the AccelerationStructureBuffers struct so the top-level AS can use it! // Don't forget that this is the return value. // Consider looking into the AccelerationStructureBuffers struct in DXR-Structs.h - return AccelerationStructureBuffers{}; + return AccelerationStructureBuffers{ + scratch, + bottomLevelAS, + nullptr,//"used only for top-level AS" + bottomLevelPrebuildInfo.ResultDataMaxSizeInBytes + };//retval } // TODO-2.6: Build the instance descriptor for each bottom-level AS you built before. @@ -179,7 +208,15 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev // Where do you think procedural shader records would start then? Hint: right after. // * Make each instance hover above the ground by ~ half its width { - + //for the sake of typing not being garbage, this is a D3D12_RAYTRACING_INSTANCE_DESC + auto& instanceDesc = instanceDescs[BottomLevelASType::AABB]; + instanceDesc = {}; + instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::AABB]; + //TODO + //TODO + //TODO: pick up here + + } // Upload all these instances to the GPU, and make sure the resouce is set to instanceDescsResource. From d692ddf281f500eba7944bb501568f9affdac6ac Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Thu, 17 Oct 2019 07:26:44 -0400 Subject: [PATCH 06/24] fixed the damn numbering a hair --- INSTRUCTIONS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index b5d2924..676ee8f 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -222,7 +222,8 @@ In DXR, building the Acceleration Structure requires multiple steps: * The geometry descriptors you built will be passed in as acceleration structure inputs * You then query the *pre-build* info for these bottom-level AS. This will output 2 things: scratch size, and result data max size. Scratch size is like extra memory the driver needs to build the AS, and result data max is an upper bound for the size of the AS. You need to allocate 2 buffers for both of these. * Finally, you tell the command list that you want to build the acceleration structure using the scratch and result data allocated. -3. Create a function that builds **instances** of your BLAS. An instance of a BLAS is basically a BLAS but with a specific world-space transform. If you were to spawn multiple boxes in your scene, you would not create multiple box BLAS - you would create only one, but 4. Build the top-level acceleration structure. This is very similar to step (2) except now your inputs to the AS is the bottom-level AS. You will need to additionally call the function you created in step (3) to describe the instances that will be held by your TLAS. +3. Create a function that builds **instances** of your BLAS. An instance of a BLAS is basically a BLAS but with a specific world-space transform. If you were to spawn multiple boxes in your scene, you would not create multiple box BLAS - you would create only one, but +4. Build the top-level acceleration structure. This is very similar to step (2) except now your inputs to the AS is the bottom-level AS. You will need to additionally call the function you created in step (3) to describe the instances that will be held by your TLAS. Files to checkout: * DXR-AccelerationStructure.cpp From cdd09493e1c824eb170434cec6af0781bc8b8264 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Thu, 17 Oct 2019 08:22:51 -0400 Subject: [PATCH 07/24] acceleration structures progress I guess --- .../DXR-AccelerationStructure.cpp | 78 +++++++++++++------ 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index ec00402..9a4d4c4 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -154,7 +154,7 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto return AccelerationStructureBuffers{ scratch, bottomLevelAS, - nullptr,//"used only for top-level AS" + nullptr,//"used only for top-level AS" SHOULD THIS BE NULL? bottomLevelPrebuildInfo.ResultDataMaxSizeInBytes };//retval } @@ -171,6 +171,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev vector instanceDescs; instanceDescs.resize(NUM_BLAS); + int hitGroupIndexOffset = 0; // Bottom-level AS for the plane instance. { @@ -185,9 +186,11 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev auto& instanceDesc = instanceDescs[BottomLevelASType::Triangle]; instanceDesc = {}; instanceDesc.InstanceMask = 1; - instanceDesc.InstanceContributionToHitGroupIndex = 0; + instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::Triangle]; + hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); + // Calculate transformation matrix. // We multiply the width by -0.5 in the x,z plane because we want the middle of the plane // (which is currently expanded in the positive x,z plane) to be centered. @@ -202,7 +205,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev XMStoreFloat3x4(reinterpret_cast(instanceDesc.Transform), mTransform); } - // TODO-2.6: Create instanced bottom-level AS with procedural geometry AABBs. + // TDO-2.6: Create instanced bottom-level AS with procedural geometry AABBs. // * Make sure to set InstanceContributionToHitGroupIndex to beyond the shader records for the triangle AABB. // For triangles, we have 1 shader record for radiance rays, and another for shadow rays. // Where do you think procedural shader records would start then? Hint: right after. @@ -211,10 +214,17 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev //for the sake of typing not being garbage, this is a D3D12_RAYTRACING_INSTANCE_DESC auto& instanceDesc = instanceDescs[BottomLevelASType::AABB]; instanceDesc = {}; + instanceDesc.InstanceMask = 1;//who knows?? + instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::AABB]; - //TODO - //TODO - //TODO: pick up here + + //make translation matrix, out of wishes and pretend + XMMATRIX mScale = XMMatrixScaling(c_aabbWidth, c_aabbWidth, c_aabbWidth); + XMMATRIX mTranslation = XMMatrixTranslation(0, c_aabbWidth * 0.5f, 0); + XMMATRIX mTransform = mScale * mTranslation; + + // Store the transform in the instanceDesc. + XMStoreFloat3x4(reinterpret_cast(instanceDesc.Transform), mTransform); } @@ -224,7 +234,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev AllocateUploadBuffer(device, instanceDescs.data(), bufferSize, &(*instanceDescsResource), L"InstanceDescs"); }; -// TODO-2.6: Build the top-level acceleration structure. +// TDO-2.6: Build the top-level acceleration structure. // The top-level acceleration structure is a set of bottom-level *instances*. It is basically = scene. // This should be very similar to BuildBottomLevelAS() except now we have to add in the instances! AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationStructureBuffers bottomLevelAS[BottomLevelASType::Count], D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS buildFlags) @@ -236,9 +246,13 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC topLevelBuildDesc = {}; - // TODO-2.6: fill in the topLevelInputs, read about D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS. + // TDO-2.6: fill in the topLevelInputs, read about D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS. // Consider using D3D12_ELEMENTS_LAYOUT_ARRAY as a DescsLayout since we are using an array of bottom-level AS. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS &topLevelInputs = topLevelBuildDesc.Inputs; + topLevelInputs.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL; + topLevelInputs.Flags = buildFlags; + topLevelInputs.NumDescs = 2;//triangles, aabb + topLevelInputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY; D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO topLevelPrebuildInfo = {}; @@ -252,8 +266,8 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt } ThrowIfFalse(topLevelPrebuildInfo.ResultDataMaxSizeInBytes > 0); - // TODO-2.6: Allocate a UAV buffer for the scracth/temporary top-level AS data. - + // TDO-2.6: Allocate a UAV buffer for the scracth/temporary top-level AS data. + AllocateUAVBuffer(device, topLevelPrebuildInfo.ScratchDataSizeInBytes, &scratch, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, L"ScratchResource"); // Allocate space for the top-level AS. { @@ -267,8 +281,8 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt initialResourceState = D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE; } - // TODO-2.6: Allocate a UAV buffer for the actual top-level AS. - + // TDO-2.6: Allocate a UAV buffer for the actual top-level AS. + AllocateUAVBuffer(device, topLevelPrebuildInfo.ResultDataMaxSizeInBytes, &topLevelAS, initialResourceState, L"TopLevelAccelerationStructure"); } // Note on Emulated GPU pointers (AKA Wrapped pointers) requirement in Fallback Layer: @@ -295,8 +309,10 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt CreateFallbackWrappedPointer(bottomLevelAS[1].accelerationStructure.Get(), static_cast(bottomLevelAS[1].ResultDataMaxSizeInBytes) / sizeof(UINT32)) }; - // TODO-2.6: Call the fallback-templated version of BuildBottomLevelASInstanceDescs() you completed above. - + // TDO-2.6: Call the fallback-templated version of BuildBottomLevelASInstanceDescs() you completed above. + BuildBottomLevelASInstanceDescs< D3D12_RAYTRACING_FALLBACK_INSTANCE_DESC, WRAPPED_GPU_POINTER> + (bottomLevelASaddresses, &instanceDescsResource); + } else // DirectX Raytracing { @@ -307,7 +323,9 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt bottomLevelAS[1].accelerationStructure->GetGPUVirtualAddress() }; - // TODO-2.6: Call the DXR-templated version of BuildBottomLevelASInstanceDescs() you completed above. + BuildBottomLevelASInstanceDescs< D3D12_RAYTRACING_INSTANCE_DESC, D3D12_GPU_VIRTUAL_ADDRESS> + (bottomLevelASaddresses, &instanceDescsResource); + // TDO-2.6: Call the DXR-templated version of BuildBottomLevelASInstanceDescs() you completed above. } @@ -318,9 +336,11 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt m_fallbackTopLevelAccelerationStructurePointer = CreateFallbackWrappedPointer(topLevelAS.Get(), numBufferElements); } - // TODO-2.6: fill in the topLevelBuildDesc. Read about D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC. + // TDO-2.6: fill in the topLevelBuildDesc. Read about D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC. // This should be as easy as passing the GPU addresses to the struct using GetGPUVirtualAddress() calls. - + topLevelInputs.InstanceDescs = instanceDescsResource->GetGPUVirtualAddress(); + topLevelBuildDesc.DestAccelerationStructureData = topLevelAS->GetGPUVirtualAddress(); + topLevelBuildDesc.ScratchAccelerationStructureData = scratch->GetGPUVirtualAddress(); // Build acceleration structure. if (m_raytracingAPI == RaytracingAPI::FallbackLayer) @@ -339,7 +359,11 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt // Very similar to how you did this in BuildBottomLevelAS() except now you have to worry about topLevelASBuffers.instanceDesc. // Consider looking into the AccelerationStructureBuffers struct in DXR-Structs.h. // Make sure to return the topLevelASBuffers before you exit the function. - return AccelerationStructureBuffers{}; + return AccelerationStructureBuffers{ + scratch, + topLevelAS, + nullptr,//TODO: find the fucking instance desc + topLevelPrebuildInfo.ResultDataMaxSizeInBytes }; } // TODO-2.6: This will wrap building the Acceleration Structure! This is what we will call when building our scene. @@ -349,17 +373,22 @@ void DXProceduralProject::BuildAccelerationStructures() auto commandList = m_deviceResources->GetCommandList(); auto commandQueue = m_deviceResources->GetCommandQueue(); auto commandAllocator = m_deviceResources->GetCommandAllocator(); + auto buildFlags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;//WHO KNOWS? // Reset the command list for the acceleration structure construction. commandList->Reset(commandAllocator, nullptr); - // TODO-2.6: Build the geometry descriptors. Hint: you filled in a function that does this. + // TDO-2.6: Build the geometry descriptors. Hint: you filled in a function that does this. array, BottomLevelASType::Count> geometryDescs; + BuildGeometryDescsForBottomLevelAS(geometryDescs); - // TODO-2.6: For each bottom-level object (triangle, procedural), build a bottom-level AS. + // TDO-2.6: For each bottom-level object (triangle, procedural), build a bottom-level AS. // Hint: you filled in a function that does this. AccelerationStructureBuffers bottomLevelAS[BottomLevelASType::Count]; + for (int bottomLevelASType = 0; bottomLevelASType < BottomLevelASType::Count; bottomLevelASType++) { + bottomLevelAS[bottomLevelASType] = BuildBottomLevelAS(geometryDescs[bottomLevelASType], buildFlags); + } // Batch all resource barriers for bottom-level AS builds. @@ -371,8 +400,9 @@ void DXProceduralProject::BuildAccelerationStructures() } commandList->ResourceBarrier(BottomLevelASType::Count, resourceBarriers); - // TODO-2.6: Build top-level AS. Hint, you already made a function that does this. + // TDO-2.6: Build top-level AS. Hint, you already made a function that does this. AccelerationStructureBuffers topLevelAS; + topLevelAS = BuildTopLevelAS(bottomLevelAS, buildFlags); // Kick off acceleration structure construction. @@ -381,8 +411,12 @@ void DXProceduralProject::BuildAccelerationStructures() // Wait for GPU to finish as the locally created temporary GPU resources will get released once we go out of scope. m_deviceResources->WaitForGpu(); - // TODO-2.6: Store the AS buffers. The rest of the buffers will be released once we exit the function. + // TDO-2.6: Store the AS buffers. The rest of the buffers will be released once we exit the function. // Do this for both the bottom-level and the top-level AS. Consider re-reading the DXProceduralProject class // to find what member variables should be set. + for (int bottomLevelASType = 0; bottomLevelASType < BottomLevelASType::Count; bottomLevelASType++) { + m_bottomLevelAS[bottomLevelASType] = bottomLevelAS[bottomLevelASType].accelerationStructure; + } + m_topLevelAS = topLevelAS.accelerationStructure; } \ No newline at end of file From 4d5ea426314a49048874f32aaffe80d8e39f2681 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Thu, 17 Oct 2019 17:16:31 -0400 Subject: [PATCH 08/24] Fixed one bug, so close to CPU section working --- .../DXR-AccelerationStructure.cpp | 26 +++++++++++--- .../DXR-DoRaytracing.cpp | 31 ++++++++++------ .../DXR-Geometry.cpp | 8 ++--- .../DXR-HitGroup.cpp | 16 +++------ .../DXR-Pipeline.cpp | 7 ++-- .../DXR-RootSignature.cpp | 13 ++----- .../DXR-ShaderTable.cpp | 36 ++++++++++++++----- .../Main.cpp | 2 +- 8 files changed, 87 insertions(+), 52 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index 9a4d4c4..2757aa0 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -39,7 +39,7 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetDesc().Format; m_vertexBuffer.cpuDescriptorHandle; - geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 3 * sizeof(float) };//TODO: this is probably wrong so fix it + geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 2 * sizeof(XMFLOAT3) };//TODO: this is probably wrong so fix it? pos, normal geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width; geometryDesc.Triangles.VertexFormat = m_vertexBuffer.resource->GetDesc().Format; } @@ -159,7 +159,7 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto };//retval } -// TODO-2.6: Build the instance descriptor for each bottom-level AS you built before. +// TDO-2.6: Build the instance descriptor for each bottom-level AS you built before. // An instance descriptor will contain information on how these bottom-level ASes will be instanciated in the scene. // Among other things, we will pass the world transformation matrix in the instance descriptor. // InstanceDescType will either be D3D12_RAYTRACING_INSTANCE_DESC for real DXR or D3D12_RAYTRACING_FALLBACK_INSTANCE_DESC for fallback layer. @@ -355,18 +355,36 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt m_dxrCommandList->BuildRaytracingAccelerationStructure(&topLevelBuildDesc, 0, nullptr); } + + // TODO-2.6: After we finished building the top-level AS, save all the info in the AccelerationStructureBuffers struct. // Very similar to how you did this in BuildBottomLevelAS() except now you have to worry about topLevelASBuffers.instanceDesc. // Consider looking into the AccelerationStructureBuffers struct in DXR-Structs.h. // Make sure to return the topLevelASBuffers before you exit the function. + D3D12_RAYTRACING_INSTANCE_DESC topLevelInstanceDesc; + topLevelInstanceDesc.AccelerationStructure = topLevelAS->GetGPUVirtualAddress(); + topLevelInstanceDesc.Flags = 0;//WHO KNOWS + topLevelInstanceDesc.InstanceID = 0;//WHO KNOWS + topLevelInstanceDesc.InstanceContributionToHitGroupIndex = 0;//WHO KNOWS + XMMATRIX mScale = XMMatrixScaling(1, 1, 1); + XMMATRIX mTranslation = XMMatrixTranslation(0, 0, 0); + XMMATRIX mTransform = mScale * mTranslation; + + // Store the transform in the instanceDesc. + XMStoreFloat3x4(reinterpret_cast(topLevelInstanceDesc.Transform), mTransform); + + ComPtr topLevelInstanceDescPtr; + AllocateUploadBuffer(device, &topLevelInstanceDesc, sizeof(D3D12_RAYTRACING_INSTANCE_DESC), &(topLevelInstanceDescPtr), L"TopLevelInstanceDesc"); + + return AccelerationStructureBuffers{ scratch, topLevelAS, - nullptr,//TODO: find the fucking instance desc + topLevelInstanceDescPtr,//TODO: figure out if my garbage instance desc is the right one topLevelPrebuildInfo.ResultDataMaxSizeInBytes }; } -// TODO-2.6: This will wrap building the Acceleration Structure! This is what we will call when building our scene. +// TDO-2.6: This will wrap building the Acceleration Structure! This is what we will call when building our scene. void DXProceduralProject::BuildAccelerationStructures() { auto device = m_deviceResources->GetD3DDevice(); diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp index 03a8c58..bf3b099 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp @@ -21,8 +21,10 @@ void DXProceduralProject::DoRaytracing() m_sceneCB.CopyStagingToGpu(frameIndex); commandList->SetComputeRootConstantBufferView(GlobalRootSignature::Slot::SceneConstant, m_sceneCB.GpuVirtualAddress(frameIndex)); - // TODO-2.8: do a very similar operation for the m_aabbPrimitiveAttributeBuffer - + // TDO-2.8: do a very similar operation for the m_aabbPrimitiveAttributeBuffer + m_aabbPrimitiveAttributeBuffer.CopyStagingToGpu(frameIndex); + commandList->SetComputeRootShaderResourceView(GlobalRootSignature::Slot::AABBattributeBuffer, m_aabbPrimitiveAttributeBuffer.GpuVirtualAddress(frameIndex)); + //TODO: should the above be a structured buffer of some sort? // Bind the descriptor heaps. if (m_raytracingAPI == RaytracingAPI::FallbackLayer) @@ -45,27 +47,36 @@ void DXProceduralProject::DoRaytracing() commandList->SetComputeRootShaderResourceView(GlobalRootSignature::Slot::AccelerationStructure, m_topLevelAS->GetGPUVirtualAddress()); } - // TODO-2.8: Bind the Index/Vertex buffer (basically m_indexBuffer. Think about why this isn't m_vertexBuffer too. Hint: CreateRootSignatures() in DXR-Pipeline.cpp.) + // TDO-2.8: Bind the Index/Vertex buffer (basically m_indexBuffer. Think about why this isn't m_vertexBuffer too. Hint: CreateRootSignatures() in DXR-Pipeline.cpp.) // This should be done by telling the commandList to SetComputeRoot*(). You just have to figure out what * is. // Example: in the case of GlobalRootSignature::Slot::SceneConstant above, we used SetComputeRootConstantBufferView() // Hint: look at CreateRootSignatures() in DXR-Pipeline.cpp. + commandList->SetComputeRootDescriptorTable(GlobalRootSignature::Slot::VertexBuffers, m_indexBuffer.gpuDescriptorHandle); - // TODO-2.8: Bind the OutputView (basically m_raytracingOutputResourceUAVGpuDescriptor). Very similar to the Index/Vertex buffer. - + // TDO-2.8: Bind the OutputView (basically m_raytracingOutputResourceUAVGpuDescriptor). Very similar to the Index/Vertex buffer. + commandList->SetComputeRootDescriptorTable(GlobalRootSignature::Slot::OutputView, m_raytracingOutputResourceUAVGpuDescriptor); // This will define a `DispatchRays` function that takes in a command list, a pipeline state, and a descriptor // This will set the hooks using the shader tables built before and call DispatchRays on the command list auto DispatchRays = [&](auto* raytracingCommandList, auto* stateObject, auto* dispatchDesc) { // You will fill in a D3D12_DISPATCH_RAYS_DESC (which is dispatchDesc). - // TODO-2.8: fill in dispatchDesc->HitGroupTable. Look up the struct D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE - - - // TODO-2.8: now fill in dispatchDesc->MissShaderTable + // TDO-2.8: fill in dispatchDesc->HitGroupTable. Look up the struct D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE + //dispatchDesc->HitGroupTable = { m_hitGroupShaderTable->GetGPUVirtualAddress(), m_hitGroupShaderTableStrideInBytes }; + dispatchDesc->HitGroupTable = { m_hitGroupShaderTable->GetGPUVirtualAddress(), + m_hitGroupShaderTable->GetDesc().Width, + m_hitGroupShaderTableStrideInBytes}; + + // TDO-2.8: now fill in dispatchDesc->MissShaderTable + dispatchDesc->MissShaderTable = { m_missShaderTable->GetGPUVirtualAddress(), + m_missShaderTable->GetDesc().Width, + m_missShaderTableStrideInBytes }; - // TODO-2.8: now fill in dispatchDesc->RayGenerationShaderRecord + // TDO-2.8: now fill in dispatchDesc->RayGenerationShaderRecord + dispatchDesc->RayGenerationShaderRecord = { m_rayGenShaderTable->GetGPUVirtualAddress(), + m_rayGenShaderTable->GetDesc().Width }; // We do this for you. This will define how many threads will be dispatched. Basically like a blockDims in CUDA! diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index c8de087..8e90664 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -54,7 +54,7 @@ void DXProceduralProject::BuildPlaneGeometry() ThrowIfFalse(descriptorIndexVB == descriptorIndexIB + 1, L"Vertex Buffer descriptor index must follow that of Index Buffer descriptor index"); } -// TODO-2.5: Build AABBs for procedural geometry that will be used within the acceleration structure. +// TDO-2.5: Build AABBs for procedural geometry that will be used within the acceleration structure. void DXProceduralProject::BuildProceduralGeometryAABBs() { auto device = m_deviceResources->GetD3DDevice(); @@ -81,7 +81,7 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // neighbor XMFLOAT3 stride = XMFLOAT3(c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance, c_aabbWidth + c_aabbDistance);//(4, 4, 4) - // TODO-2.5: Lookup the DXR API for the D3D12_RAYTRACING_AABB struct and fill up this lamda function that creates + // TDO-2.5: Lookup the DXR API for the D3D12_RAYTRACING_AABB struct and fill up this lamda function that creates // and returns an D3D12_RAYTRACING_AABB for you. // Note that you are only filling an axis-aligned bounding box. // This should take into account the basePosition and the stride defined above. @@ -124,7 +124,7 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() offset += VolumetricPrimitive::Count; } - // TODO-2.5: Allocate an upload buffer for this AABB data. + // TDO-2.5: Allocate an upload buffer for this AABB data. // The base data lives in m_aabbs.data() (the stuff you filled in!), but the allocationg should be pointed // towards m_aabbBuffer.resource (the actual D3D12 resource that will hold all of our AABB data as a contiguous buffer). AllocateUploadBuffer(device, m_aabbs.data(), sizeof(m_aabbs.data()), &m_aabbBuffer.resource); @@ -137,7 +137,7 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() } } -// TODO-2.5: Build geometry used in the project. As easy as calling both functions above :) +// TDO-2.5: Build geometry used in the project. As easy as calling both functions above :) void DXProceduralProject::BuildGeometry() { BuildPlaneGeometry(); diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp index 7ed508f..6a338c2 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-HitGroup.cpp @@ -2,7 +2,7 @@ #include "DXProceduralProject.h" #include "CompiledShaders\Raytracing.hlsl.h" -// LOOKAT-2.3, TODO-2.3: Create the hitgroup pipeline subobject. +// LOOKAT-2.3, TDO-2.3: Create the hitgroup pipeline subobject. // A hitgroup specifies closest hit (mandatory), any hit (optional) and intersection shaders (mandatory but not for triangles). // They are executed when a ray intersects the geometry. // See how we do it for 1 triangle, and apply that logic to an AABB. @@ -27,7 +27,7 @@ void DXProceduralProject::CreateHitGroupSubobjects(CD3D12_STATE_OBJECT_DESC* ray } } - // TODO-2.3: AABB geometry hit groups. Very similar to triangles, except now you have to *also* loop over the primitive types. + // TDO-2.3: AABB geometry hit groups. Very similar to triangles, except now you have to *also* loop over the primitive types. { for (UINT rayType = 0; rayType < RayType::Count; rayType++) { @@ -37,14 +37,8 @@ void DXProceduralProject::CreateHitGroupSubobjects(CD3D12_STATE_OBJECT_DESC* ray { hitGroup->SetClosestHitShaderImport(c_closestHitShaderNames[GeometryType::AABB]); // We import the closest hit shader name - if (primitiveType == IntersectionShaderType::AnalyticPrimitive) { - hitGroup->SetIntersectionShaderImport(c_intersectionShaderNames[IntersectionShaderType::AnalyticPrimitive]); - } - if (primitiveType == IntersectionShaderType::VolumetricPrimitive) { - hitGroup->SetIntersectionShaderImport(c_intersectionShaderNames[IntersectionShaderType::VolumetricPrimitive]); - } - } + hitGroup->SetIntersectionShaderImport(c_intersectionShaderNames[primitiveType]); // We tell the hitgroup that it should export into the correct shader hit group name, with the correct type hitGroup->SetHitGroupExport(c_hitGroupNames_AABBGeometry[primitiveType][rayType]); hitGroup->SetHitGroupType(D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE); @@ -54,7 +48,7 @@ void DXProceduralProject::CreateHitGroupSubobjects(CD3D12_STATE_OBJECT_DESC* ray } } -// TODO-2.3: Local root signature and shader association (linking) +// TDO-2.3: Local root signature and shader association (linking) void DXProceduralProject::CreateLocalRootSignatureSubobjects(CD3D12_STATE_OBJECT_DESC* raytracingPipeline) { // Ray gen and miss shaders in this project are not using a local root signature and thus one is not associated with them. @@ -72,7 +66,7 @@ void DXProceduralProject::CreateLocalRootSignatureSubobjects(CD3D12_STATE_OBJECT rootSignatureAssociation->AddExports(c_hitGroupNames_TriangleGeometry); } - // TODO-2.3: AABB geometry hitgroup/local root signature association. + // TDO-2.3: AABB geometry hitgroup/local root signature association. // Very similar to triangles, except now one for each primitive type. { auto localRootSignature = raytracingPipeline->CreateSubobject(); diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp index ba0c985..d5d9c3e 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp @@ -19,8 +19,7 @@ void DXProceduralProject::CreateRaytracingPipelineStateObject() // DXIL library CreateDxilLibrarySubobject(&raytracingPipeline); - // TODO: figure out why these instructions are telling me to do something they already did - // TODO-2.4: Hit groups. Call the function you filled in in DXR-HitGroup.cpp. + // TDO-2.4: Hit groups. Call the function you filled in in DXR-HitGroup.cpp. CreateHitGroupSubobjects(&raytracingPipeline); // Shader config: defines the maximum sizes in bytes for the ray rayPayload and attribute structure. @@ -29,8 +28,7 @@ void DXProceduralProject::CreateRaytracingPipelineStateObject() UINT attributeSize = sizeof(struct ProceduralPrimitiveAttributes); shaderConfig->Config(payloadSize, attributeSize); - // TODO: figure out why these instructions are telling me to do something they already did - // TODO-2.4: Local root signature and shader association. Call the other function you did in in DXR-HitGroup.cpp. + // TDO-2.4: Local root signature and shader association. Call the other function you did in in DXR-HitGroup.cpp. CreateLocalRootSignatureSubobjects(&raytracingPipeline); // Global root signature @@ -54,4 +52,5 @@ void DXProceduralProject::CreateRaytracingPipelineStateObject() { ThrowIfFailed(m_dxrDevice->CreateStateObject(raytracingPipeline, IID_PPV_ARGS(&m_dxrStateObject)), L"Couldn't create DirectX Raytracing state object.\n"); } + } \ No newline at end of file diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp index 23e9d00..9065b79 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp @@ -40,17 +40,10 @@ void DXProceduralProject::CreateRootSignatures() // t registers --> SRV // b registers --> CBV CD3DX12_ROOT_PARAMETER rootParameters[GlobalRootSignature::Slot::Count]; - /* OutputView = 0, - AccelerationStructure, - SceneConstant, - AABBattributeBuffer, - VertexBuffer, - Count BECAUSE *APPARENTLY* THIS IS HOW WE DOCUMENT THINGS - */ //g_renderTarget : register(u0); - rootParameters[GlobalRootSignature::Slot::OutputView].InitAsDescriptorTable(1, &ranges[0]); + rootParameters[GlobalRootSignature::Slot::OutputView].InitAsDescriptorTable(0, &ranges[0], D3D12_SHADER_VISIBILITY_ALL); //g_indices : register(t1, space0);g_vertices : register(t2, space0); - rootParameters[GlobalRootSignature::Slot::VertexBuffers].InitAsDescriptorTable(2, &ranges[1]); + rootParameters[GlobalRootSignature::Slot::VertexBuffers].InitAsDescriptorTable(1, &ranges[1], D3D12_SHADER_VISIBILITY_ALL); //g_scene : register(t0, space0) rootParameters[GlobalRootSignature::Slot::AccelerationStructure].InitAsShaderResourceView(0); //g_sceneCB : register(b0); @@ -92,7 +85,7 @@ void DXProceduralProject::CreateRootSignatures() CD3DX12_ROOT_SIGNATURE_DESC localRootSignatureDesc(ARRAYSIZE(rootParameters), rootParameters); localRootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE; - SerializeAndCreateRaytracingRootSignature(localRootSignatureDesc, &m_raytracingLocalRootSignature[LocalRootSignature::Type::Triangle]); + SerializeAndCreateRaytracingRootSignature(localRootSignatureDesc, &m_raytracingLocalRootSignature[LocalRootSignature::Type::AABB]); } } } diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp index 150e92d..4f07fe5 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp @@ -32,8 +32,10 @@ void DXProceduralProject::BuildShaderTables() // TODO-2.7: Miss shaders. // Similar to the raygen shader, but now we have 1 for each ray type (radiance, shadow) // Don't forget to update shaderIdToStringMap. - missShaderIDs[0] = nullptr; - missShaderIDs[1] = nullptr; + missShaderIDs[0] = stateObjectProperties->GetShaderIdentifier(c_missShaderNames[0]); + shaderIdToStringMap[missShaderIDs[0]] = c_missShaderNames[0]; + missShaderIDs[1] = stateObjectProperties->GetShaderIdentifier(c_missShaderNames[1]); + shaderIdToStringMap[missShaderIDs[1]] = c_missShaderNames[1]; // Hitgroup shaders for the Triangle. We have 2: one for radiance ray, and another for the shadow ray. for (UINT i = 0; i < RayType::Count; i++) @@ -42,9 +44,17 @@ void DXProceduralProject::BuildShaderTables() shaderIdToStringMap[hitGroupShaderIDs_TriangleGeometry[i]] = c_hitGroupNames_TriangleGeometry[i]; } - // TODO-2.7: Hitgroup shaders for the AABBs. We have 2 for each AABB. + // TDO-2.7: Hitgroup shaders for the AABBs. We have 2 for each AABB. + for (UINT primitiveType = 0; primitiveType < IntersectionShaderType::Count; primitiveType++) { + for (UINT rayType = 0; rayType < RayType::Count; rayType++) { + hitGroupShaderIDs_AABBGeometry[primitiveType][rayType] = + stateObjectProperties->GetShaderIdentifier(c_hitGroupNames_AABBGeometry[primitiveType][rayType]); + shaderIdToStringMap[hitGroupShaderIDs_AABBGeometry[primitiveType][rayType]] + = c_hitGroupNames_AABBGeometry[primitiveType][rayType]; + }//for ray + }//for primitive - }; + };//getShaderIDs // Get shader identifiers using the lambda function defined above. UINT shaderIDSize; @@ -92,10 +102,19 @@ void DXProceduralProject::BuildShaderTables() m_rayGenShaderTable = rayGenShaderTable.GetResource(); } - // TODO-2.7: Miss shader table. Very similar to the RayGen table except now we push_back() 2 shader records + // TDO-2.7: Miss shader table. Very similar to the RayGen table except now we push_back() 2 shader records // 1 for the radiance ray, 1 for the shadow ray. Don't forget to call DebugPrint() on the table for your sanity! { - + UINT numShaderRecords = 2; + UINT shaderRecordSize = shaderIDSize; + + ShaderTable missShaderTable(device, numShaderRecords, shaderRecordSize, L"MissShaderTable"); + + missShaderTable.push_back(ShaderRecord(missShaderIDs[0], shaderRecordSize, nullptr, 0)); + missShaderTable.push_back(ShaderRecord(missShaderIDs[1], shaderRecordSize, nullptr, 0)); + + missShaderTable.DebugPrint(shaderIdToStringMap); + m_missShaderTable = missShaderTable.GetResource(); } // Hit group shader table. This one is slightly different given that a hit group requires its own custom root signature. @@ -133,17 +152,18 @@ void DXProceduralProject::BuildShaderTables() // in DXR-Pipeline.cpp. So if you did AABB, then Sphere, then Metaballs, then follow that order. // the primitive type is used to tell the shader what type of procedural geometry this is. // Remember that hitGroupShaderIDs_AABBGeometry is a 2-array indexed like so [type of geometry][ray type] + //TODO: investigate if this is actually TODO, or if this was just magically not erased { LocalRootSignature::AABB::RootArguments rootArgs; UINT instanceIndex = 0; // Create a shader record for each primitive. - for (UINT iShader = 0, instanceIndex = 0; iShader < IntersectionShaderType::Count; iShader++) + for (UINT iShader = 0, instanceIndex = 0; iShader < IntersectionShaderType::Count; iShader++)//2, one for each primitive type { UINT numPrimitiveTypes = IntersectionShaderType::PerPrimitiveTypeCount(static_cast(iShader)); // Primitives for each intersection shader. - for (UINT primitiveIndex = 0; primitiveIndex < numPrimitiveTypes; primitiveIndex++) + for (UINT primitiveIndex = 0; primitiveIndex < numPrimitiveTypes; primitiveIndex++) //this is 2 (cube, sphere) or 1 (metaball) { rootArgs.materialCb = m_aabbMaterialCB[instanceIndex]; rootArgs.aabbCB.instanceIndex = instanceIndex; diff --git a/src/D3D12RaytracingProceduralGeometry/Main.cpp b/src/D3D12RaytracingProceduralGeometry/Main.cpp index 7f70bc6..6bbb443 100644 --- a/src/D3D12RaytracingProceduralGeometry/Main.cpp +++ b/src/D3D12RaytracingProceduralGeometry/Main.cpp @@ -16,7 +16,7 @@ #include "stdafx.h" #include "DXProceduralProject.h" -#define CPU_CODE_COMPLETE 0 +#define CPU_CODE_COMPLETE 1 _Use_decl_annotations_ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) From 486c56ceab3f8f1cec92a293a629ab4d090ac713 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Fri, 18 Oct 2019 09:29:08 -0400 Subject: [PATCH 09/24] fixed some bugs, ran into all kinds of fun new ones --- .../DXR-AccelerationStructure.cpp | 66 ++++++++----------- .../DXR-Geometry.cpp | 3 +- .../DXR-Pipeline.cpp | 2 +- .../DXR-RootSignature.cpp | 12 ++-- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index 2757aa0..cfa2393 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -36,12 +36,14 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetGPUVirtualAddress(); geometryDesc.Triangles.IndexCount = m_indexBuffer.resource->GetDesc().Width; - geometryDesc.Triangles.IndexFormat = m_indexBuffer.resource->GetDesc().Format; + //geometryDesc.Triangles.IndexFormat = m_indexBuffer.resource->GetDesc().Format; + geometryDesc.Triangles.IndexFormat = DXGI_FORMAT_R32_UINT; m_vertexBuffer.cpuDescriptorHandle; geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 2 * sizeof(XMFLOAT3) };//TODO: this is probably wrong so fix it? pos, normal geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width; - geometryDesc.Triangles.VertexFormat = m_vertexBuffer.resource->GetDesc().Format; + //geometryDesc.Triangles.VertexFormat = m_vertexBuffer.resource->GetDesc().Format; + geometryDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; } { @@ -51,20 +53,24 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetGPUVirtualAddress() - + intersectionType * geometryDesc.AABBs.AABBs.StrideInBytes; - } // TDO-2.6: Fill the AABB geometry desc for every procedural geometry. LOOK AT THIS BECAUSE I DEFINITELY MESSED IT UP - // Look-up what a D3D12_RAYTRACING_GEOMETRY_AABBS_DESC structs needs to be filled in correctly. // Remember to use m_aabbBuffer to get the AABB geometry data you previously filled in. // Note: Having separate geometries allows of separate shader record binding per geometry. // In this project, this lets us specify custom hit groups per AABB geometry. + for (auto primitiveType = 0; primitiveType < IntersectionShaderType::TotalPrimitiveCount; primitiveType++) { + auto& geometryDesc = geometryDescs[BottomLevelASType::AABB][primitiveType]; + + auto startAddress = m_aabbBuffer.resource->GetGPUVirtualAddress() + + primitiveType * geometryDesc.AABBs.AABBs.StrideInBytes; + geometryDesc.AABBs.AABBs.StartAddress = startAddress; + + } + } } @@ -152,7 +158,7 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto // Don't forget that this is the return value. // Consider looking into the AccelerationStructureBuffers struct in DXR-Structs.h return AccelerationStructureBuffers{ - scratch, + scratch, bottomLevelAS, nullptr,//"used only for top-level AS" SHOULD THIS BE NULL? bottomLevelPrebuildInfo.ResultDataMaxSizeInBytes @@ -189,7 +195,8 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::Triangle]; - hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); + //hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); + hitGroupIndexOffset += 1; // Calculate transformation matrix. // We multiply the width by -0.5 in the x,z plane because we want the middle of the plane @@ -214,7 +221,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev //for the sake of typing not being garbage, this is a D3D12_RAYTRACING_INSTANCE_DESC auto& instanceDesc = instanceDescs[BottomLevelASType::AABB]; instanceDesc = {}; - instanceDesc.InstanceMask = 1;//who knows?? + instanceDesc.InstanceMask = 1; instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::AABB]; @@ -231,7 +238,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev // Upload all these instances to the GPU, and make sure the resouce is set to instanceDescsResource. UINT64 bufferSize = static_cast(instanceDescs.size() * sizeof(instanceDescs[0])); - AllocateUploadBuffer(device, instanceDescs.data(), bufferSize, &(*instanceDescsResource), L"InstanceDescs"); + AllocateUploadBuffer(device, instanceDescs.data(), bufferSize, &(*instanceDescsResource), L"BLInstanceDescs"); }; // TDO-2.6: Build the top-level acceleration structure. @@ -251,8 +258,8 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS &topLevelInputs = topLevelBuildDesc.Inputs; topLevelInputs.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL; topLevelInputs.Flags = buildFlags; - topLevelInputs.NumDescs = 2;//triangles, aabb topLevelInputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY; + topLevelInputs.NumDescs = BottomLevelASType::Count; D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO topLevelPrebuildInfo = {}; @@ -285,11 +292,6 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt AllocateUAVBuffer(device, topLevelPrebuildInfo.ResultDataMaxSizeInBytes, &topLevelAS, initialResourceState, L"TopLevelAccelerationStructure"); } - // Note on Emulated GPU pointers (AKA Wrapped pointers) requirement in Fallback Layer: - // The primary point of divergence between the DXR API and the compute-based Fallback layer is the handling of GPU pointers. - // DXR fundamentally requires that GPUs be able to dynamically read from arbitrary addresses in GPU memory. - // The existing Direct Compute API today is more rigid than DXR and requires apps to explicitly inform the GPU what - // blocks of memory it will access with SRVs/UAVs. // In order to handle the requirements of DXR, the Fallback Layer uses the concept of Emulated GPU pointers, // which requires apps to create views around all memory they will access for raytracing, // but retains the DXR-like flexibility of only needing to bind the top level acceleration structure at DispatchRays. @@ -323,9 +325,9 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt bottomLevelAS[1].accelerationStructure->GetGPUVirtualAddress() }; + // TDO-2.6: Call the DXR-templated version of BuildBottomLevelASInstanceDescs() you completed above. BuildBottomLevelASInstanceDescs< D3D12_RAYTRACING_INSTANCE_DESC, D3D12_GPU_VIRTUAL_ADDRESS> (bottomLevelASaddresses, &instanceDescsResource); - // TDO-2.6: Call the DXR-templated version of BuildBottomLevelASInstanceDescs() you completed above. } @@ -357,31 +359,16 @@ AccelerationStructureBuffers DXProceduralProject::BuildTopLevelAS(AccelerationSt - // TODO-2.6: After we finished building the top-level AS, save all the info in the AccelerationStructureBuffers struct. + // TDO-2.6: After we finished building the top-level AS, save all the info in the AccelerationStructureBuffers struct. // Very similar to how you did this in BuildBottomLevelAS() except now you have to worry about topLevelASBuffers.instanceDesc. // Consider looking into the AccelerationStructureBuffers struct in DXR-Structs.h. // Make sure to return the topLevelASBuffers before you exit the function. - D3D12_RAYTRACING_INSTANCE_DESC topLevelInstanceDesc; - topLevelInstanceDesc.AccelerationStructure = topLevelAS->GetGPUVirtualAddress(); - topLevelInstanceDesc.Flags = 0;//WHO KNOWS - topLevelInstanceDesc.InstanceID = 0;//WHO KNOWS - topLevelInstanceDesc.InstanceContributionToHitGroupIndex = 0;//WHO KNOWS - XMMATRIX mScale = XMMatrixScaling(1, 1, 1); - XMMATRIX mTranslation = XMMatrixTranslation(0, 0, 0); - XMMATRIX mTransform = mScale * mTranslation; - - // Store the transform in the instanceDesc. - XMStoreFloat3x4(reinterpret_cast(topLevelInstanceDesc.Transform), mTransform); - - ComPtr topLevelInstanceDescPtr; - AllocateUploadBuffer(device, &topLevelInstanceDesc, sizeof(D3D12_RAYTRACING_INSTANCE_DESC), &(topLevelInstanceDescPtr), L"TopLevelInstanceDesc"); - - return AccelerationStructureBuffers{ scratch, topLevelAS, - topLevelInstanceDescPtr,//TODO: figure out if my garbage instance desc is the right one - topLevelPrebuildInfo.ResultDataMaxSizeInBytes }; + instanceDescsResource, + topLevelPrebuildInfo.ResultDataMaxSizeInBytes + }; } // TDO-2.6: This will wrap building the Acceleration Structure! This is what we will call when building our scene. @@ -419,8 +406,7 @@ void DXProceduralProject::BuildAccelerationStructures() commandList->ResourceBarrier(BottomLevelASType::Count, resourceBarriers); // TDO-2.6: Build top-level AS. Hint, you already made a function that does this. - AccelerationStructureBuffers topLevelAS; - topLevelAS = BuildTopLevelAS(bottomLevelAS, buildFlags); + AccelerationStructureBuffers topLevelAS = BuildTopLevelAS(bottomLevelAS, buildFlags); // Kick off acceleration structure construction. diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index 8e90664..23c4d95 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -127,10 +127,11 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // TDO-2.5: Allocate an upload buffer for this AABB data. // The base data lives in m_aabbs.data() (the stuff you filled in!), but the allocationg should be pointed // towards m_aabbBuffer.resource (the actual D3D12 resource that will hold all of our AABB data as a contiguous buffer). - AllocateUploadBuffer(device, m_aabbs.data(), sizeof(m_aabbs.data()), &m_aabbBuffer.resource); + AllocateUploadBuffer(device, m_aabbs.data(), m_aabbs.size() * sizeof(m_aabbs[0]), &m_aabbBuffer.resource); //AllocateUploadBuffer(device, vertices, sizeof(vertices), &m_vertexBuffer.resource); UINT descriptorIndexAB = CreateBufferSRV(&m_aabbBuffer, m_aabbs.size(), sizeof(m_aabbs[0])); + printf("AABB Buffer Descriptor Index %d\n", descriptorIndexAB); //UINT descriptorIndexIB = CreateBufferSRV(&m_indexBuffer, sizeof(indices) / 4, 0); //UINT descriptorIndexVB = CreateBufferSRV(&m_vertexBuffer, ARRAYSIZE(vertices), sizeof(vertices[0])); //ThrowIfFalse(descriptorIndexVB == descriptorIndexIB + 1, L"Vertex Buffer descriptor index must follow that of Index Buffer descriptor index"); diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp index d5d9c3e..fbcdc05 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Pipeline.cpp @@ -2,7 +2,7 @@ #include "DXProceduralProject.h" #include "CompiledShaders\Raytracing.hlsl.h" -// LOOKAT-2.4, TODO-2.4: Fill in the Raytracing Pipeline State Object (RTPSO). +// LOOKAT-2.4, TDO-2.4: Fill in the Raytracing Pipeline State Object (RTPSO). // An RTPSO represents a full set of shaders reachable by a DispatchRays() call, with all configuration options resolved, // such as local signatures and other state. void DXProceduralProject::CreateRaytracingPipelineStateObject() diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp index 9065b79..dd76dd3 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-RootSignature.cpp @@ -4,7 +4,7 @@ // LOOKAT-2.2: Read about root signatures here https://docs.microsoft.com/en-us/windows/win32/direct3d12/root-signatures-overview -// TODO-2.2: Create parts of the shader root signature. +// TDO-2.2: Create parts of the shader root signature. void DXProceduralProject::CreateRootSignatures() { auto device = m_deviceResources->GetD3DDevice(); @@ -19,12 +19,12 @@ void DXProceduralProject::CreateRootSignatures() CD3DX12_DESCRIPTOR_RANGE ranges[2]; ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 1, 0); // 1 output texture - // TODO-2.2: In range index 1 (the second range), initialize 2 SRV resources at register 1: indices and vertices of triangle data. + // TDO-2.2: In range index 1 (the second range), initialize 2 SRV resources at register 1: indices and vertices of triangle data. // This will effectively put the indices at register 1, and the vertices at register 2. ranges[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 1); - // TODO-2.2: Initialize all the parameters of the GlobalRootSignature in their appropriate slots. + // TDO-2.2: Initialize all the parameters of the GlobalRootSignature in their appropriate slots. // * See GlobalRootSignature in RaytracingSceneDefines.h to understand what they are. // - The OutputView should correspond to the UAV range descriptor above (descriptor table), bound to register 0 of the UAV registers. // - The Index/Vertex Buffer should correspond to the SRV range (descriptor table) above, bound to registers 1 and 2 of the SRV registers. @@ -41,9 +41,9 @@ void DXProceduralProject::CreateRootSignatures() // b registers --> CBV CD3DX12_ROOT_PARAMETER rootParameters[GlobalRootSignature::Slot::Count]; //g_renderTarget : register(u0); - rootParameters[GlobalRootSignature::Slot::OutputView].InitAsDescriptorTable(0, &ranges[0], D3D12_SHADER_VISIBILITY_ALL); + rootParameters[GlobalRootSignature::Slot::OutputView].InitAsDescriptorTable(1, &(ranges[0]), D3D12_SHADER_VISIBILITY_ALL); //g_indices : register(t1, space0);g_vertices : register(t2, space0); - rootParameters[GlobalRootSignature::Slot::VertexBuffers].InitAsDescriptorTable(1, &ranges[1], D3D12_SHADER_VISIBILITY_ALL); + rootParameters[GlobalRootSignature::Slot::VertexBuffers].InitAsDescriptorTable(1, &(ranges[1]), D3D12_SHADER_VISIBILITY_ALL); //g_scene : register(t0, space0) rootParameters[GlobalRootSignature::Slot::AccelerationStructure].InitAsShaderResourceView(0); //g_sceneCB : register(b0); @@ -71,7 +71,7 @@ void DXProceduralProject::CreateRootSignatures() SerializeAndCreateRaytracingRootSignature(localRootSignatureDesc, &m_raytracingLocalRootSignature[LocalRootSignature::Type::Triangle]); } - // TODO-2.2: AABB geometry. Inspire yourself from the triangle local signature above to create an AABB local signature + // TDO-2.2: AABB geometry. Inspire yourself from the triangle local signature above to create an AABB local signature // - Remember that the AABB holds 1 slot for Material Constants, and another 1 for the geometry instance. // - See the AABB Definition in RaytracingSceneDefines.h to understand what this means. // - Use registers 1 and 2 of the CBVs for the AABB. Yes, althought the triangle MaterialConstant *also* maps From 96f487335559c4bc07f05942c371d1f0b3f7b0b4 Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Fri, 18 Oct 2019 09:44:50 -0400 Subject: [PATCH 10/24] Update README.md conceptual 2 --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 92f782c..9da2f84 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,14 @@ Project 5 - DirectX Procedural Raytracing** * [LinkedIn](https://www.linkedin.com/in/taylor-k-7b2110191/), [twitter](https://twitter.com/nelms_taylor) * Tested on: Windows 10, Intel i3 Coffee Lake 4-core 3.6GHz processor, 16GB RAM, NVidia GeForce GTX1650 4GB -### (TODO: Your README) +### Conceptual Questions -Include screenshots, analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +#### 1 - Camera Rays + +#### 2 - Procedural Geometry + +When a ray enters the `AABB` for the procedural geometry, we can use the scale/translation of the `AABB` to transform the ray to a position aligned with an "untransformed" bounding box; this allows for us to, say, always be intersecting with a unit sphere, rather than a transformed ellipsoid. + +We can then choose which kind of shader handles it based on the `Type` of the geometry. These shaders can encode the hit-or-miss capabilities for each geometric equation. To calculate whether a ray hits or misses a given geometry within an AABB, we do some math based on the transformed ray and the unit geometry, and use the results of that to determine whether our ray hit the geometry or not. + +#### 3 - Acceleration Structures From 324a48f238eaef54657078135e4c6f1f614fb220 Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Fri, 18 Oct 2019 10:06:25 -0400 Subject: [PATCH 11/24] Update README.md conceptual question 1 --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 9da2f84..785668e 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,14 @@ Project 5 - DirectX Procedural Raytracing** #### 1 - Camera Rays +We can begin calculating the rays by creating a virtual canvas one unit away from a camera oriented at the origin, along the `Z` axis. The angle between the top-center pixel of our canvas and the bottom-center pixel of our canvas will be our **field of view** (`FoV`). We will consider this top point to reside at (0, `sin(FoV/2)`, 1), and the bottom point to reside at (0, `-sin(FoV/2)`, 1). The width of our viewport will be equal to `resolutionX * (2sin(FoV/2) / resolutionY`, to keep our pixels square. In that way, we can construct the corners of our canvas. + +Once we have the extents of our canvas, we can easily distribute endpoints for our view-rays along the canvas. Then, for each one, we consider the position to be our direction (since our camera origin is at (0, 0, 0)), and we can normalize each. We now have a camera-space with origin at (0, 0, 0), view-direction of (0, 0, 1), an up-direction of (0, 1, 0), and a right-direction of (1, 0, 0), along with all of the rays we need to render our scene onto the screen. + +We then want to transform each of these rays into our world space. The origin transformation is easy; we make the world-space camera origin to be the origin for each of our view-rays. + +To transform the directions for each of our view-rays, we can construct a camera-to-world transformation matrix. This can be done by turning the right, up, and forward vectors of our camera's world-space directions into the rows of a rotation matrix. With some care regarding homogenous matrices, we can easily transform all of our rays into world space (and, similarly, create the transformation matrix for the reverse direction). + #### 2 - Procedural Geometry When a ray enters the `AABB` for the procedural geometry, we can use the scale/translation of the `AABB` to transform the ray to a position aligned with an "untransformed" bounding box; this allows for us to, say, always be intersecting with a unit sphere, rather than a transformed ellipsoid. From 506faa6428c030b72a7be1817be1d170114fa4c5 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Fri, 18 Oct 2019 10:18:13 -0400 Subject: [PATCH 12/24] added conceptual-3 image --- img/Proj5Conceptual3.png | Bin 0 -> 23150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/Proj5Conceptual3.png diff --git a/img/Proj5Conceptual3.png b/img/Proj5Conceptual3.png new file mode 100644 index 0000000000000000000000000000000000000000..13d8e5d9d734dddd932110b4d929aa05d7f5e7f5 GIT binary patch literal 23150 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 literal 0 HcmV?d00001 From 8af1880006e7b54454f790f8f4d1b34e948d8f54 Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Fri, 18 Oct 2019 10:18:56 -0400 Subject: [PATCH 13/24] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 785668e..78c74a2 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,5 @@ When a ray enters the `AABB` for the procedural geometry, we can use the scale/t We can then choose which kind of shader handles it based on the `Type` of the geometry. These shaders can encode the hit-or-miss capabilities for each geometric equation. To calculate whether a ray hits or misses a given geometry within an AABB, we do some math based on the transformed ray and the unit geometry, and use the results of that to determine whether our ray hit the geometry or not. #### 3 - Acceleration Structures + +![Image of BLAS structure](img/Proj5Conceptual3.png) From f0b0b1c652a77886dc3bb7f22296d2b0dd11f53b Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Mon, 21 Oct 2019 08:51:59 -0400 Subject: [PATCH 14/24] CPU CODE LEADS ME TO BLACK SCREEN FINALLY --- .../DXR-AccelerationStructure.cpp | 18 ++++++++---------- .../DXR-Common.cpp | 11 +++++++++-- .../DXR-DoRaytracing.cpp | 4 ++-- .../DXR-Geometry.cpp | 7 +------ .../DXR-Other.cpp | 16 ++++++++++++++++ .../RaytracingShaderHelper.hlsli | 2 ++ 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index cfa2393..0678c19 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -35,15 +35,13 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetGPUVirtualAddress(); - geometryDesc.Triangles.IndexCount = m_indexBuffer.resource->GetDesc().Width; - //geometryDesc.Triangles.IndexFormat = m_indexBuffer.resource->GetDesc().Format; - geometryDesc.Triangles.IndexFormat = DXGI_FORMAT_R32_UINT; + geometryDesc.Triangles.IndexCount = m_indexBuffer.resource->GetDesc().Width / sizeof(Index); + geometryDesc.Triangles.IndexFormat = DXGI_FORMAT_R16_UINT; - m_vertexBuffer.cpuDescriptorHandle; geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 2 * sizeof(XMFLOAT3) };//TODO: this is probably wrong so fix it? pos, normal - geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width; - //geometryDesc.Triangles.VertexFormat = m_vertexBuffer.resource->GetDesc().Format; - geometryDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; + geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width / sizeof(Vertex); + geometryDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT; + } { @@ -145,6 +143,7 @@ AccelerationStructureBuffers DXProceduralProject::BuildBottomLevelAS(const vecto { // Set the descriptor heaps to be used during acceleration structure build for the Fallback Layer. ID3D12DescriptorHeap *pDescriptorHeaps[] = { m_descriptorHeap.Get() }; + auto numDescriptorHeaps = ARRAYSIZE(pDescriptorHeaps); m_fallbackCommandList->SetDescriptorHeaps(ARRAYSIZE(pDescriptorHeaps), pDescriptorHeaps); m_fallbackCommandList->BuildRaytracingAccelerationStructure(&bottomLevelBuildDesc, 0, nullptr); } @@ -195,8 +194,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::Triangle]; - //hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); - hitGroupIndexOffset += 1; + hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); // Calculate transformation matrix. // We multiply the width by -0.5 in the x,z plane because we want the middle of the plane @@ -378,7 +376,7 @@ void DXProceduralProject::BuildAccelerationStructures() auto commandList = m_deviceResources->GetCommandList(); auto commandQueue = m_deviceResources->GetCommandQueue(); auto commandAllocator = m_deviceResources->GetCommandAllocator(); - auto buildFlags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;//WHO KNOWS? + auto buildFlags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE;//WHO KNOWS? // Reset the command list for the acceleration structure construction. commandList->Reset(commandAllocator, nullptr); diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp index 41c60ae..872bfea 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp @@ -57,12 +57,19 @@ void DXProceduralProject::AllocateUAVBuffer(ID3D12Device* pDevice, UINT64 buffer UINT DXProceduralProject::AllocateDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE* cpuDescriptor, UINT descriptorIndexToUse) { auto descriptorHeapCpuBase = m_descriptorHeap->GetCPUDescriptorHandleForHeapStart(); - if (descriptorIndexToUse >= m_descriptorHeap->GetDesc().NumDescriptors) + auto descHeapDesc = m_descriptorHeap->GetDesc(); + UINT numDescriptors = descHeapDesc.NumDescriptors; + if (descriptorIndexToUse >= numDescriptors) +// if (descriptorIndexToUse >= m_descriptorHeap->GetDesc().NumDescriptors) { - ThrowIfFalse(m_descriptorsAllocated < m_descriptorHeap->GetDesc().NumDescriptors, L"Ran out of descriptors on the heap!"); + ThrowIfFalse(m_descriptorsAllocated < numDescriptors, L"Ran out of descriptors on the heap!\n"); +// ThrowIfFalse(m_descriptorsAllocated < m_descriptorHeap->GetDesc().NumDescriptors, L"Ran out of descriptors on the heap!\n"); descriptorIndexToUse = m_descriptorsAllocated++; } *cpuDescriptor = CD3DX12_CPU_DESCRIPTOR_HANDLE(descriptorHeapCpuBase, descriptorIndexToUse, m_descriptorSize); + char buffer[50]; + sprintf_s(buffer, "Allocated for index %d\n", descriptorIndexToUse); + OutputDebugStringA(buffer); return descriptorIndexToUse; } diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp index bf3b099..6189a68 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-DoRaytracing.cpp @@ -23,8 +23,8 @@ void DXProceduralProject::DoRaytracing() // TDO-2.8: do a very similar operation for the m_aabbPrimitiveAttributeBuffer m_aabbPrimitiveAttributeBuffer.CopyStagingToGpu(frameIndex); - commandList->SetComputeRootShaderResourceView(GlobalRootSignature::Slot::AABBattributeBuffer, m_aabbPrimitiveAttributeBuffer.GpuVirtualAddress(frameIndex)); - //TODO: should the above be a structured buffer of some sort? + //commandList->SetComputeRootShaderResourceView(GlobalRootSignature::Slot::AABBattributeBuffer, m_aabbPrimitiveAttributeBuffer.GpuVirtualAddress(frameIndex)); + commandList->SetComputeRootShaderResourceView(GlobalRootSignature::Slot::AABBattributeBuffer, m_aabbPrimitiveAttributeBuffer.GpuVirtualAddress()); // Bind the descriptor heaps. if (m_raytracingAPI == RaytracingAPI::FallbackLayer) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index 23c4d95..c3465bb 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -128,13 +128,8 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // The base data lives in m_aabbs.data() (the stuff you filled in!), but the allocationg should be pointed // towards m_aabbBuffer.resource (the actual D3D12 resource that will hold all of our AABB data as a contiguous buffer). AllocateUploadBuffer(device, m_aabbs.data(), m_aabbs.size() * sizeof(m_aabbs[0]), &m_aabbBuffer.resource); - //AllocateUploadBuffer(device, vertices, sizeof(vertices), &m_vertexBuffer.resource); - UINT descriptorIndexAB = CreateBufferSRV(&m_aabbBuffer, m_aabbs.size(), sizeof(m_aabbs[0])); - printf("AABB Buffer Descriptor Index %d\n", descriptorIndexAB); - //UINT descriptorIndexIB = CreateBufferSRV(&m_indexBuffer, sizeof(indices) / 4, 0); - //UINT descriptorIndexVB = CreateBufferSRV(&m_vertexBuffer, ARRAYSIZE(vertices), sizeof(vertices[0])); - //ThrowIfFalse(descriptorIndexVB == descriptorIndexIB + 1, L"Vertex Buffer descriptor index must follow that of Index Buffer descriptor index"); + //UINT descriptorIndexAB = CreateBufferSRV(&m_aabbBuffer, m_aabbs.size(), sizeof(m_aabbs[0])); } } diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Other.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Other.cpp index f889597..100fd3e 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Other.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Other.cpp @@ -2,6 +2,14 @@ #include "DXProceduralProject.h" #include "CompiledShaders\Raytracing.hlsl.h" +#ifndef CAPTURING +#define CAPTURING 0 +#endif + +#if CAPTURING +#include +#endif + // LOOKAT-1.8.3: This file contains pretty much everything else we decided was not too important. Feel free to explore what's going on here though. using namespace std; @@ -55,6 +63,11 @@ void DXProceduralProject::EnableDirectXRaytracing(IDXGIAdapter1* adapter) // Create resources that depend on the device. void DXProceduralProject::CreateDeviceDependentResources() { +#if CAPTURING + ComPtr ga; + HRESULT hr = DXGIGetDebugInterface1(0, IID_PPV_ARGS(&ga)); + ga->BeginCapture(); +#endif CreateAuxilaryDeviceResources(); // Create raytracing interfaces: raytracing device and commandlist. @@ -86,6 +99,9 @@ void DXProceduralProject::CreateDeviceDependentResources() // Create an output 2D texture to store the raytracing result to. CreateRaytracingOutputResource(); +#if CAPTURING + ga->EndCapture(); +#endif } // Selects the RTX API to use and tells the device to create a root signature given the descriptor. diff --git a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli index 94bf5cc..1852093 100644 --- a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli @@ -133,6 +133,8 @@ inline Ray GenerateCameraRay(uint2 index, in float3 cameraPosition, in float4x4 ray.origin = float3(0.0f, 0.0f, 0.0f); ray.direction = normalize(float3(0.0f, 0.0f, 0.0f)); + + return ray; } From 686e47b8eb43a2a6f6ab1ec44df6129ef74144a7 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Mon, 21 Oct 2019 09:35:44 -0400 Subject: [PATCH 15/24] I got literally anything on the screen --- .../Raytracing.hlsl | 6 ++++-- .../RaytracingShaderHelper.hlsli | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl index d066933..89d790e 100644 --- a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl +++ b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl @@ -149,9 +149,11 @@ bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) [shader("raygeneration")] void MyRaygenShader() { - + Ray cameraRay = GenerateCameraRay(uint2(DispatchRaysIndex().xy), g_sceneCB.cameraPosition, g_sceneCB.projectionToWorld); + float4 radianceResult = TraceRadianceRay(cameraRay, 0); + // Write the color to the render target - g_renderTarget[DispatchRaysIndex().xy] = float4(0.0f, 0.0f, 0.0f, 0.0f); + g_renderTarget[DispatchRaysIndex().xy] = radianceResult; } //*************************************************************************** diff --git a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli index 1852093..24a1468 100644 --- a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli @@ -130,10 +130,20 @@ float3 HitAttribute(float3 vertexAttribute[3], float2 barycentrics) inline Ray GenerateCameraRay(uint2 index, in float3 cameraPosition, in float4x4 projectionToWorld) { Ray ray; - ray.origin = float3(0.0f, 0.0f, 0.0f); - ray.direction = normalize(float3(0.0f, 0.0f, 0.0f)); - - + uint3 whd = DispatchRaysDimensions(); + float2 normIndex = { index.x / (1.0f * whd.x), index.y / (1.0f * whd.y) };//top left: (0,0), bottom right: (1.0, 1.0) + normIndex.y = 1.0 - normIndex.y;//bottom left: (0, 0), top right: (1, 1) + normIndex = float2( (normIndex.x - 0.5f) * 2.0f, (normIndex.y - 0.5f) * 2.0f );//bottom left: (-1, -1), top right: (1, 1) + + ray.origin = cameraPosition; + ray.direction = float3(normIndex.x, normIndex.y, 1.0f); //not sure about the 1.0 + + float4 rayDirectionHomogenous = float4(ray.direction, 1.0f); + float4 rayDirectionTransformed = mul(rayDirectionHomogenous, projectionToWorld); + //float4 rayDirectionTransformed = mul(projectionToWorld, rayDirectionHomogenous); + ray.direction = float3(rayDirectionTransformed.x, rayDirectionTransformed.y, rayDirectionTransformed.z); + ray.direction = normalize(ray.direction); + return ray; } From 99bb1d0700335f6f54a72120d2dc81e928efd420 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Tue, 22 Oct 2019 08:45:05 -0400 Subject: [PATCH 16/24] some geometry debug, a pinch of albedo --- .../DXR-AccelerationStructure.cpp | 2 +- .../DXR-Common.cpp | 6 +- .../DXR-Geometry.cpp | 12 ++-- .../Raytracing.hlsl | 66 +++++++++++++++++-- 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index 0678c19..36aadd5 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -38,7 +38,7 @@ void DXProceduralProject::BuildGeometryDescsForBottomLevelAS(arrayGetDesc().Width / sizeof(Index); geometryDesc.Triangles.IndexFormat = DXGI_FORMAT_R16_UINT; - geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 2 * sizeof(XMFLOAT3) };//TODO: this is probably wrong so fix it? pos, normal + geometryDesc.Triangles.VertexBuffer = { m_vertexBuffer.resource->GetGPUVirtualAddress(), 2 * sizeof(XMFLOAT3) }; geometryDesc.Triangles.VertexCount = m_vertexBuffer.resource->GetDesc().Width / sizeof(Vertex); geometryDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT; diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp index 872bfea..5e962fe 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Common.cpp @@ -67,9 +67,9 @@ UINT DXProceduralProject::AllocateDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE* cpuDes descriptorIndexToUse = m_descriptorsAllocated++; } *cpuDescriptor = CD3DX12_CPU_DESCRIPTOR_HANDLE(descriptorHeapCpuBase, descriptorIndexToUse, m_descriptorSize); - char buffer[50]; - sprintf_s(buffer, "Allocated for index %d\n", descriptorIndexToUse); - OutputDebugStringA(buffer); + //char buffer[50]; + //sprintf_s(buffer, "Allocated for index %d\n", descriptorIndexToUse); + //OutputDebugStringA(buffer); return descriptorIndexToUse; } diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index c3465bb..35be797 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -91,11 +91,14 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() //center coordinate for our (0, 0) index point XMFLOAT3 baseCenter = { basePosition.x + c_aabbWidth / 2.0f, basePosition.y + c_aabbWidth / 2.0f, - basePosition.z + c_aabbWidth / 2.0f}; + basePosition.z + c_aabbWidth / 2.0f}; XMFLOAT3 myCenter = baseCenter;// + offsetIndex * stride + myCenter.x += stride.x * (aabbGrid.x - 1) / 2.0f; + myCenter.y += stride.y * (aabbGrid.y - 1) / 2.0f; + myCenter.z += stride.z * (aabbGrid.z - 1) / 2.0f; myCenter.x += offsetIndex.x * stride.x; myCenter.y += offsetIndex.y * stride.y; - myCenter.x += offsetIndex.z * stride.z; + myCenter.z += offsetIndex.z * stride.z; aabb.MaxX = myCenter.x + size.x / 2.0f; aabb.MaxY = myCenter.y + size.y / 2.0f; aabb.MaxZ = myCenter.z + size.z / 2.0f; @@ -113,14 +116,14 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() { using namespace AnalyticPrimitive; m_aabbs[offset + AABB] = InitializeAABB(XMFLOAT3(0.5f, 0.0f, 0.0f), XMFLOAT3(2.0f, 3.0f, 2.0f)); - m_aabbs[offset + Spheres] = InitializeAABB(XMFLOAT3(1.0f, 0.75f, -0.5f), XMFLOAT3(3, 3, 3)); + m_aabbs[offset + Spheres] = InitializeAABB(XMFLOAT3(1.0f, 0.75f, -0.5f), XMFLOAT3(3.0f, 3.0f, 3.0f)); offset += AnalyticPrimitive::Count; } // Volumetric primitives. { using namespace VolumetricPrimitive; - m_aabbs[offset + Metaballs] = InitializeAABB(XMINT3(-1, 0, 0), XMFLOAT3(6, 6, 6)); + m_aabbs[offset + Metaballs] = InitializeAABB(XMINT3(-1.0f, 0.0f, 0.0f), XMFLOAT3(6.0f, 6.0f, 6.0f)); offset += VolumetricPrimitive::Count; } @@ -129,7 +132,6 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // towards m_aabbBuffer.resource (the actual D3D12 resource that will hold all of our AABB data as a contiguous buffer). AllocateUploadBuffer(device, m_aabbs.data(), m_aabbs.size() * sizeof(m_aabbs[0]), &m_aabbBuffer.resource); - //UINT descriptorIndexAB = CreateBufferSRV(&m_aabbBuffer, m_aabbs.size(), sizeof(m_aabbs[0])); } } diff --git a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl index 89d790e..a9db673 100644 --- a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl +++ b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl @@ -41,7 +41,9 @@ ConstantBuffer l_aabbCB: register(b2); // other // Remember to clamp the dot product term! float CalculateDiffuseCoefficient(in float3 incidentLightRay, in float3 normal) { - return 0.0f; + float factor = dot(incidentLightRay, normal); + factor = min(max(factor, 0.0f), 1.0f); + return factor; } // TODO-3.6: Phong lighting specular component. @@ -51,6 +53,7 @@ float CalculateDiffuseCoefficient(in float3 incidentLightRay, in float3 normal) // Remember to normalize the reflected ray, and to clamp the dot product term float4 CalculateSpecularCoefficient(in float3 incidentLightRay, in float3 normal, in float specularPower) { + float3 reflectDirection = reflect(incidentLightRay, normal); return float4(0.0f, 0.0f, 0.0f, 0.0f); } @@ -68,6 +71,10 @@ float4 CalculateSpecularCoefficient(in float3 incidentLightRay, in float3 normal float4 CalculatePhongLighting(in float4 albedo, in float3 normal, in bool isInShadow, in float diffuseCoef = 1.0, in float specularCoef = 1.0, in float specularPower = 50) { + if (isInShadow){ + return float4(0.0f, 0.0f, 0.0f, 0.0f); + } + // Ambient component // Fake AO: Darken faces with normal facing downwards/away from the sky a little bit float4 ambientColor = g_sceneCB.lightAmbientColor; @@ -135,14 +142,37 @@ float4 TraceRadianceRay(in Ray ray, in UINT currentRayRecursionDepth) // Hint 2: remember what the ShadowRay payload looks like. See RaytracingHlslCompat.h bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) { - return false; + + if (currentRayRecursionDepth >= MAX_RAY_RECURSION_DEPTH) + { + return float4(0, 0, 0, 0); + } + RayDesc rayDesc; + rayDesc.Origin = ray.origin; + rayDesc.Direction = ray.direction; + rayDesc.TMin = 0; + rayDesc.TMax = 10000; + + ShadowRayPayload rayPayload = { true }; + + return false; + + TraceRay(g_scene, + RAY_FLAG_CULL_BACK_FACING_TRIANGLES, + TraceRayParameters::InstanceMask, + TraceRayParameters::HitGroup::Offset[RayType::Shadow],//1 + TraceRayParameters::HitGroup::GeometryStride, + TraceRayParameters::MissShader::Offset[RayType::Shadow],//1 + rayDesc, rayPayload); + return rayPayload.hit; + } //*************************************************************************** //********************------ Ray gen shader -------************************** //*************************************************************************** -// TODO-3.1: Complete the ray generation shader. +// TDO-3.1: Complete the ray generation shader. // (1) Generate a ray using the function GenerateCameraRay() in RaytracingShaderHelper.hlsli // (2) Trace a radiance ray using the generated ray to obtain a color // (3) Write that color to the render target @@ -229,7 +259,33 @@ void MyClosestHitShader_Triangle(inout RayPayload rayPayload, in BuiltInTriangle [shader("closesthit")] void MyClosestHitShader_AABB(inout RayPayload rayPayload, in ProceduralPrimitiveAttributes attr) { + float3 geoNormal = attr.normal; + float3 hitPosition = HitWorldPosition(); + Ray shadowRay = { hitPosition, normalize(g_sceneCB.lightPosition.xyz - hitPosition) }; + bool shadowRayHit = TraceShadowRayAndReportIfHit(shadowRay, rayPayload.recursionDepth); + + // Reflected component ray. + float4 reflectedColor = float4(0, 0, 0, 0); + if (l_materialCB.reflectanceCoef > 0.001 ) + { + // Trace a reflection ray from the intersection points using Snell's law. The reflect() HLSL built-in function does this for you! + // See https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions + Ray reflectionRay = { hitPosition, reflect(WorldRayDirection(), geoNormal) }; + float4 reflectionColor = TraceRadianceRay(reflectionRay, rayPayload.recursionDepth); + + float3 fresnelR = FresnelReflectanceSchlick(WorldRayDirection(), geoNormal, l_materialCB.albedo.xyz); + reflectedColor = l_materialCB.reflectanceCoef * float4(fresnelR, 1) * reflectionColor; + } + + // Calculate final color. + float4 phongColor = CalculatePhongLighting(l_materialCB.albedo, geoNormal, shadowRayHit, l_materialCB.diffuseCoef, l_materialCB.specularCoef, l_materialCB.specularPower); + float4 color = (phongColor + reflectedColor); + + + //TODO: apply visibility falloff + + rayPayload.color = color; } //*************************************************************************** @@ -242,6 +298,7 @@ void MyClosestHitShader_AABB(inout RayPayload rayPayload, in ProceduralPrimitive [shader("miss")] void MyMissShader(inout RayPayload rayPayload) { + rayPayload.color = float4(0.1f, 0.4f, 0.8f, 0.0f); } @@ -249,7 +306,8 @@ void MyMissShader(inout RayPayload rayPayload) [shader("miss")] void MyMissShader_ShadowRay(inout ShadowRayPayload rayPayload) { - + rayPayload.hit = false; + return; } //*************************************************************************** From f0101cd4cb0ab06cef374018db47c0d4db4ad5e7 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sat, 26 Oct 2019 11:05:02 -0400 Subject: [PATCH 17/24] metaballs function, to a degree --- .../Raytracing.hlsl | 27 +++++++-- .../VolumetricPrimitives.hlsli | 56 ++++++++++++++++--- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl index a9db673..56f8f53 100644 --- a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl +++ b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl @@ -145,7 +145,7 @@ bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) if (currentRayRecursionDepth >= MAX_RAY_RECURSION_DEPTH) { - return float4(0, 0, 0, 0); + return false; } RayDesc rayDesc; rayDesc.Origin = ray.origin; @@ -153,12 +153,15 @@ bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) rayDesc.TMin = 0; rayDesc.TMax = 10000; - ShadowRayPayload rayPayload = { true }; + ShadowRayPayload rayPayload; + rayPayload.hit = true; return false; - + + RAY_FLAG shadowFlags = RAY_FLAG_CULL_BACK_FACING_TRIANGLES | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | RAY_FLAG_SKIP_CLOSEST_HIT_SHADER | RAY_FLAG_FORCE_OPAQUE; + TraceRay(g_scene, - RAY_FLAG_CULL_BACK_FACING_TRIANGLES, + shadowFlags, TraceRayParameters::InstanceMask, TraceRayParameters::HitGroup::Offset[RayType::Shadow],//1 TraceRayParameters::HitGroup::GeometryStride, @@ -359,6 +362,22 @@ void MyIntersectionShader_AnalyticPrimitive() [shader("intersection")] void MyIntersectionShader_VolumetricPrimitive() { + Ray localRay = GetRayInAABBPrimitiveLocalSpace(); + float thit; + ProceduralPrimitiveAttributes attr; + + + if (RayMetaballsIntersectionTest(localRay, thit, attr, 0))//TODO: find out how to get elapsedTime for this method + { + PrimitiveInstancePerFrameBuffer aabbAttribute = g_AABBPrimitiveAttributes[l_aabbCB.instanceIndex]; + + // Make sure the normals are stored in BLAS space and not the local space + attr.normal = mul(attr.normal, (float3x3) aabbAttribute.localSpaceToBottomLevelAS); + attr.normal = normalize(mul((float3x3) ObjectToWorld3x4(), attr.normal)); + + // thit is invariant to the space transformation + ReportHit(thit, /*hitKind*/ 0, attr); + } } #endif // RAYTRACING_HLSL \ No newline at end of file diff --git a/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli b/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli index 31a9444..b932d67 100644 --- a/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli @@ -6,6 +6,9 @@ #include "RaytracingShaderHelper.hlsli" +#define NUMSTEPS 128 +#define THRESH 0.15f + // LOOKAT-1.9.4: Shockingly, a metaball is just a sphere! struct Metaball { @@ -13,7 +16,7 @@ struct Metaball float radius; }; -// TODO-3.4.2: Calculate a magnitude of an influence from a Metaball charge. +// TDO-3.4.2: Calculate a magnitude of an influence from a Metaball charge. // This function should return a metaball potential, which is a float in range [0,1]. // 1) If the point is at the center, the potential is maximum = 1. // 2) If it is at the radius or beyond, the potential is 0. @@ -22,7 +25,14 @@ struct Metaball // of the distance from the center to the radius. float CalculateMetaballPotential(in float3 position, in Metaball blob) { - return 0.0f; + float3 distvec = blob.center - position; + float dist = sqrt(distvec.x * distvec.x + distvec.y * distvec.y + distvec.z * distvec.z); + if (dist > blob.radius) + { + return 0.0f; + } + float r = 1.0 - (dist / blob.radius); + return 6*r*r*r*r*r - 15*r*r*r*r + 10*r*r*r; } // LOOKAT-1.9.4: Calculates field potential from all active metaballs. This is just the sum of all potentials. @@ -77,15 +87,23 @@ void InitializeAnimatedMetaballs(out Metaball blobs[N_METABALLS], in float elaps } } -// TODO-3.4.2: Find the entry and exit points for all metaball bounding spheres combined. +// TDO-3.4.2: Find the entry and exit points for all metaball bounding spheres combined. // Remember that a metaball is just a solid sphere. Didn't we already do this somewhere else? void TestMetaballsIntersection(in Ray ray, out float tmin, out float tmax, inout Metaball blobs[N_METABALLS]) { tmin = INFINITY; tmax = -INFINITY; -} -// TODO-3.4.2: Test if a ray with RayFlags and segment intersects metaball field. + for (UINT i = 0; i < N_METABALLS; i++) + { + float localtmin, localtmax; + SolveRaySphereIntersectionEquation(ray, localtmin, localtmax, blobs[i].center, blobs[i].radius); + if (localtmin < tmin) tmin = localtmin; + if (localtmax > tmax) tmax = localtmax; + + } +} +// TDO-3.4.2: Test if a ray with RayFlags and segment intersects metaball field. // The test sphere traces through the metaball field until it hits a threshold isosurface. // Returns true if we found a point. False otherwise. // 1) Initialize a metaball array. See InitializeAnimatedMetaballs() @@ -100,9 +118,31 @@ void TestMetaballsIntersection(in Ray ray, out float tmin, out float tmax, inout // If this condition fails, keep raymarching! bool RayMetaballsIntersectionTest(in Ray ray, out float thit, out ProceduralPrimitiveAttributes attr, in float elapsedTime) { - thit = 0.0f; - attr.normal = float3(0.0f, 0.0f, 0.0f); - return false; + Metaball blobs[N_METABALLS]; + InitializeAnimatedMetaballs(blobs, elapsedTime, 1.0f);//TODO: figure out this cycle time stuff + float tmin, tmax; + TestMetaballsIntersection(ray, tmin, tmax, blobs); + if (tmin == INFINITY || tmax == -INFINITY) return false;//did not hit any metaballs + float tdiff = tmax - tmin; + float tdelta = tdiff / NUMSTEPS; + + bool didHit = false; + float curT = tmin; + for (int i = 0; i < NUMSTEPS; i++) + { + curT += tdelta; + float potential = CalculateMetaballsPotential(ray.origin + ray.direction * curT, blobs); + if (potential > THRESH) + {//taking the first hit on our raymarch that breaks the potential + didHit = true; + + break; + } + } + if (!didHit) return false; + thit = curT; + attr.normal = CalculateMetaballsNormal(ray.origin + ray.direction * thit, blobs); + return is_a_valid_hit(ray, thit, attr.normal); } #endif // VOLUMETRICPRIMITIVESLIBRARY_H \ No newline at end of file From 80d412ce1fd1a783d4eade7f053d5e0e4dee60d6 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sun, 27 Oct 2019 16:08:15 -0400 Subject: [PATCH 18/24] things don't work, but they don't work in style at least --- .../DXR-AccelerationStructure.cpp | 3 +- .../DXR-Geometry.cpp | 18 ++++----- .../Raytracing.hlsl | 37 ++++++++++++++----- .../RaytracingShaderHelper.hlsli | 9 ++++- .../VolumetricPrimitives.hlsli | 3 +- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp index 36aadd5..c7d626b 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-AccelerationStructure.cpp @@ -194,7 +194,6 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::Triangle]; - hitGroupIndexOffset += ARRAYSIZE(c_hitGroupNames_TriangleGeometry); // Calculate transformation matrix. // We multiply the width by -0.5 in the x,z plane because we want the middle of the plane @@ -220,7 +219,7 @@ void DXProceduralProject::BuildBottomLevelASInstanceDescs(BLASPtrType *bottomLev auto& instanceDesc = instanceDescs[BottomLevelASType::AABB]; instanceDesc = {}; instanceDesc.InstanceMask = 1; - instanceDesc.InstanceContributionToHitGroupIndex = hitGroupIndexOffset; + instanceDesc.InstanceContributionToHitGroupIndex = BottomLevelASType::AABB * RayType::Count; instanceDesc.AccelerationStructure = bottomLevelASaddresses[BottomLevelASType::AABB]; //make translation matrix, out of wishes and pretend diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp index 35be797..58995b3 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-Geometry.cpp @@ -85,7 +85,7 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() // and returns an D3D12_RAYTRACING_AABB for you. // Note that you are only filling an axis-aligned bounding box. // This should take into account the basePosition and the stride defined above. - auto InitializeAABB = [&](auto& offsetIndex, auto& size) + auto InitializeAABB = [&](XMFLOAT3& offsetIndex, auto& size) { D3D12_RAYTRACING_AABB aabb{}; //center coordinate for our (0, 0) index point @@ -93,18 +93,18 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() basePosition.y + c_aabbWidth / 2.0f, basePosition.z + c_aabbWidth / 2.0f}; XMFLOAT3 myCenter = baseCenter;// + offsetIndex * stride - myCenter.x += stride.x * (aabbGrid.x - 1) / 2.0f; - myCenter.y += stride.y * (aabbGrid.y - 1) / 2.0f; - myCenter.z += stride.z * (aabbGrid.z - 1) / 2.0f; - myCenter.x += offsetIndex.x * stride.x; - myCenter.y += offsetIndex.y * stride.y; - myCenter.z += offsetIndex.z * stride.z; + myCenter.x += stride.x * ((aabbGrid.x - 1) / 2.0f + offsetIndex.x); + myCenter.y += stride.y * ((aabbGrid.y - 1) / 2.0f + offsetIndex.y); + myCenter.z += stride.z * ((aabbGrid.z - 1) / 2.0f + offsetIndex.z); aabb.MaxX = myCenter.x + size.x / 2.0f; aabb.MaxY = myCenter.y + size.y / 2.0f; aabb.MaxZ = myCenter.z + size.z / 2.0f; aabb.MinX = myCenter.x - size.x / 2.0f; aabb.MinY = myCenter.y - size.y / 2.0f; aabb.MinZ = myCenter.z - size.z / 2.0f; + char buffer[300]; + sprintf_s(buffer, "AABB:\tX[%f,%f]\tY[%f,%f]\tZ[%f,%f]\n", aabb.MinX, aabb.MaxX, aabb.MinY, aabb.MaxY, aabb.MinZ, aabb.MaxZ); + OutputDebugStringA(buffer); return aabb; }; @@ -116,14 +116,14 @@ void DXProceduralProject::BuildProceduralGeometryAABBs() { using namespace AnalyticPrimitive; m_aabbs[offset + AABB] = InitializeAABB(XMFLOAT3(0.5f, 0.0f, 0.0f), XMFLOAT3(2.0f, 3.0f, 2.0f)); - m_aabbs[offset + Spheres] = InitializeAABB(XMFLOAT3(1.0f, 0.75f, -0.5f), XMFLOAT3(3.0f, 3.0f, 3.0f)); + m_aabbs[offset + Spheres] = InitializeAABB(XMFLOAT3(1.0f, 0.5f, -0.5f), XMFLOAT3(3.0f, 3.0f, 3.0f)); offset += AnalyticPrimitive::Count; } // Volumetric primitives. { using namespace VolumetricPrimitive; - m_aabbs[offset + Metaballs] = InitializeAABB(XMINT3(-1.0f, 0.0f, 0.0f), XMFLOAT3(6.0f, 6.0f, 6.0f)); + m_aabbs[offset + Metaballs] = InitializeAABB(XMFLOAT3(-1.0f, 0.5f, 1.0f), XMFLOAT3(6.0f, 6.0f, 6.0f)); offset += VolumetricPrimitive::Count; } diff --git a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl index 56f8f53..d322adb 100644 --- a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl +++ b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl @@ -51,10 +51,14 @@ float CalculateDiffuseCoefficient(in float3 incidentLightRay, in float3 normal) // HINT: Consider using built-in DirectX functions to find the reflected ray. Remember that a reflected ray is reflected // with respect to the normal of the hit position. // Remember to normalize the reflected ray, and to clamp the dot product term -float4 CalculateSpecularCoefficient(in float3 incidentLightRay, in float3 normal, in float specularPower) +float CalculateSpecularCoefficient(in float3 incidentLightRay, in float3 normal, in float specularPower) { - float3 reflectDirection = reflect(incidentLightRay, normal); - return float4(0.0f, 0.0f, 0.0f, 0.0f); + float3 reflectDirection = normalize(reflect(incidentLightRay, normal)); + float3 reverseRayDirection = -WorldRayDirection(); + float dotp = dot(reflectDirection, reverseRayDirection); + dotp = min(max(dotp, 0.0f), 1.0f); + float retval = pow(dotp, specularPower); + return retval; } // TODO-3.6: Phong lighting model = ambient + diffuse + specular components. @@ -74,6 +78,11 @@ float4 CalculatePhongLighting(in float4 albedo, in float3 normal, in bool isInSh if (isInShadow){ return float4(0.0f, 0.0f, 0.0f, 0.0f); } + + float3 hitPos = HitWorldPosition(); + float3 lightPos = g_sceneCB.lightPosition.xyz; + float3 incident = normalize(hitPos - lightPos); + // Ambient component // Fake AO: Darken faces with normal facing downwards/away from the sky a little bit @@ -83,7 +92,13 @@ float4 CalculatePhongLighting(in float4 albedo, in float3 normal, in bool isInSh float a = 1 - saturate(dot(normal, float3(0, -1, 0))); ambientColor = albedo * lerp(ambientColorMin, ambientColorMax, a); - return ambientColor; + float4 specularColor = float4(1.0f, 1.0f, 1.0f, 1.0f) * CalculateSpecularCoefficient(incident, normal, specularPower); + float4 diffuseColor = albedo * diffuseCoef * CalculateDiffuseCoefficient(incident, normal); + + float4 result = ambientColor + specularColor + diffuseColor; + + return result; + } //*************************************************************************** @@ -156,7 +171,6 @@ bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) ShadowRayPayload rayPayload; rayPayload.hit = true; - return false; RAY_FLAG shadowFlags = RAY_FLAG_CULL_BACK_FACING_TRIANGLES | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | RAY_FLAG_SKIP_CLOSEST_HIT_SHADER | RAY_FLAG_FORCE_OPAQUE; @@ -244,6 +258,9 @@ void MyClosestHitShader_Triangle(inout RayPayload rayPayload, in BuiltInTriangle // Hint 1: look at the intrinsic function RayTCurrent() that returns how "far away" your ray is. // Hint 2: use the built-in function lerp() to linearly interpolate between the computed color and the Background color. // When t is big, we want the background color to be more pronounced. + //TODO: apply visibility falloff + float t = RayTCurrent(); + color = lerp(color, BackgroundColor, 1.0 - exp(-0.0000001*t*t*t)); rayPayload.color = color; } @@ -287,6 +304,8 @@ void MyClosestHitShader_AABB(inout RayPayload rayPayload, in ProceduralPrimitive //TODO: apply visibility falloff + float t = RayTCurrent(); + color = lerp(color, BackgroundColor, 1.0 - exp(-0.0000001*t*t)); rayPayload.color = color; } @@ -295,17 +314,17 @@ void MyClosestHitShader_AABB(inout RayPayload rayPayload, in ProceduralPrimitive //**********************------ Miss shaders -------************************** //*************************************************************************** -// TODO-3.3: Complete the Radiance ray miss shader. What color should you output if you hit no geometry? +// TDO-3.3: Complete the Radiance ray miss shader. What color should you output if you hit no geometry? // Make sure you edit the rayPayload so your color gets passed down to other shaders. // NOTE: whether we missed a Triangle or a Procedural Geometry does not matter. The miss output should be the same! [shader("miss")] void MyMissShader(inout RayPayload rayPayload) { - rayPayload.color = float4(0.1f, 0.4f, 0.8f, 0.0f); + rayPayload.color = float4(BackgroundColor); } -// TODO-3.3: Complete the Shadow ray miss shader. Is this ray a shadow ray if it hit nothing? +// TDO-3.3: Complete the Shadow ray miss shader. Is this ray a shadow ray if it hit nothing? [shader("miss")] void MyMissShader_ShadowRay(inout ShadowRayPayload rayPayload) { @@ -367,7 +386,7 @@ void MyIntersectionShader_VolumetricPrimitive() ProceduralPrimitiveAttributes attr; - if (RayMetaballsIntersectionTest(localRay, thit, attr, 0))//TODO: find out how to get elapsedTime for this method + if (RayMetaballsIntersectionTest(localRay, thit, attr, g_sceneCB.elapsedTime)) { PrimitiveInstancePerFrameBuffer aabbAttribute = g_AABBPrimitiveAttributes[l_aabbCB.instanceIndex]; diff --git a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli index 24a1468..cc3a7a4 100644 --- a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli @@ -68,7 +68,12 @@ bool is_a_valid_hit(in Ray ray, in float thit, in float3 hitSurfaceNormal) // (3) Call the hlsl built-in function smoothstep() on this interpolant to smooth it out so it doesn't change abruptly. float CalculateAnimationInterpolant(in float elapsedTime, in float cycleDuration) { - return smoothstep(0, 1, 0); + float ratio = elapsedTime / cycleDuration; + float cyclePoint = ratio - (int)ratio; + if (cyclePoint <= 0.5f) + return smoothstep(0, 1, 2.0f * cyclePoint); + else + return smoothstep(0, 1, 2.0f * (1.0f - cyclePoint)); } // Load three 2-byte indices from a ByteAddressBuffer. @@ -119,7 +124,7 @@ float3 HitAttribute(float3 vertexAttribute[3], float2 barycentrics) barycentrics.y * (vertexAttribute[2] - vertexAttribute[0]); } -// TODO-3.1: Generate a ray in world space for a camera pixel corresponding to a dispatch index (analogous to a thread index in CUDA). +// TDO-3.1: Generate a ray in world space for a camera pixel corresponding to a dispatch index (analogous to a thread index in CUDA). // Check out https://docs.microsoft.com/en-us/windows/win32/direct3d12/direct3d-12-raytracing-hlsl-system-value-intrinsics to see interesting // intrinsic HLSL raytracing functions you may use. // Remember that you are given the pixel coordinates from index. You need to convert this to normalized-device coordinates first. diff --git a/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli b/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli index b932d67..a4f5c23 100644 --- a/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/VolumetricPrimitives.hlsli @@ -8,6 +8,7 @@ #define NUMSTEPS 128 #define THRESH 0.15f +#define CYCLETIME 5.0f // LOOKAT-1.9.4: Shockingly, a metaball is just a sphere! struct Metaball @@ -119,7 +120,7 @@ void TestMetaballsIntersection(in Ray ray, out float tmin, out float tmax, inout bool RayMetaballsIntersectionTest(in Ray ray, out float thit, out ProceduralPrimitiveAttributes attr, in float elapsedTime) { Metaball blobs[N_METABALLS]; - InitializeAnimatedMetaballs(blobs, elapsedTime, 1.0f);//TODO: figure out this cycle time stuff + InitializeAnimatedMetaballs(blobs, elapsedTime, CYCLETIME); float tmin, tmax; TestMetaballsIntersection(ray, tmin, tmax, blobs); if (tmin == INFINITY || tmax == -INFINITY) return false;//did not hit any metaballs From 96d8eca006a0a4d745336e23b41544e59f2d88ea Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sun, 27 Oct 2019 16:21:11 -0400 Subject: [PATCH 19/24] Working shadows --- img/working_raytracer.png | Bin 0 -> 110613 bytes .../DXR-ShaderTable.cpp | 1 + .../Raytracing.hlsl | 1 - .../RaytracingShaderHelper.hlsli | 4 +++- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 img/working_raytracer.png diff --git a/img/working_raytracer.png b/img/working_raytracer.png new file mode 100644 index 0000000000000000000000000000000000000000..4350b676056d814397b2c86092e9344615c2864c GIT binary patch literal 110613 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 literal 0 HcmV?d00001 diff --git a/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp b/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp index 4f07fe5..84d1eff 100644 --- a/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp +++ b/src/D3D12RaytracingProceduralGeometry/DXR-ShaderTable.cpp @@ -115,6 +115,7 @@ void DXProceduralProject::BuildShaderTables() missShaderTable.DebugPrint(shaderIdToStringMap); m_missShaderTable = missShaderTable.GetResource(); + m_missShaderTableStrideInBytes = missShaderTable.GetShaderRecordSize(); } // Hit group shader table. This one is slightly different given that a hit group requires its own custom root signature. diff --git a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl index d322adb..66f06d9 100644 --- a/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl +++ b/src/D3D12RaytracingProceduralGeometry/Raytracing.hlsl @@ -171,7 +171,6 @@ bool TraceShadowRayAndReportIfHit(in Ray ray, in UINT currentRayRecursionDepth) ShadowRayPayload rayPayload; rayPayload.hit = true; - RAY_FLAG shadowFlags = RAY_FLAG_CULL_BACK_FACING_TRIANGLES | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | RAY_FLAG_SKIP_CLOSEST_HIT_SHADER | RAY_FLAG_FORCE_OPAQUE; TraceRay(g_scene, diff --git a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli index cc3a7a4..9de8616 100644 --- a/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli +++ b/src/D3D12RaytracingProceduralGeometry/RaytracingShaderHelper.hlsli @@ -158,7 +158,9 @@ inline Ray GenerateCameraRay(uint2 index, in float3 cameraPosition, in float4x4 // f0 is usually the albedo of the material assuming the outside environment is air. float3 FresnelReflectanceSchlick(in float3 I, in float3 N, in float3 f0) { - return f0; + float costheta = min(max(dot(I, N), 0.0f), 1.0f); + float factor = pow(1.0f - costheta, 5); + return factor * f0; } #endif // RAYTRACINGSHADERHELPER_H \ No newline at end of file From 0475f2b9921ff6e3274bb90c1fcd5c2f6b358b3b Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Sun, 27 Oct 2019 16:22:31 -0400 Subject: [PATCH 20/24] Update README.md --- README.md | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/README.md b/README.md index 78c74a2..26fc8f1 100644 --- a/README.md +++ b/README.md @@ -5,24 +5,4 @@ Project 5 - DirectX Procedural Raytracing** * [LinkedIn](https://www.linkedin.com/in/taylor-k-7b2110191/), [twitter](https://twitter.com/nelms_taylor) * Tested on: Windows 10, Intel i3 Coffee Lake 4-core 3.6GHz processor, 16GB RAM, NVidia GeForce GTX1650 4GB -### Conceptual Questions - -#### 1 - Camera Rays - -We can begin calculating the rays by creating a virtual canvas one unit away from a camera oriented at the origin, along the `Z` axis. The angle between the top-center pixel of our canvas and the bottom-center pixel of our canvas will be our **field of view** (`FoV`). We will consider this top point to reside at (0, `sin(FoV/2)`, 1), and the bottom point to reside at (0, `-sin(FoV/2)`, 1). The width of our viewport will be equal to `resolutionX * (2sin(FoV/2) / resolutionY`, to keep our pixels square. In that way, we can construct the corners of our canvas. - -Once we have the extents of our canvas, we can easily distribute endpoints for our view-rays along the canvas. Then, for each one, we consider the position to be our direction (since our camera origin is at (0, 0, 0)), and we can normalize each. We now have a camera-space with origin at (0, 0, 0), view-direction of (0, 0, 1), an up-direction of (0, 1, 0), and a right-direction of (1, 0, 0), along with all of the rays we need to render our scene onto the screen. - -We then want to transform each of these rays into our world space. The origin transformation is easy; we make the world-space camera origin to be the origin for each of our view-rays. - -To transform the directions for each of our view-rays, we can construct a camera-to-world transformation matrix. This can be done by turning the right, up, and forward vectors of our camera's world-space directions into the rows of a rotation matrix. With some care regarding homogenous matrices, we can easily transform all of our rays into world space (and, similarly, create the transformation matrix for the reverse direction). - -#### 2 - Procedural Geometry - -When a ray enters the `AABB` for the procedural geometry, we can use the scale/translation of the `AABB` to transform the ray to a position aligned with an "untransformed" bounding box; this allows for us to, say, always be intersecting with a unit sphere, rather than a transformed ellipsoid. - -We can then choose which kind of shader handles it based on the `Type` of the geometry. These shaders can encode the hit-or-miss capabilities for each geometric equation. To calculate whether a ray hits or misses a given geometry within an AABB, we do some math based on the transformed ray and the unit geometry, and use the results of that to determine whether our ray hit the geometry or not. - -#### 3 - Acceleration Structures - -![Image of BLAS structure](img/Proj5Conceptual3.png) +![Ray Tracer Output](img/working_raytracer.png) From e4f37268a88429b20cd3aab987b7d410d9060086 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sun, 27 Oct 2019 16:48:49 -0400 Subject: [PATCH 21/24] ray depth image --- img/raydepthchart.png | Bin 0 -> 11446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/raydepthchart.png diff --git a/img/raydepthchart.png b/img/raydepthchart.png new file mode 100644 index 0000000000000000000000000000000000000000..f46af8c8c6940aa8488a38c13019734d076c37c2 GIT binary patch literal 11446 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 T=_U|>m@a8S&%Hilb@zV(k7=_v literal 0 HcmV?d00001 From 654bcda40dd936b89d5f9636deac145609bf6f01 Mon Sep 17 00:00:00 2001 From: taylornelms15 <19171471+taylornelms15@users.noreply.github.com> Date: Sun, 27 Oct 2019 16:55:11 -0400 Subject: [PATCH 22/24] Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 26fc8f1..1201603 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,13 @@ Project 5 - DirectX Procedural Raytracing** * Tested on: Windows 10, Intel i3 Coffee Lake 4-core 3.6GHz processor, 16GB RAM, NVidia GeForce GTX1650 4GB ![Ray Tracer Output](img/working_raytracer.png) + +### DXR Ray Tracer + +In this engine implementation, we make use of DirectX's ray tracing utilities to render a hardcoded scene of procedural geometries. By making use of the built-in acceleration structures for geometry traversal, we are able to render a fully ray-traced image at real-time speeds, a feat that is impossible with CPU-based implementations. + +### Performance + +With only a few geometries to work with, we can look at how the depth of the render engine affects performance overall. It turns out, it does not take too deep of a traversal to slow the performance down to a screeching halt. + +![Effect of Ray Depth on FPS](img/raydepthchart.png) From 7c4b1ba6bce8bba8e9c8d751be75767beb3ee8ad Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sun, 27 Oct 2019 16:56:46 -0400 Subject: [PATCH 23/24] better chart --- img/raydepthchart.png | Bin 11446 -> 15163 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/raydepthchart.png b/img/raydepthchart.png index f46af8c8c6940aa8488a38c13019734d076c37c2..b8abed0d0525315b88151c41ba3cf18fe350ebf0 100644 GIT binary patch literal 15163 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 G_J09pOmYnX literal 11446 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 T=_U|>m@a8S&%Hilb@zV(k7=_v From 0fd919e5dfda88c4161b2130af172c48a0096aff Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Sun, 27 Oct 2019 16:58:55 -0400 Subject: [PATCH 24/24] better image --- img/working_raytracer.png | Bin 110613 -> 117141 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/working_raytracer.png b/img/working_raytracer.png index 4350b676056d814397b2c86092e9344615c2864c..e2705ae6de7090fd9e8320c84be1cc42a1b2237f 100644 GIT binary patch literal 117141 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%0Dt7eh<(oQu+~*hP-Dz`2WjdUuu#q=`fNn|#5+ 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℞5J>m$v@=)6|o{0qnb!36e%x=cysovGwVbKX=!vhH6Z_ zq@HCus{tJ;q(cfgYct3;BDc2K~P_Ita9D&2*wZv+!ka TnZcb?=tkwhjFsocS@S literal 110613 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