tiled lighting shadows update part4

This commit is contained in:
turanszkij
2016-10-05 23:11:14 +02:00
parent ca6ef1a92e
commit 6932beecf7
8 changed files with 190 additions and 226 deletions
-1
View File
@@ -233,7 +233,6 @@ void Renderable3DComponent::RenderShadows(GRAPHICSTHREAD threadID)
return;
}
wiRenderer::ClearShadowMaps(threadID);
wiRenderer::DrawForShadowMap(threadID);
}
void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID)
+12
View File
@@ -94,6 +94,10 @@
<AdditionalIncludeDirectories>BULLET;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -118,6 +122,10 @@
<AdditionalIncludeDirectories>BULLET;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -144,6 +152,8 @@
<AdditionalIncludeDirectories>BULLET;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -166,6 +176,8 @@
<AdditionalIncludeDirectories>BULLET;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
+1 -1
View File
@@ -305,7 +305,7 @@ inline void TiledLighting(in float2 pixel, in float3 N, in float3 V, in float3 P
[branch]
if ((saturate(ShTex.x) == ShTex.x) && (saturate(ShTex.y) == ShTex.y))
{
sh *= shadowCascade1(ShPos[0], ShTex.xy, light.shadowBias, 0);
sh *= shadowCascade1(ShPos, ShTex.xy, light.shadowBias, light.shadowMap_index);
}
}
result.diffuse *= sh;
+1 -1
View File
@@ -18,7 +18,7 @@ struct LightArrayType
uint type;
// --
float shadowBias;
uint shadowMap_index;
int shadowMap_index;
float coneAngle;
float coneAngleCos;
// --
+95 -31
View File
@@ -1647,9 +1647,7 @@ HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const S
D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc;
ZeroMemory(&uav_desc, sizeof(uav_desc));
uav_desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
uav_desc.Buffer.FirstElement = 0;
uav_desc.Format = desc.Format;
uav_desc.Buffer.NumElements = desc.Width * desc.Height;
uav_desc.Texture2D.MipSlice = 0;
hr = device->CreateUnorderedAccessView((*ppTexture2D)->texture2D_DX11, &uav_desc, &(*ppTexture2D)->unorderedAccessView_DX11);
@@ -1709,18 +1707,34 @@ HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture2D* pTexture)
}
else
{
shaderResourceViewDesc.ViewDimension = (multisampled ? D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY : D3D11_SRV_DIMENSION_TEXTURE2DARRAY);
shaderResourceViewDesc.Texture2DArray.FirstArraySlice = 0;
shaderResourceViewDesc.Texture2DArray.ArraySize = arraySize;
shaderResourceViewDesc.Texture2DArray.MostDetailedMip = 0; //from most detailed...
shaderResourceViewDesc.Texture2DArray.MipLevels = -1; //...to least detailed
if (multisampled)
{
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY;
shaderResourceViewDesc.Texture2DMSArray.FirstArraySlice = 0;
shaderResourceViewDesc.Texture2DMSArray.ArraySize = arraySize;
}
else
{
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
shaderResourceViewDesc.Texture2DArray.FirstArraySlice = 0;
shaderResourceViewDesc.Texture2DArray.ArraySize = arraySize;
shaderResourceViewDesc.Texture2DArray.MostDetailedMip = 0; //from most detailed...
shaderResourceViewDesc.Texture2DArray.MipLevels = -1; //...to least detailed
}
}
}
else
{
shaderResourceViewDesc.ViewDimension = (multisampled ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D);
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; //from most detailed...
shaderResourceViewDesc.Texture2D.MipLevels = -1; //...to least detailed
if (multisampled)
{
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
}
else
{
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; //from most detailed...
shaderResourceViewDesc.Texture2D.MipLevels = -1; //...to least detailed
}
}
hr = device->CreateShaderResourceView(pTexture->texture2D_DX11, &shaderResourceViewDesc, &pTexture->shaderResourceView_DX11);
@@ -1797,10 +1811,19 @@ HRESULT GraphicsDevice_DX11::CreateRenderTargetView(Texture2D* pTexture)
{
for (UINT i = 0; i < arraySize; ++i)
{
renderTargetViewDesc.ViewDimension = (multisampled ? D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY : D3D11_RTV_DIMENSION_TEXTURE2DARRAY);
renderTargetViewDesc.Texture2DArray.FirstArraySlice = i;
renderTargetViewDesc.Texture2DArray.ArraySize = 1;
renderTargetViewDesc.Texture2DArray.MipSlice = 0;
if (multisampled)
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
renderTargetViewDesc.Texture2DMSArray.FirstArraySlice = i;
renderTargetViewDesc.Texture2DMSArray.ArraySize = 1;
}
else
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
renderTargetViewDesc.Texture2DArray.FirstArraySlice = i;
renderTargetViewDesc.Texture2DArray.ArraySize = 1;
renderTargetViewDesc.Texture2DArray.MipSlice = 0;
}
pTexture->renderTargetViews_DX11.push_back(nullptr);
hr = device->CreateRenderTargetView(pTexture->texture2D_DX11, &renderTargetViewDesc, &pTexture->renderTargetViews_DX11[i]);
@@ -1810,15 +1833,31 @@ HRESULT GraphicsDevice_DX11::CreateRenderTargetView(Texture2D* pTexture)
{
if (arraySize > 1)
{
renderTargetViewDesc.ViewDimension = (multisampled ? D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY : D3D11_RTV_DIMENSION_TEXTURE2DARRAY);
renderTargetViewDesc.Texture2DArray.FirstArraySlice = 0;
renderTargetViewDesc.Texture2DArray.ArraySize = arraySize;
renderTargetViewDesc.Texture2DArray.MipSlice = 0;
if (multisampled)
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
renderTargetViewDesc.Texture2DMSArray.FirstArraySlice = 0;
renderTargetViewDesc.Texture2DMSArray.ArraySize = arraySize;
}
else
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
renderTargetViewDesc.Texture2DArray.FirstArraySlice = 0;
renderTargetViewDesc.Texture2DArray.ArraySize = arraySize;
renderTargetViewDesc.Texture2DArray.MipSlice = 0;
}
}
else
{
renderTargetViewDesc.ViewDimension = (multisampled ? D3D11_RTV_DIMENSION_TEXTURE2DMS : D3D11_RTV_DIMENSION_TEXTURE2D);
renderTargetViewDesc.Texture2D.MipSlice = 0;
if (multisampled)
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
}
else
{
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;
}
}
pTexture->renderTargetViews_DX11.push_back(nullptr);
@@ -1912,10 +1951,19 @@ HRESULT GraphicsDevice_DX11::CreateDepthStencilView(Texture2D* pTexture)
{
for (UINT i = 0; i < arraySize; ++i)
{
depthStencilViewDesc.ViewDimension = (multisampled ? D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY : D3D11_DSV_DIMENSION_TEXTURE2DARRAY);
depthStencilViewDesc.Texture2DArray.MipSlice = 0;
depthStencilViewDesc.Texture2DArray.FirstArraySlice = i;
depthStencilViewDesc.Texture2DArray.ArraySize = 1;
if (multisampled)
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY;
depthStencilViewDesc.Texture2DMSArray.FirstArraySlice = i;
depthStencilViewDesc.Texture2DMSArray.ArraySize = 1;
}
else
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
depthStencilViewDesc.Texture2DArray.MipSlice = 0;
depthStencilViewDesc.Texture2DArray.FirstArraySlice = i;
depthStencilViewDesc.Texture2DArray.ArraySize = 1;
}
pTexture->depthStencilViews_DX11.push_back(nullptr);
hr = device->CreateDepthStencilView(pTexture->texture2D_DX11, &depthStencilViewDesc, &pTexture->depthStencilViews_DX11[i]);
@@ -1925,15 +1973,31 @@ HRESULT GraphicsDevice_DX11::CreateDepthStencilView(Texture2D* pTexture)
{
if (arraySize > 1)
{
depthStencilViewDesc.ViewDimension = (multisampled ? D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY : D3D11_DSV_DIMENSION_TEXTURE2DARRAY);
depthStencilViewDesc.Texture2DArray.FirstArraySlice = 0;
depthStencilViewDesc.Texture2DArray.ArraySize = arraySize;
depthStencilViewDesc.Texture2DArray.MipSlice = 0;
if (multisampled)
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY;
depthStencilViewDesc.Texture2DMSArray.FirstArraySlice = 0;
depthStencilViewDesc.Texture2DMSArray.ArraySize = arraySize;
}
else
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
depthStencilViewDesc.Texture2DArray.FirstArraySlice = 0;
depthStencilViewDesc.Texture2DArray.ArraySize = arraySize;
depthStencilViewDesc.Texture2DArray.MipSlice = 0;
}
}
else
{
depthStencilViewDesc.ViewDimension = (multisampled ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D);
depthStencilViewDesc.Texture2D.MipSlice = 0;
if (multisampled)
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
}
else
{
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0;
}
}
pTexture->depthStencilViews_DX11.push_back(nullptr);
+1 -1
View File
@@ -4042,7 +4042,7 @@ Light::Light():Transform() {
lensFlareRimTextures.resize(0);
lensFlareNames.resize(0);
shadowMap_index = -1;
shadowBias = 9.99995464e-005f;
shadowBias = 0.0001f;
}
Light::~Light() {
for (string x : lensFlareNames)
+79 -189
View File
@@ -965,7 +965,7 @@ void wiRenderer::SetUpStates()
rs.FrontCounterClockwise=true;
rs.DepthBias=0;
rs.DepthBiasClamp=0;
rs.SlopeScaledDepthBias=4;
rs.SlopeScaledDepthBias = 4.0f;
rs.DepthClipEnable=true;
rs.ScissorEnable=false;
rs.MultisampleEnable=false;
@@ -977,7 +977,7 @@ void wiRenderer::SetUpStates()
rs.FrontCounterClockwise=true;
rs.DepthBias=0;
rs.DepthBiasClamp=0;
rs.SlopeScaledDepthBias=5.0f;
rs.SlopeScaledDepthBias = 5.0f;
rs.DepthClipEnable=true;
rs.ScissorEnable=false;
rs.MultisampleEnable=false;
@@ -2369,8 +2369,6 @@ void wiRenderer::DrawVolumeLights(Camera* camera, GRAPHICSTHREAD threadID)
GetDevice()->EventEnd(threadID);
}
}
void wiRenderer::DrawLensFlares(GRAPHICSTHREAD threadID)
{
const FrameCulling& culling = frameCullings[getCamera()];
@@ -2404,27 +2402,56 @@ void wiRenderer::DrawLensFlares(GRAPHICSTHREAD threadID)
}
}
void wiRenderer::ClearShadowMaps(GRAPHICSTHREAD threadID){
if (GetGameSpeed())
{
GetDevice()->UnBindResources(TEXSLOT_SHADOW0, 1 + TEXSLOT_SHADOW_CUBE - TEXSLOT_SHADOW0, threadID);
//for (unsigned int index = 0; index < Light::shadowMaps_pointLight.size(); ++index) {
// Light::shadowMaps_pointLight[index].Activate(threadID);
//}
//for (unsigned int index = 0; index < Light::shadowMaps_spotLight.size(); ++index) {
// Light::shadowMaps_spotLight[index].Activate(threadID);
//}
void wiRenderer::SetShadowProps2D(int resolution, int count, int softShadowQuality)
{
SHADOWRES_2D = resolution;
SHADOWCOUNT_2D = count;
SOFTSHADOWQUALITY_2D = softShadowQuality;
for (UINT i = 0; i < Light::shadowMapArray_2D->GetDesc().ArraySize; ++i)
{
GetDevice()->ClearDepthStencil(Light::shadowMapArray_2D, CLEAR_DEPTH, 1.0f, 0, threadID, i);
}
for (UINT i = 0; i < Light::shadowMapArray_Cube->GetDesc().ArraySize / 6; ++i)
{
GetDevice()->ClearDepthStencil(Light::shadowMapArray_Cube, CLEAR_DEPTH, 1.0f, 0, threadID, i);
}
}
SAFE_DELETE(Light::shadowMapArray_2D);
Light::shadowMapArray_2D = new Texture2D;
Light::shadowMapArray_2D->RequestIndepententRenderTargetArraySlices(true);
Texture2DDesc desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = SHADOWRES_2D;
desc.Height = SHADOWRES_2D;
desc.MipLevels = 1;
desc.ArraySize = SHADOWCOUNT_2D;
desc.Format = FORMAT_R32_TYPELESS;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = USAGE_DEFAULT;
desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
GetDevice()->CreateTexture2D(&desc, nullptr, &Light::shadowMapArray_2D);
}
void wiRenderer::SetShadowPropsCube(int resolution, int count)
{
SHADOWRES_CUBE = resolution;
SHADOWCOUNT_CUBE = count;
SAFE_DELETE(Light::shadowMapArray_Cube);
Light::shadowMapArray_Cube = new Texture2D;
Light::shadowMapArray_Cube->RequestIndepententRenderTargetArraySlices(true);
Light::shadowMapArray_Cube->RequestIndepententRenderTargetCubemapFaces(false);
Texture2DDesc desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = SHADOWRES_CUBE;
desc.Height = SHADOWRES_CUBE;
desc.MipLevels = 1;
desc.ArraySize = 6 * SHADOWCOUNT_CUBE;
desc.Format = FORMAT_R32_TYPELESS;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = USAGE_DEFAULT;
desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = RESOURCE_MISC_TEXTURECUBE;
GetDevice()->CreateTexture2D(&desc, nullptr, &Light::shadowMapArray_Cube);
}
void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
{
@@ -2432,24 +2459,33 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
{
GetDevice()->EventBegin(L"ShadowMap Render", threadID);
GetDevice()->UnBindResources(TEXSLOT_SHADOWARRAY_2D, 2, threadID);
const FrameCulling& culling = frameCullings[getCamera()];
const CulledList& culledLights = culling.culledLights;
ViewPort vp;
if (culledLights.size() > 0)
if (!culledLights.empty())
{
GetDevice()->UnBindResources(TEXSLOT_SHADOWARRAY_2D, 2, threadID);
for (UINT i = 0; i < Light::shadowMapArray_2D->GetDesc().ArraySize; ++i)
{
GetDevice()->ClearDepthStencil(Light::shadowMapArray_2D, CLEAR_DEPTH, 1.0f, 0, threadID, i);
}
for (UINT i = 0; i < Light::shadowMapArray_Cube->GetDesc().ArraySize / 6; ++i)
{
GetDevice()->ClearDepthStencil(Light::shadowMapArray_Cube, CLEAR_DEPTH, 1.0f, 0, threadID, i);
}
GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID);
GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_EFFECT], threadID);
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], STENCILREF_DEFAULT, threadID);
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID);
GetDevice()->BindBlendState(blendStates[BSTYPE_COLORWRITEDISABLE], threadID);
GetDevice()->BindPS(pixelShaders[PSTYPE_SHADOW], threadID);
@@ -2502,14 +2538,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
CulledList culledObjects;
CulledCollection culledRenderer;
//if (!l->shadowMaps_dirLight[index].IsInitialized() || l->shadowMaps_dirLight[index].depth->GetDesc().Height != SHADOWMAPRES)
//{
// // Create the shadow map
// l->shadowMaps_dirLight[index].Initialize(SHADOWMAPRES, SHADOWMAPRES, true, FORMAT_R32_FLOAT, 1, 1, true);
//}
//l->shadowMaps_dirLight[index].Activate(threadID);
vp.TopLeftX = 0;
vp.TopLeftY = 0;
vp.Width = (float)SHADOWRES_2D;
@@ -2530,7 +2558,12 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
#pragma region BLOAT
{
if (!culledObjects.empty()) {
if (!culledObjects.empty())
{
ShadowCB cb;
cb.mVP = l->shadowCam_dirLight[index].getVP();
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_SHADOW], &cb, threadID);
for (Cullable* object : culledObjects) {
culledRenderer[((Object*)object)->mesh].insert((Object*)object);
@@ -2547,10 +2580,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
else
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW_DOUBLESIDED], threadID);
//MAPPED_SUBRESOURCE mappedResource;
ShadowCB cb;
cb.mVP = l->shadowCam_dirLight[index].getVP();
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_SHADOW], &cb, threadID);
int k = 0;
@@ -2617,7 +2646,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
CulledList culledObjects;
CulledCollection culledRenderer;
//Light::shadowMaps_spotLight[i].Set(threadID);
vp.TopLeftX = 0;
vp.TopLeftY = 0;
vp.Width = (float)SHADOWRES_2D;
@@ -2634,7 +2662,12 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
#pragma region BLOAT
{
if (!culledObjects.empty()) {
if (!culledObjects.empty())
{
ShadowCB cb;
cb.mVP = l->shadowCam_spotLight[0].getVP();
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_SHADOW], &cb, threadID);
for (Cullable* object : culledObjects) {
culledRenderer[((Object*)object)->mesh].insert((Object*)object);
@@ -2651,12 +2684,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
else
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW_DOUBLESIDED], threadID);
//MAPPED_SUBRESOURCE mappedResource;
ShadowCB cb;
cb.mVP = l->shadowCam_spotLight[0].getVP();
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_SHADOW], &cb, threadID);
int k = 0;
for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) {
if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) {
@@ -2726,7 +2753,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
l->shadowMap_index = shadowCounter_Cube;
shadowCounter_Cube += 1;
//Light::shadowMaps_pointLight[i].Set(threadID);
vp.TopLeftX = 0;
vp.TopLeftY = 0;
vp.Width = (float)SHADOWRES_CUBE;
@@ -2736,7 +2762,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
GetDevice()->BindViewports(1, &vp, threadID);
GetDevice()->BindRenderTargets(0, nullptr, Light::shadowMapArray_Cube, threadID, l->shadowMap_index);
//MAPPED_SUBRESOURCE mappedResource;
PointLightCB lcb;
lcb.enerdis = l->enerDis;
lcb.pos = l->translation;
@@ -2820,151 +2845,16 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID)
GetDevice()->BindGS(nullptr, threadID);
}
GetDevice()->BindRenderTargets(0, nullptr, nullptr, threadID);
GetDevice()->BindResourcePS(Light::shadowMapArray_2D, TEXSLOT_SHADOWARRAY_2D, threadID);
GetDevice()->BindResourcePS(Light::shadowMapArray_Cube, TEXSLOT_SHADOWARRAY_CUBE, threadID);
}
GetDevice()->EventEnd(threadID);
}
GetDevice()->BindRenderTargets(0, nullptr, nullptr, threadID);
GetDevice()->BindResourcePS(Light::shadowMapArray_2D, TEXSLOT_SHADOWARRAY_2D, threadID);
GetDevice()->BindResourcePS(Light::shadowMapArray_Cube, TEXSLOT_SHADOWARRAY_CUBE, threadID);
}
//void wiRenderer::SetDirectionalLightShadowProps(int resolution, int softShadowQuality)
//{
// SHADOWMAPRES = resolution;
// SOFTSHADOW = softShadowQuality;
//
// SAFE_DELETE(Light::dirLightShadowMapArray);
// Light::dirLightShadowMapArray = new Texture2D;
// Light::dirLightShadowMapArray->RequestIndepententRenderTargetArraySlices(true);
//
// Texture2DDesc desc;
// ZeroMemory(&desc, sizeof(desc));
// desc.Width = SHADOWMAPRES;
// desc.Height = SHADOWMAPRES;
// desc.MipLevels = 1;
// desc.ArraySize = 3;
// desc.Format = FORMAT_R32_TYPELESS;
// desc.SampleDesc.Count = 1;
// desc.SampleDesc.Quality = 0;
// desc.Usage = USAGE_DEFAULT;
// desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
// desc.CPUAccessFlags = 0;
// desc.MiscFlags = 0;
// GetDevice()->CreateTexture2D(&desc, nullptr, &Light::dirLightShadowMapArray);
//}
//void wiRenderer::SetPointLightShadowProps(int shadowMapCount, int resolution)
//{
// POINTLIGHTSHADOW = shadowMapCount;
// POINTLIGHTSHADOWRES = resolution;
// //Light::shadowMaps_pointLight.clear();
// //Light::shadowMaps_pointLight.resize(shadowMapCount);
// //for (int i = 0; i < shadowMapCount; ++i)
// //{
// // Light::shadowMaps_pointLight[i].InitializeCube(POINTLIGHTSHADOWRES, true, FORMAT_R32_FLOAT, 1, true);
// //}
//
// SAFE_DELETE(Light::pointLightShadowMapArray);
// Light::pointLightShadowMapArray = new Texture2D;
// Light::pointLightShadowMapArray->RequestIndepententRenderTargetArraySlices(true);
// Light::pointLightShadowMapArray->RequestIndepententRenderTargetCubemapFaces(false);
//
// Texture2DDesc desc;
// ZeroMemory(&desc, sizeof(desc));
// desc.Width = POINTLIGHTSHADOWRES;
// desc.Height = POINTLIGHTSHADOWRES;
// desc.MipLevels = 1;
// desc.ArraySize = 6 * POINTLIGHTSHADOW;
// desc.Format = FORMAT_R32_TYPELESS;
// desc.SampleDesc.Count = 1;
// desc.SampleDesc.Quality = 0;
// desc.Usage = USAGE_DEFAULT;
// desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
// desc.CPUAccessFlags = 0;
// desc.MiscFlags = RESOURCE_MISC_TEXTURECUBE;
// GetDevice()->CreateTexture2D(&desc, nullptr, &Light::pointLightShadowMapArray);
//}
//void wiRenderer::SetSpotLightShadowProps(int shadowMapCount, int resolution)
//{
// SPOTLIGHTSHADOW = shadowMapCount;
// SPOTLIGHTSHADOWRES = resolution;
// //Light::shadowMaps_spotLight.clear();
// //Light::shadowMaps_spotLight.resize(shadowMapCount);
// //for (int i = 0; i < shadowMapCount; ++i)
// //{
// // Light::shadowMaps_spotLight[i].Initialize(SPOTLIGHTSHADOWRES, SPOTLIGHTSHADOWRES, true, FORMAT_R32_FLOAT, 1, 1, true);
// //}
//
// SAFE_DELETE(Light::spotLightShadowMapArray);
// Light::spotLightShadowMapArray = new Texture2D;
// Light::spotLightShadowMapArray->RequestIndepententRenderTargetArraySlices(true);
//
// Texture2DDesc desc;
// ZeroMemory(&desc, sizeof(desc));
// desc.Width = SPOTLIGHTSHADOWRES;
// desc.Height = SPOTLIGHTSHADOWRES;
// desc.MipLevels = 1;
// desc.ArraySize = SPOTLIGHTSHADOW;
// desc.Format = FORMAT_R32_TYPELESS;
// desc.SampleDesc.Count = 1;
// desc.SampleDesc.Quality = 0;
// desc.Usage = USAGE_DEFAULT;
// desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
// desc.CPUAccessFlags = 0;
// desc.MiscFlags = 0;
// GetDevice()->CreateTexture2D(&desc, nullptr, &Light::spotLightShadowMapArray);
//}
void wiRenderer::SetShadowProps2D(int resolution, int count, int softShadowQuality)
{
SHADOWRES_2D = resolution;
SHADOWCOUNT_2D = count;
SOFTSHADOWQUALITY_2D = softShadowQuality;
SAFE_DELETE(Light::shadowMapArray_2D);
Light::shadowMapArray_2D = new Texture2D;
Light::shadowMapArray_2D->RequestIndepententRenderTargetArraySlices(true);
Texture2DDesc desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = SHADOWRES_2D;
desc.Height = SHADOWRES_2D;
desc.MipLevels = 1;
desc.ArraySize = SHADOWCOUNT_2D;
desc.Format = FORMAT_R32_TYPELESS;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = USAGE_DEFAULT;
desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
GetDevice()->CreateTexture2D(&desc, nullptr, &Light::shadowMapArray_2D);
}
void wiRenderer::SetShadowPropsCube(int resolution, int count)
{
SHADOWRES_CUBE = resolution;
SHADOWCOUNT_CUBE = count;
SAFE_DELETE(Light::shadowMapArray_Cube);
Light::shadowMapArray_Cube = new Texture2D;
Light::shadowMapArray_Cube->RequestIndepententRenderTargetArraySlices(true);
Light::shadowMapArray_Cube->RequestIndepententRenderTargetCubemapFaces(false);
Texture2DDesc desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = SHADOWRES_CUBE;
desc.Height = SHADOWRES_CUBE;
desc.MipLevels = 1;
desc.ArraySize = 6 * SHADOWCOUNT_CUBE;
desc.Format = FORMAT_R32_TYPELESS;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = USAGE_DEFAULT;
desc.BindFlags = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = RESOURCE_MISC_TEXTURECUBE;
GetDevice()->CreateTexture2D(&desc, nullptr, &Light::shadowMapArray_Cube);
}
PSTYPES GetPSTYPE(SHADERTYPE shaderType, const Material* const material)
{
+1 -2
View File
@@ -293,7 +293,7 @@ public:
XMFLOAT3 directionWS;
UINT type;
float shadowBias;
UINT shadowMap_index;
int shadowMap_index;
float coneAngle;
float coneAngleCos;
XMMATRIX shadowMatrix[3];
@@ -419,7 +419,6 @@ public:
static void DrawSun(GRAPHICSTHREAD threadID);
static void DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD threadID
, bool isReflection, SHADERTYPE shaderType, wiGraphicsTypes::Texture2D* refRes, bool grass);
static void ClearShadowMaps(GRAPHICSTHREAD threadID);
static void DrawForShadowMap(GRAPHICSTHREAD threadID);
static void DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, wiGraphicsTypes::Texture2D* refracRes, wiGraphicsTypes::Texture2D* refRes
, wiGraphicsTypes::Texture2D* waterRippleNormals, GRAPHICSTHREAD threadID, bool grass = false);