tiled lighting shadows update part4
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -18,7 +18,7 @@ struct LightArrayType
|
||||
uint type;
|
||||
// --
|
||||
float shadowBias;
|
||||
uint shadowMap_index;
|
||||
int shadowMap_index;
|
||||
float coneAngle;
|
||||
float coneAngleCos;
|
||||
// --
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user