From 21ff947d0d1b610fcb35612eae8b0707d916fbf9 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Fri, 31 Mar 2017 20:32:17 +0200 Subject: [PATCH] updated transparent pass temporal AA --- WickedEngine/temporalAAResolvePS.hlsl | 1 + WickedEngine/wiGraphicsDevice_DX11.cpp | 60 ++++++++++++++++++++----- WickedEngine/wiRenderer.cpp | 17 +++++-- WickedEngine/wiTextureHelper.cpp | 62 ++++++++++++++++++++++++++ WickedEngine/wiTextureHelper.h | 2 + 5 files changed, 127 insertions(+), 15 deletions(-) diff --git a/WickedEngine/temporalAAResolvePS.hlsl b/WickedEngine/temporalAAResolvePS.hlsl index 23dd5b7fe..ceadeb039 100644 --- a/WickedEngine/temporalAAResolvePS.hlsl +++ b/WickedEngine/temporalAAResolvePS.hlsl @@ -1,4 +1,5 @@ #include "postProcessHF.hlsli" +#include "reconstructPositionHF.hlsli" float4 main(VertexToPixelPostProcess PSIn) : SV_TARGET { diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 96f6e98fd..95db476cf 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -869,15 +869,12 @@ inline D3D11_TEXTURE3D_DESC _ConvertTexture3DDesc(const Texture3DDesc* pDesc) return desc; } -inline D3D11_SUBRESOURCE_DATA* _ConvertSubresourceData(const SubresourceData* pInitialData) +inline D3D11_SUBRESOURCE_DATA _ConvertSubresourceData(const SubresourceData& pInitialData) { - if (pInitialData == nullptr) - return nullptr; - - D3D11_SUBRESOURCE_DATA* data = new D3D11_SUBRESOURCE_DATA; - data->pSysMem = pInitialData->pSysMem; - data->SysMemPitch = pInitialData->SysMemPitch; - data->SysMemSlicePitch = pInitialData->SysMemSlicePitch; + D3D11_SUBRESOURCE_DATA data; + data.pSysMem = pInitialData.pSysMem; + data.SysMemPitch = pInitialData.SysMemPitch; + data.SysMemSlicePitch = pInitialData.SysMemSlicePitch; return data; } @@ -1581,10 +1578,19 @@ HRESULT GraphicsDevice_DX11::CreateBuffer(const GPUBufferDesc *pDesc, const Subr desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); desc.StructureByteStride = pDesc->StructureByteStride; - D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + D3D11_SUBRESOURCE_DATA* data = nullptr; + if (pInitialData != nullptr) + { + data = new D3D11_SUBRESOURCE_DATA[1]; + for (UINT slice = 0; slice < 1; ++slice) + { + data[slice] = _ConvertSubresourceData(pInitialData[slice]); + } + } ppBuffer->desc = *pDesc; HRESULT hr = device->CreateBuffer(&desc, data, &ppBuffer->resource_DX11); + SAFE_DELETE_ARRAY(data); assert(SUCCEEDED(hr) && "GPUBuffer creation failed!"); if (SUCCEEDED(hr)) @@ -1658,11 +1664,21 @@ HRESULT GraphicsDevice_DX11::CreateTexture1D(const Texture1DDesc* pDesc, const S (*ppTexture1D)->desc = *pDesc; D3D11_TEXTURE1D_DESC desc = _ConvertTexture1DDesc(&(*ppTexture1D)->desc); - D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + + D3D11_SUBRESOURCE_DATA* data = nullptr; + if (pInitialData != nullptr) + { + data = new D3D11_SUBRESOURCE_DATA[pDesc->ArraySize]; + for (UINT slice = 0; slice < pDesc->ArraySize; ++slice) + { + data[slice] = _ConvertSubresourceData(pInitialData[slice]); + } + } HRESULT hr = S_OK; hr = device->CreateTexture1D(&desc, data, &((*ppTexture1D)->texture1D_DX11)); + SAFE_DELETE_ARRAY(data); assert(SUCCEEDED(hr) && "Texture1D creation failed!"); if (FAILED(hr)) return hr; @@ -1711,11 +1727,21 @@ HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const S } D3D11_TEXTURE2D_DESC desc = _ConvertTexture2DDesc(&(*ppTexture2D)->desc); - D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + + D3D11_SUBRESOURCE_DATA* data = nullptr; + if (pInitialData != nullptr) + { + data = new D3D11_SUBRESOURCE_DATA[pDesc->ArraySize]; + for (UINT slice = 0; slice < pDesc->ArraySize; ++slice) + { + data[slice] = _ConvertSubresourceData(pInitialData[slice]); + } + } HRESULT hr = S_OK; hr = device->CreateTexture2D(&desc, data, &((*ppTexture2D)->texture2D_DX11)); + SAFE_DELETE_ARRAY(data); assert(SUCCEEDED(hr) && "Texture2D creation failed!"); if (FAILED(hr)) return hr; @@ -1772,11 +1798,21 @@ HRESULT GraphicsDevice_DX11::CreateTexture3D(const Texture3DDesc* pDesc, const S (*ppTexture3D)->desc = *pDesc; D3D11_TEXTURE3D_DESC desc = _ConvertTexture3DDesc(&(*ppTexture3D)->desc); - D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + + D3D11_SUBRESOURCE_DATA* data = nullptr; + if (pInitialData != nullptr) + { + data = new D3D11_SUBRESOURCE_DATA[1]; + for (UINT slice = 0; slice < 1; ++slice) + { + data[slice] = _ConvertSubresourceData(pInitialData[slice]); + } + } HRESULT hr = S_OK; hr = device->CreateTexture3D(&desc, data, &((*ppTexture3D)->texture3D_DX11)); + SAFE_DELETE_ARRAY(data); assert(SUCCEEDED(hr) && "Texture3D creation failed!"); if (FAILED(hr)) return hr; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index cfa5355d3..4803383d3 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -3998,8 +3998,11 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex void wiRenderer::DrawSky(GRAPHICSTHREAD threadID) { - if (enviroMap == nullptr) - return; + if (!GetTemporalAAEnabled()) // If temporal AA is enabled, we should render a velocity map anyway, so render a black sky as that is the default! + { + if (enviroMap == nullptr) + return; + } GetDevice()->EventBegin("DrawSky", threadID); @@ -4011,7 +4014,15 @@ void wiRenderer::DrawSky(GRAPHICSTHREAD threadID) GetDevice()->BindVS(vertexShaders[VSTYPE_SKY], threadID); GetDevice()->BindPS(pixelShaders[PSTYPE_SKY], threadID); - GetDevice()->BindResourcePS(enviroMap, TEXSLOT_ENV_GLOBAL, threadID); + if (enviroMap != nullptr) + { + GetDevice()->BindResourcePS(enviroMap, TEXSLOT_ENV_GLOBAL, threadID); + } + else + { + // If control gets here, it means we fill out only a velocity buffer on the background for temporal AA + GetDevice()->BindResourcePS(wiTextureHelper::getInstance()->getBlackCubeMap(), TEXSLOT_ENV_GLOBAL, threadID); + } GetDevice()->BindVertexBuffer(nullptr,0,0,threadID); GetDevice()->BindVertexLayout(nullptr, threadID); diff --git a/WickedEngine/wiTextureHelper.cpp b/WickedEngine/wiTextureHelper.cpp index 7b3618212..6533d9e29 100644 --- a/WickedEngine/wiTextureHelper.cpp +++ b/WickedEngine/wiTextureHelper.cpp @@ -98,6 +98,68 @@ Texture2D* wiTextureHelper::wiTextureHelperInstance::getNormalMapDefault() return getColor(wiColor(127, 127, 255, 255)); } +Texture2D* wiTextureHelper::wiTextureHelperInstance::getBlackCubeMap() +{ + if (helperTextures[HELPERTEXTURE_BLACKCUBEMAP] != nullptr) + { + return helperTextures[HELPERTEXTURE_BLACKCUBEMAP]; + } + + int width = 1; + int height = 1; + + struct vector4b + { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + + vector4b(unsigned char r=0, unsigned char g=0, unsigned char b=0, unsigned char a=0) :r(r), g(g), b(b), a(a) {} + }; + + Texture2DDesc texDesc; + texDesc.Width = width; + texDesc.Height = height; + texDesc.MipLevels = 1; + texDesc.ArraySize = 6; + texDesc.Format = FORMAT_R8G8B8A8_UNORM; + texDesc.CPUAccessFlags = 0; + texDesc.SampleDesc.Count = 1; + texDesc.SampleDesc.Quality = 0; + texDesc.Usage = USAGE_DEFAULT; + texDesc.BindFlags = BIND_SHADER_RESOURCE; + texDesc.CPUAccessFlags = 0; + texDesc.MiscFlags = RESOURCE_MISC_TEXTURECUBE; + + SubresourceData pData[6]; + std::vector d[6]; // 6 images of type vector4b = 4 * unsigned char + + for (int cubeMapFaceIndex = 0; cubeMapFaceIndex < 6; cubeMapFaceIndex++) + { + d[cubeMapFaceIndex].resize(width * height); + + // fill with black color + std::fill( + d[cubeMapFaceIndex].begin(), + d[cubeMapFaceIndex].end(), + vector4b(0, 0, 0, 0)); + + pData[cubeMapFaceIndex].pSysMem = &d[cubeMapFaceIndex][0];// description.data; + pData[cubeMapFaceIndex].SysMemPitch = width * 4; + pData[cubeMapFaceIndex].SysMemSlicePitch = 0; + } + + HRESULT hr = wiRenderer::GetDevice()->CreateTexture2D(&texDesc, &pData[0], &helperTextures[HELPERTEXTURE_BLACKCUBEMAP]); + + if (FAILED(hr)) + { + return nullptr; + } + + return helperTextures[HELPERTEXTURE_BLACKCUBEMAP]; +} + Texture2D* wiTextureHelper::wiTextureHelperInstance::getWhite() { return getColor(wiColor(255, 255, 255, 255)); diff --git a/WickedEngine/wiTextureHelper.h b/WickedEngine/wiTextureHelper.h index cec3d7004..246571d11 100644 --- a/WickedEngine/wiTextureHelper.h +++ b/WickedEngine/wiTextureHelper.h @@ -15,6 +15,7 @@ private: HELPERTEXTURE_RANDOM64X64, HELPERTEXTURE_COLORGRADEDEFAULT, HELPERTEXTURE_NORMALMAPDEFAULT, + HELPERTEXTURE_BLACKCUBEMAP, HELPERTEXTURE_COUNT }; wiGraphicsTypes::Texture2D* helperTextures[HELPERTEXTURE_COUNT]; @@ -27,6 +28,7 @@ private: wiGraphicsTypes::Texture2D* getRandom64x64(); wiGraphicsTypes::Texture2D* getColorGradeDefault(); wiGraphicsTypes::Texture2D* getNormalMapDefault(); + wiGraphicsTypes::Texture2D* getBlackCubeMap(); wiGraphicsTypes::Texture2D* getWhite(); wiGraphicsTypes::Texture2D* getBlack();