compute shaders

This commit is contained in:
2026-06-13 01:51:28 +03:00
parent 3b128315e7
commit b8aa36ccc0
28 changed files with 498 additions and 170 deletions

View File

@@ -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);