compute shaders
This commit is contained in:
@@ -147,6 +147,7 @@ private:
|
||||
IImage *m_pDepthImage = NULL;
|
||||
IImage *m_pNormalImage = NULL;
|
||||
IImage *m_pWorldSpaceImage = NULL;
|
||||
IImage *m_pStorageOutputImage = NULL;
|
||||
IRenderCommandList *m_pRasterCommandList = NULL;
|
||||
IBuffer *m_pViewBuffer;
|
||||
ViewBuffer_t *m_pViewBufferData;
|
||||
@@ -155,6 +156,9 @@ private:
|
||||
IShader *m_pRasterShader;
|
||||
IMaterial *m_pRasterMaterial;
|
||||
|
||||
IComputeShader *m_pPostProcessing;
|
||||
IMaterial *m_pPostProcessingMaterial;
|
||||
|
||||
vec3 m_vPos;
|
||||
versor m_vRot;
|
||||
};
|
||||
@@ -212,13 +216,17 @@ void CFunnyWorldRenderer::Init()
|
||||
IMAGE_FORMAT_D32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pStorageOutputImage = g_pRenderContext->CreateStorageImage(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES
|
||||
);
|
||||
m_pRasterShader = g_pRenderContext->CreateShader("game/core/shaders/mesh_raster.shader_c");
|
||||
ConfigureShader(m_pRasterShader);
|
||||
m_pRasterShader->Build();
|
||||
m_pRasterMaterial = g_pRenderContext->CreateMaterial(m_pRasterShader);
|
||||
|
||||
g_pMainWindow->SetOutputImage(m_pResolvedOutputImage);
|
||||
|
||||
m_pRasterCommandList = g_pRenderContext->CreateCommandList();
|
||||
m_pViewBuffer = g_pRenderContext->CreateConstantBuffer(sizeof(ViewBuffer_t));
|
||||
m_pTextures = g_pRenderContext->CreateTextureArray();
|
||||
@@ -226,6 +234,13 @@ void CFunnyWorldRenderer::Init()
|
||||
IRayTracingShader *prt = g_pRenderContext->CreateRayShader("game/core/shaders/mesh_trace.shader_c");
|
||||
prt->AddShader("error", "game/core/shaders/funny_error.shader_c");
|
||||
prt->Build();
|
||||
|
||||
m_pPostProcessing = g_pRenderContext->CreateComputeShader("game/core/shaders/agx.shader_c");
|
||||
m_pPostProcessing->Build();
|
||||
|
||||
m_pPostProcessingMaterial = g_pRenderContext->CreateMaterial(m_pPostProcessing);
|
||||
|
||||
g_pMainWindow->SetOutputImage(m_pResolvedOutputImage);
|
||||
}
|
||||
|
||||
void CFunnyWorldRenderer::Tick( float fDelta )
|
||||
@@ -255,9 +270,11 @@ void CFunnyWorldRenderer::Frame( float fDelta )
|
||||
if (g_pMainWindow->BRenderSizeUpdated())
|
||||
{
|
||||
g_pRenderContext->DestroyImage(m_pOutputImage);
|
||||
g_pRenderContext->DestroyImage(m_pResolvedOutputImage);
|
||||
g_pRenderContext->DestroyImage(m_pNormalImage);
|
||||
g_pRenderContext->DestroyImage(m_pWorldSpaceImage);
|
||||
g_pRenderContext->DestroyImage(m_pDepthImage);
|
||||
g_pRenderContext->DestroyImage(m_pStorageOutputImage);
|
||||
|
||||
m_pOutputImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
@@ -287,7 +304,13 @@ void CFunnyWorldRenderer::Frame( float fDelta )
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_D32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
g_pMainWindow->SetOutputImage(m_pResolvedOutputImage);
|
||||
m_pStorageOutputImage = g_pRenderContext->CreateStorageImage(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES
|
||||
);
|
||||
g_pMainWindow->SetOutputImage(m_pStorageOutputImage);
|
||||
}
|
||||
m_pRasterCommandList->StartRecording();
|
||||
m_pRasterCommandList->SetRenderResolution(uWidth, uHeight);
|
||||
@@ -329,6 +352,7 @@ void CFunnyWorldRenderer::Frame( float fDelta )
|
||||
pDataBuffer->Unmap();
|
||||
pDataBuffer->Unlock();
|
||||
g_pRenderContext->DestroyBuffer(pDataBuffer);
|
||||
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(0, m_pViewBuffer);
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(1, pDataBuffer);
|
||||
m_pRasterMaterial->PSSetTextureArray(1, m_pTextures);
|
||||
@@ -345,6 +369,13 @@ void CFunnyWorldRenderer::Frame( float fDelta )
|
||||
}
|
||||
|
||||
m_pRasterCommandList->ResolveImage(m_pOutputImage, m_pResolvedOutputImage);
|
||||
|
||||
m_pPostProcessingMaterial->CSSetTexture(0, 0, m_pResolvedOutputImage);
|
||||
m_pPostProcessingMaterial->CSSetTexture(1, 0, m_pStorageOutputImage);
|
||||
m_pRasterCommandList->SetMaterial(m_pPostProcessingMaterial);
|
||||
m_pRasterCommandList->Barrier(m_pResolvedOutputImage, true, false);
|
||||
m_pRasterCommandList->Barrier(m_pStorageOutputImage, false, true);
|
||||
m_pRasterCommandList->DispatchCompute(uWidth, uHeight, 1);
|
||||
m_pRasterCommandList->EndRecording();
|
||||
|
||||
g_pRenderContext->SubmitCommandList(m_pRasterCommandList);
|
||||
|
||||
Reference in New Issue
Block a user