|
@@ -38,7 +38,6 @@ DirectX12::DirectX12()
|
|
|
swapChain(0),
|
|
swapChain(0),
|
|
|
rtvHeap(0),
|
|
rtvHeap(0),
|
|
|
dsvHeap(0),
|
|
dsvHeap(0),
|
|
|
- shaderBufferHeap(0),
|
|
|
|
|
depthBuffer(0),
|
|
depthBuffer(0),
|
|
|
backBufferIndex(0),
|
|
backBufferIndex(0),
|
|
|
tearing(0),
|
|
tearing(0),
|
|
@@ -47,15 +46,10 @@ DirectX12::DirectX12()
|
|
|
vertexBufferView(0),
|
|
vertexBufferView(0),
|
|
|
indexBufferView(0),
|
|
indexBufferView(0),
|
|
|
signature(0),
|
|
signature(0),
|
|
|
- pipeline(0),
|
|
|
|
|
texturModel(0),
|
|
texturModel(0),
|
|
|
uiTexture(0),
|
|
uiTexture(0),
|
|
|
texturRegister(new TextureList()),
|
|
texturRegister(new TextureList()),
|
|
|
- vertexShader(0),
|
|
|
|
|
- pixelShader(0),
|
|
|
|
|
blasModels(0),
|
|
blasModels(0),
|
|
|
- blasScratchBuffer(0),
|
|
|
|
|
- blasResultBuffer(0),
|
|
|
|
|
lastModelId(-1)
|
|
lastModelId(-1)
|
|
|
{
|
|
{
|
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
@@ -72,14 +66,6 @@ DirectX12::~DirectX12()
|
|
|
}
|
|
}
|
|
|
delete[] blasModels;
|
|
delete[] blasModels;
|
|
|
}
|
|
}
|
|
|
- if (blasScratchBuffer)
|
|
|
|
|
- {
|
|
|
|
|
- blasScratchBuffer->release();
|
|
|
|
|
- }
|
|
|
|
|
- if (blasResultBuffer)
|
|
|
|
|
- {
|
|
|
|
|
- blasResultBuffer->release();
|
|
|
|
|
- }
|
|
|
|
|
if (directCommandQueue)
|
|
if (directCommandQueue)
|
|
|
{
|
|
{
|
|
|
directCommandQueue->flush();
|
|
directCommandQueue->flush();
|
|
@@ -97,13 +83,9 @@ DirectX12::~DirectX12()
|
|
|
}
|
|
}
|
|
|
if (depthBuffer) depthBuffer->Release();
|
|
if (depthBuffer) depthBuffer->Release();
|
|
|
if (dsvHeap) dsvHeap->Release();
|
|
if (dsvHeap) dsvHeap->Release();
|
|
|
- if (shaderBufferHeap) shaderBufferHeap->Release();
|
|
|
|
|
- if (vertexShader) vertexShader->release();
|
|
|
|
|
- if (pixelShader) pixelShader->release();
|
|
|
|
|
texturRegister->release();
|
|
texturRegister->release();
|
|
|
if (uiTexture) uiTexture->release();
|
|
if (uiTexture) uiTexture->release();
|
|
|
if (texturModel) texturModel->release();
|
|
if (texturModel) texturModel->release();
|
|
|
- if (pipeline) pipeline->Release();
|
|
|
|
|
if (signature) signature->Release();
|
|
if (signature) signature->Release();
|
|
|
delete indexBufferView;
|
|
delete indexBufferView;
|
|
|
delete vertexBufferView;
|
|
delete vertexBufferView;
|
|
@@ -123,6 +105,10 @@ DirectX12::~DirectX12()
|
|
|
getDLLRegister()->releaseDLL("d3d12.dll");
|
|
getDLLRegister()->releaseDLL("d3d12.dll");
|
|
|
}
|
|
}
|
|
|
if (debug) debug->Release();
|
|
if (debug) debug->Release();
|
|
|
|
|
+ for (const D3D12_RAYTRACING_INSTANCE_DESC* desc : instanceDescs)
|
|
|
|
|
+ {
|
|
|
|
|
+ delete desc;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void DirectX12::updateBottomLevelAccelerationStructure()
|
|
void DirectX12::updateBottomLevelAccelerationStructure()
|
|
@@ -145,85 +131,10 @@ void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
blasModels[id]->calculateBuffers();
|
|
blasModels[id]->calculateBuffers();
|
|
|
bufferCount += blasModels[id]->getBufferCount();
|
|
bufferCount += blasModels[id]->getBufferCount();
|
|
|
}
|
|
}
|
|
|
- D3D12_RAYTRACING_GEOMETRY_DESC* geometryDescs
|
|
|
|
|
- = new D3D12_RAYTRACING_GEOMETRY_DESC[bufferCount];
|
|
|
|
|
- memset(geometryDescs,
|
|
|
|
|
- 0,
|
|
|
|
|
- sizeof(D3D12_RAYTRACING_GEOMETRY_DESC) * bufferCount);
|
|
|
|
|
- int bufferIndex = 0;
|
|
|
|
|
- for (const Model3DData* model : *modelList->zModels())
|
|
|
|
|
- {
|
|
|
|
|
- int id = model->getId();
|
|
|
|
|
- for (int i = 0; i < blasModels[id]->getBufferCount()
|
|
|
|
|
- && bufferIndex < bufferCount;
|
|
|
|
|
- i++)
|
|
|
|
|
- {
|
|
|
|
|
- DX12Buffer* vertexBuffer
|
|
|
|
|
- = blasModels[id]->zVertexBuffers()->z(i);
|
|
|
|
|
- DX12Buffer* indexBuffer = blasModels[id]->zIndexBuffers()->z(i);
|
|
|
|
|
- geometryDescs[bufferIndex].Type
|
|
|
|
|
- = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
|
|
|
|
|
- geometryDescs[bufferIndex].Flags
|
|
|
|
|
- = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.VertexBuffer.StartAddress
|
|
|
|
|
- = vertexBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.VertexBuffer.StrideInBytes
|
|
|
|
|
- = vertexBuffer->getElementLength();
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.VertexCount
|
|
|
|
|
- = (unsigned)vertexBuffer->getElementCount();
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.VertexFormat
|
|
|
|
|
- = DXGI_FORMAT_R32G32B32_FLOAT;
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.IndexBuffer
|
|
|
|
|
- = indexBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.IndexCount
|
|
|
|
|
- = (unsigned)indexBuffer->getElementCount();
|
|
|
|
|
- geometryDescs[bufferIndex].Triangles.IndexFormat
|
|
|
|
|
- = DXGI_FORMAT_R32_UINT;
|
|
|
|
|
- bufferIndex++;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
|
|
|
|
|
- prebuildDesc.Type
|
|
|
|
|
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
|
|
|
|
|
- prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
|
|
|
|
- prebuildDesc.NumDescs = bufferCount;
|
|
|
|
|
- prebuildDesc.pGeometryDescs = geometryDescs;
|
|
|
|
|
- prebuildDesc.Flags
|
|
|
|
|
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
-
|
|
|
|
|
- D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
|
|
|
|
- device->GetRaytracingAccelerationStructurePrebuildInfo(
|
|
|
|
|
- &prebuildDesc, &info);
|
|
|
|
|
-
|
|
|
|
|
- blasScratchBuffer->setLength((int)info.ScratchDataSizeInBytes);
|
|
|
|
|
- blasScratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
|
|
|
|
|
- blasResultBuffer->setLength((int)info.ResultDataMaxSizeInBytes);
|
|
|
|
|
- blasResultBuffer->createBufferWithoutData(
|
|
|
|
|
- D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
|
|
|
|
|
-
|
|
|
|
|
- D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
|
|
|
|
|
- buildDesc.Inputs.Type
|
|
|
|
|
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
|
|
|
|
|
- buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
|
|
|
|
- buildDesc.Inputs.NumDescs = bufferCount;
|
|
|
|
|
- buildDesc.Inputs.pGeometryDescs = geometryDescs;
|
|
|
|
|
- buildDesc.DestAccelerationStructureData
|
|
|
|
|
- = {blasResultBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
- buildDesc.ScratchAccelerationStructureData
|
|
|
|
|
- = {blasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
- buildDesc.SourceAccelerationStructureData = 0;
|
|
|
|
|
- buildDesc.Inputs.Flags
|
|
|
|
|
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
-
|
|
|
|
|
- // Build the AS
|
|
|
|
|
- directCommandQueue->getCommandList()
|
|
|
|
|
- ->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
|
|
|
|
|
directCommandQueue
|
|
directCommandQueue
|
|
|
->execute(); // TODO: check if this is realy necessary
|
|
->execute(); // TODO: check if this is realy necessary
|
|
|
// here, because maybe the command list is
|
|
// here, because maybe the command list is
|
|
|
// executed in the render function anyway
|
|
// executed in the render function anyway
|
|
|
-
|
|
|
|
|
- delete[] geometryDescs;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -467,11 +378,6 @@ void DirectX12::initialize(
|
|
|
copyCommandQueue = new DX12CopyCommandQueue(device);
|
|
copyCommandQueue = new DX12CopyCommandQueue(device);
|
|
|
computeCommandQueue = new DX12ComputeCommandQueue(device);
|
|
computeCommandQueue = new DX12ComputeCommandQueue(device);
|
|
|
|
|
|
|
|
- blasScratchBuffer
|
|
|
|
|
- = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
- blasResultBuffer
|
|
|
|
|
- = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
-
|
|
|
|
|
IDXGIFactory5* fac5 = 0;
|
|
IDXGIFactory5* fac5 = 0;
|
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
|
if (fac5)
|
|
if (fac5)
|
|
@@ -664,64 +570,6 @@ void DirectX12::initialize(
|
|
|
device->CreateDepthStencilView(
|
|
device->CreateDepthStencilView(
|
|
|
depthBuffer, &dsv, dsvHeap->GetCPUDescriptorHandleForHeapStart());
|
|
depthBuffer, &dsv, dsvHeap->GetCPUDescriptorHandleForHeapStart());
|
|
|
|
|
|
|
|
- D3D12_DESCRIPTOR_HEAP_DESC sbheapDesc = {};
|
|
|
|
|
- sbheapDesc.NumDescriptors = 6;
|
|
|
|
|
- sbheapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
|
|
|
|
- sbheapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
|
|
|
|
- res = device->CreateDescriptorHeap(
|
|
|
|
|
- &sbheapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&shaderBufferHeap);
|
|
|
|
|
- if (FAILED(res))
|
|
|
|
|
- {
|
|
|
|
|
- factory->Release();
|
|
|
|
|
- Logging::error() << "ERROR: CreateDescriptorHeap returned " << res
|
|
|
|
|
- << "\n";
|
|
|
|
|
- WMessageBox(fenster->getWindowHandle(),
|
|
|
|
|
- new Text("Fehler"),
|
|
|
|
|
- new Text("CreateDescriptorHeap ist Fehlgeschlagen."),
|
|
|
|
|
- MB_ICONERROR);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- vertexShader
|
|
|
|
|
- = new DX12VertexShader(device, copyCommandQueue, directCommandQueue);
|
|
|
|
|
- vertexShader->setCompiledByteArray(
|
|
|
|
|
- (unsigned char*)DX12VertexShaderBytes, sizeof(DX12VertexShaderBytes));
|
|
|
|
|
- vertexShader->createConstBuffer(sizeof(Mat4<float>) * 2, 0);
|
|
|
|
|
- vertexShader->createConstBuffer(sizeof(Mat4<float>) * 128, 1);
|
|
|
|
|
-
|
|
|
|
|
- pixelShader
|
|
|
|
|
- = new DX12PixelShader(device, copyCommandQueue, directCommandQueue);
|
|
|
|
|
- pixelShader->setCompiledByteArray(
|
|
|
|
|
- (unsigned char*)DX12PixelShaderBytes, sizeof(DX12PixelShaderBytes));
|
|
|
|
|
- pixelShader->createConstBuffer(sizeof(float) * 4, 2);
|
|
|
|
|
- pixelShader->createConstBuffer(sizeof(float) * 3, 3);
|
|
|
|
|
- pixelShader->createConstBuffer(sizeof(int) * 2, 4);
|
|
|
|
|
-
|
|
|
|
|
- D3D12_INPUT_ELEMENT_DESC inputLayout[] = {
|
|
|
|
|
- {"POSITION",
|
|
|
|
|
- 0, DXGI_FORMAT_R32G32B32_FLOAT,
|
|
|
|
|
- 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
|
|
|
|
- D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
|
|
|
|
- {"TEXCOORD",
|
|
|
|
|
- 0, DXGI_FORMAT_R32G32_FLOAT,
|
|
|
|
|
- 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
|
|
|
|
- D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
|
|
|
|
- {"NORMAL",
|
|
|
|
|
- 0, DXGI_FORMAT_R32G32B32_FLOAT,
|
|
|
|
|
- 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
|
|
|
|
- D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
|
|
|
|
- {"KNOCHEN_ID",
|
|
|
|
|
- 0, DXGI_FORMAT_R32_UINT,
|
|
|
|
|
- 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
|
|
|
|
- D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
|
|
|
|
- {"VERTEX_ID",
|
|
|
|
|
- 0, DXGI_FORMAT_R32_UINT,
|
|
|
|
|
- 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
|
|
|
|
- D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- vertexShader->createInputLayout(inputLayout, 5);
|
|
|
|
|
-
|
|
|
|
|
D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
|
|
D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
|
|
|
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
|
|
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
|
|
|
if (FAILED(device->CheckFeatureSupport(
|
|
if (FAILED(device->CheckFeatureSupport(
|
|
@@ -834,75 +682,10 @@ void DirectX12::initialize(
|
|
|
rdesc.ForcedSampleCount = 0;
|
|
rdesc.ForcedSampleCount = 0;
|
|
|
rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
|
|
rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
|
|
|
|
|
|
|
|
- D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
|
|
|
|
|
- psoDesc.InputLayout = {vertexShader->zInputLayout(),
|
|
|
|
|
- (unsigned)vertexShader->getInputLayoutSize()};
|
|
|
|
|
- psoDesc.pRootSignature = signature;
|
|
|
|
|
- psoDesc.VS = {vertexShader->getCompiledShader(),
|
|
|
|
|
- (unsigned __int64)vertexShader->getCompiledLength()};
|
|
|
|
|
- psoDesc.PS = {pixelShader->getCompiledShader(),
|
|
|
|
|
- (unsigned __int64)pixelShader->getCompiledLength()};
|
|
|
|
|
- psoDesc.RasterizerState = rdesc;
|
|
|
|
|
- psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
|
|
|
|
|
- psoDesc.DepthStencilState.DepthEnable = FALSE;
|
|
|
|
|
- psoDesc.DepthStencilState.StencilEnable = FALSE;
|
|
|
|
|
- psoDesc.SampleMask = UINT_MAX;
|
|
|
|
|
- psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
|
|
|
|
|
- psoDesc.NumRenderTargets = 1;
|
|
|
|
|
- psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
|
|
|
- psoDesc.SampleDesc.Count = 1;
|
|
|
|
|
-
|
|
|
|
|
- D3D12_CPU_DESCRIPTOR_HANDLE sbHeapHandle
|
|
|
|
|
- = shaderBufferHeap->GetCPUDescriptorHandleForHeapStart();
|
|
|
|
|
- unsigned int incr = device->GetDescriptorHandleIncrementSize(
|
|
|
|
|
- D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
|
|
|
|
- D3D12_CONSTANT_BUFFER_VIEW_DESC desc;
|
|
|
|
|
- vertexShader->getViewDesc(0, desc);
|
|
|
|
|
- device->CreateConstantBufferView(&desc, sbHeapHandle);
|
|
|
|
|
- res = device->GetDeviceRemovedReason();
|
|
|
|
|
- sbHeapHandle.ptr += incr;
|
|
|
|
|
- vertexShader->getViewDesc(1, desc);
|
|
|
|
|
- device->CreateConstantBufferView(&desc, sbHeapHandle);
|
|
|
|
|
- sbHeapHandle.ptr += incr;
|
|
|
|
|
- pixelShader->getViewDesc(2, desc);
|
|
|
|
|
- device->CreateConstantBufferView(&desc, sbHeapHandle);
|
|
|
|
|
- sbHeapHandle.ptr += incr;
|
|
|
|
|
- pixelShader->getViewDesc(3, desc);
|
|
|
|
|
- device->CreateConstantBufferView(&desc, sbHeapHandle);
|
|
|
|
|
- sbHeapHandle.ptr += incr;
|
|
|
|
|
- pixelShader->getViewDesc(4, desc);
|
|
|
|
|
- device->CreateConstantBufferView(&desc, sbHeapHandle);
|
|
|
|
|
- sbHeapHandle.ptr += incr;
|
|
|
|
|
-
|
|
|
|
|
uiTexture->updateTextur();
|
|
uiTexture->updateTextur();
|
|
|
|
|
|
|
|
- D3D12_SHADER_RESOURCE_VIEW_DESC vd;
|
|
|
|
|
- vd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
|
|
|
|
- vd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
|
|
|
|
- vd.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
|
|
|
|
- vd.Texture2D.MipLevels = 1;
|
|
|
|
|
- vd.Texture2D.MostDetailedMip = 0;
|
|
|
|
|
- vd.Texture2D.PlaneSlice = 0;
|
|
|
|
|
- vd.Texture2D.ResourceMinLODClamp = 0;
|
|
|
|
|
- device->CreateShaderResourceView(
|
|
|
|
|
- ((DX12Texture*)uiTexture)->getResource(), &vd, sbHeapHandle);
|
|
|
|
|
-
|
|
|
|
|
directCommandQueue->execute();
|
|
directCommandQueue->execute();
|
|
|
|
|
|
|
|
- res = device->CreateGraphicsPipelineState(
|
|
|
|
|
- &psoDesc, __uuidof(ID3D12PipelineState), (void**)&pipeline);
|
|
|
|
|
- if (FAILED(res))
|
|
|
|
|
- {
|
|
|
|
|
- factory->Release();
|
|
|
|
|
- Logging::error() << "ERROR: CreatePipelineState returned " << res
|
|
|
|
|
- << "\n";
|
|
|
|
|
- WMessageBox(fenster->getWindowHandle(),
|
|
|
|
|
- new Text("Fehler"),
|
|
|
|
|
- new Text("CreatePipelineState ist Fehlgeschlagen."),
|
|
|
|
|
- MB_ICONERROR);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
factory->Release();
|
|
factory->Release();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -942,8 +725,6 @@ void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
|
|
|
// directCommandQueue->getCommandList()->ClearRenderTargetView(
|
|
// directCommandQueue->getCommandList()->ClearRenderTargetView(
|
|
|
// rtv, color, 0, 0);
|
|
// rtv, color, 0, 0);
|
|
|
}
|
|
}
|
|
|
- int lc[] = {0, 0};
|
|
|
|
|
- pixelShader->fillConstBuffer((char*)lc, 4, sizeof(int) * 2);
|
|
|
|
|
|
|
|
|
|
uiTexture->updateTextur();
|
|
uiTexture->updateTextur();
|
|
|
}
|
|
}
|
|
@@ -953,22 +734,55 @@ void DirectX12::renderKamera(Cam3D* zKamera)
|
|
|
// TODO
|
|
// TODO
|
|
|
// directCommandQueue->getCommandList()->RSSetViewports(
|
|
// directCommandQueue->getCommandList()->RSSetViewports(
|
|
|
// 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
|
|
// 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
|
|
|
|
|
+ Mat4<float> identity = Mat4<float>::identity();
|
|
|
|
|
|
|
|
- Mat4<float> tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
|
|
|
|
|
-
|
|
|
|
|
- viewAndProj[0] = zKamera->getViewMatrix();
|
|
|
|
|
- viewAndProj[1] = zKamera->getProjectionMatrix();
|
|
|
|
|
- kamPos = zKamera->getWorldPosition();
|
|
|
|
|
- if (vertexShader)
|
|
|
|
|
- vertexShader->fillConstBuffer(
|
|
|
|
|
- (char*)viewAndProj, 0, sizeof(Mat4<float>) * 2);
|
|
|
|
|
- if (pixelShader)
|
|
|
|
|
- pixelShader->fillConstBuffer((char*)&kamPos, 2, sizeof(float) * 3);
|
|
|
|
|
World3D* w = zKamera->zWorld();
|
|
World3D* w = zKamera->zWorld();
|
|
|
- w->render([this](Model3D* obj) {
|
|
|
|
|
- // TODO: create or update top level aceleration structure if a model was
|
|
|
|
|
- // changed
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ ArrayIterator<D3D12_RAYTRACING_INSTANCE_DESC*> instanceIterator
|
|
|
|
|
+ = instanceDescs.begin();
|
|
|
|
|
+ int objectIndex = 0;
|
|
|
|
|
+ int instanceIndex = 0;
|
|
|
|
|
+ w->render(
|
|
|
|
|
+ [this, &instanceIterator, &objectIndex, &instanceIndex, &identity](
|
|
|
|
|
+ Model3D* obj) {
|
|
|
|
|
+ obj->calculateMatrices(identity, matrixBuffer);
|
|
|
|
|
+ int modelId = obj->zModelData()->getId();
|
|
|
|
|
+ DX12BLASModel* blasModel = blasModels[modelId];
|
|
|
|
|
+ ArrayIterator<int> boneIds = blasModel->zBoneIds()->begin();
|
|
|
|
|
+ for (const DX12BLAS* blas : *blasModel->zBLAS())
|
|
|
|
|
+ {
|
|
|
|
|
+ D3D12_RAYTRACING_INSTANCE_DESC* desc = 0;
|
|
|
|
|
+ if (instanceIndex < instanceDescs.getEntryCount())
|
|
|
|
|
+ {
|
|
|
|
|
+ desc = instanceIterator.val();
|
|
|
|
|
+ instanceIterator++;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ desc = new D3D12_RAYTRACING_INSTANCE_DESC();
|
|
|
|
|
+ instanceDescs.add(desc);
|
|
|
|
|
+ }
|
|
|
|
|
+ desc->InstanceID = objectIndex;
|
|
|
|
|
+ desc->InstanceContributionToHitGroupIndex = objectIndex;
|
|
|
|
|
+ desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
|
|
|
|
|
+ desc->InstanceMask = 0xFF;
|
|
|
|
|
+ desc->AccelerationStructure
|
|
|
|
|
+ = blas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ memcpy(desc->Transform,
|
|
|
|
|
+ &matrixBuffer[boneIds.val()],
|
|
|
|
|
+ sizeof(float) * 12);
|
|
|
|
|
+ boneIds++;
|
|
|
|
|
+ instanceIndex++;
|
|
|
|
|
+ }
|
|
|
|
|
+ objectIndex++;
|
|
|
|
|
+ });
|
|
|
|
|
+ // TODO: add gui model to instanceDescs if the gui should be rendered in
|
|
|
|
|
+ // this kamera
|
|
|
|
|
+ while (instanceIterator)
|
|
|
|
|
+ {
|
|
|
|
|
+ instanceIterator.val()->InstanceMask = 0;
|
|
|
|
|
+ instanceIterator++;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// TODO: call ray tracing
|
|
// TODO: call ray tracing
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -979,9 +793,6 @@ void DirectX12::presentFrame()
|
|
|
|
|
|
|
|
viewAndProj[0] = Mat4<float>::identity();
|
|
viewAndProj[0] = Mat4<float>::identity();
|
|
|
viewAndProj[1] = Mat4<float>::identity();
|
|
viewAndProj[1] = Mat4<float>::identity();
|
|
|
- if (vertexShader)
|
|
|
|
|
- vertexShader->fillConstBuffer(
|
|
|
|
|
- (char*)viewAndProj, 0, sizeof(Mat4<float>) * 2);
|
|
|
|
|
|
|
|
|
|
D3D12_RESOURCE_BARRIER barrier;
|
|
D3D12_RESOURCE_BARRIER barrier;
|
|
|
ZeroMemory(&barrier, sizeof(barrier));
|
|
ZeroMemory(&barrier, sizeof(barrier));
|