Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ShadowmapResolver.h"
- #define CHECK(A, B) if((HRESULT)A != S_OK){ \
- std::cout << "D3D '" << (int)B << "' error: 0x"; \
- std::cout << std::hex << (HRESULT)A << std::endl; \
- }
- ShadowmapResolver::ShadowmapResolver(ShadowmapSize maxShadowmapSize, ShadowmapSize maxDepthBufferSize)
- {
- D3DXCreateSprite(static_cast<D3DRenderSystem*>((D3DRenderSystem*)EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice(), &quadRender);
- reductionChainCount = (int)maxShadowmapSize;
- baseSize = 2 << reductionChainCount;
- depthBufferSize = 2 << (int)maxDepthBufferSize;
- }
- void ShadowmapResolver::LoadContent()
- {
- LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
- HRESULT hr = D3DXCreateEffectFromFile(device, "../Media/Shaders/reductionEffect.fx", NULL, NULL, D3DXSHADER_DEBUG, NULL, &reductionEffect, NULL);
- CHECK(hr, 0);
- hr = D3DXCreateEffectFromFile(device, "../Media/Shaders/resolveShadowsEffect.fx", NULL, NULL, 0, NULL, &resolveShadowsEffect, NULL);
- CHECK(hr, 0);
- hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &distortRT);
- CHECK(hr, 1);
- hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &distancesRT);
- CHECK(hr, 2);
- hr = D3DXCreateTexture(device, 2, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &shadowMap);
- CHECK(hr, 3);
- //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &distortRT, NULL);
- //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &distancesRT, NULL);
- //device->CreateTexture(2, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &shadowMap, NULL);
- reductionRT = new LPDIRECT3DTEXTURE9[reductionChainCount];
- for (int i = 0; i < reductionChainCount; i++)
- {
- hr = D3DXCreateTexture(device, 2 << i, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &reductionRT[i]);
- CHECK(hr, 4);
- //device->CreateTexture(2 << i, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &reductionRT[i], NULL);
- }
- hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &shadowsRT);
- CHECK(hr, 5);
- hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &processedShadowsRT);
- CHECK(hr, 6);
- //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &shadowsRT, NULL);
- //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &processedShadowsRT, NULL);
- }
- static bool drawn = false;
- void ShadowmapResolver::ResolveShadows(LPDIRECT3DTEXTURE9 shadowCastersTexture, LPDIRECT3DTEXTURE9 result, Vector2 lightPosition)
- {
- //graphicsDevice.BlendState = BlendState.Opaque;
- ExecuteTechnique(shadowCastersTexture, distancesRT, "ComputeDistances");
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("shadowCastersTexture.png", D3DXIFF_PNG, shadowCastersTexture, 0);
- CHECK(hr, 10);
- }
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("DistancesRT.png", D3DXIFF_PNG, distancesRT, 0);
- CHECK(hr, 10);
- }
- ExecuteTechnique(distancesRT, distortRT, "Distort");
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("distortRT.png", D3DXIFF_PNG, distortRT, 0);
- CHECK(hr, 10);
- }
- ApplyHorizontalReduction(distortRT, shadowMap);
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("shadowMap.png", D3DXIFF_PNG, shadowMap, 0);
- CHECK(hr, 10);
- }
- ExecuteTechnique(NULL, shadowsRT, "DrawShadows", shadowMap);
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("shadowsRT.png", D3DXIFF_PNG, shadowsRT, 0);
- CHECK(hr, 10);
- }
- ExecuteTechnique(shadowsRT, processedShadowsRT, "BlurHorizontally");
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("processedShadowsRT.png", D3DXIFF_PNG, processedShadowsRT, 0);
- CHECK(hr, 10);
- }
- ExecuteTechnique(processedShadowsRT, result, "BlurVerticallyAndAttenuate");
- if(!drawn)
- {
- HRESULT hr = D3DXSaveTextureToFileA("result.png", D3DXIFF_PNG, result, 0);
- CHECK(hr, 10);
- drawn = true;
- }
- }
- void ShadowmapResolver::ExecuteTechnique(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination, std::string techniqueName)
- {
- ExecuteTechnique(source, destination, techniqueName, NULL);
- }
- void ShadowmapResolver::ExecuteTechnique(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination, std::string techniqueName, LPDIRECT3DTEXTURE9 shadowMap)
- {
- LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
- Vector2 renderTargetSize((float)baseSize, (float)baseSize);
- //graphicsDevice.SetRenderTarget(destination);
- //graphicsDevice.Clear(Color.White);
- LPDIRECT3DSURFACE9 currentRenderTarget;
- device->GetRenderTarget(0, ¤tRenderTarget);
- LPDIRECT3DSURFACE9 surface;
- destination->GetSurfaceLevel(0, &surface);
- device->SetRenderTarget(0, surface);
- device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1.0f);
- device->BeginScene();
- quadRender->Begin(D3DXSPRITE_ALPHABLEND);
- //resolveShadowsEffect->SetFloatArray(resolveShadowsEffect->GetParameterByName(0, "renderTargetSize"), (FLOAT*)&renderTargetSize, 2);
- //resolveShadowsEffect->Parameters["renderTargetSize"].SetValue(renderTargetSize);
- D3DXVECTOR4 size(renderTargetSize.absX, renderTargetSize.absY, 0, 0);
- HRESULT hr = resolveShadowsEffect->SetVector(resolveShadowsEffect->GetParameterByName(0, "renderTargetSize"), &size);
- CHECK(hr, 21);
- if (source != NULL)
- {
- hr = resolveShadowsEffect->SetTexture(resolveShadowsEffect->GetParameterByName(0, "InputTexture"), source);
- CHECK(hr, 22);
- }
- if (shadowMap != NULL)
- {
- hr = resolveShadowsEffect->SetTexture(resolveShadowsEffect->GetParameterByName(0, "ShadowMapTexture"), shadowMap);
- CHECK(hr, 23);
- }
- hr = resolveShadowsEffect->SetTechnique(resolveShadowsEffect->GetTechniqueByName(techniqueName.c_str()));
- CHECK(hr, 24);
- UINT passes;
- hr = resolveShadowsEffect->Begin(&passes, 0);
- CHECK(hr, 27);
- for(int i = 0;i<(int)passes;i++)
- {
- hr = resolveShadowsEffect->BeginPass(i);
- CHECK(hr, 25);
- Vector2 startPos = Vector2(1, 1)*-1;
- Vector2 endPos = Vector2(1, 1);
- Vertex verts[4];
- verts[0].pos.absX = endPos.absX;
- verts[0].pos.absY = startPos.absY;
- verts[1].pos.absX = startPos.absX;
- verts[1].pos.absY = startPos.absY;
- verts[2].pos.absX = startPos.absX;
- verts[2].pos.absY = endPos.absY;
- verts[3].pos.absX = endPos.absX;
- verts[3].pos.absY = endPos.absY;
- short ib[] = { 0, 1, 2, 2, 3, 0 };
- hr = device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
- CHECK(hr, 20);
- hr = resolveShadowsEffect->EndPass();
- CHECK(hr, 26);
- }
- hr = resolveShadowsEffect->End();
- CHECK(hr, 28);
- quadRender->End();
- device->EndScene();
- device->SetRenderTarget(0, currentRenderTarget);
- }
- void ShadowmapResolver::ApplyHorizontalReduction(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination)
- {
- LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
- int step = reductionChainCount-1;
- LPDIRECT3DTEXTURE9 s = source;
- LPDIRECT3DTEXTURE9 d = reductionRT[step];
- reductionEffect->SetTechnique(reductionEffect->GetTechniqueByName("HorizontalReduction"));
- LPDIRECT3DSURFACE9 currentRenderTarget;
- device->GetRenderTarget(0, ¤tRenderTarget);
- while (step >= 0)
- {
- d = reductionRT[step];
- LPDIRECT3DSURFACE9 dSurface;
- d->GetSurfaceLevel(0, &dSurface);
- device->SetRenderTarget(0, dSurface);
- device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1);
- device->BeginScene();
- quadRender->Begin(D3DXSPRITE_ALPHABLEND);
- reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), s);
- Vector2 textureDim(1.0f / (float)baseSize, 1.0f / (float)baseSize);
- reductionEffect->SetValue(reductionEffect->GetParameterByName(0, "TextureDimensions"), &textureDim, sizeof(float)*2);
- UINT passes;
- reductionEffect->Begin(&passes, 0);
- for(int i = 0;i<(int)passes;i++)
- {
- reductionEffect->BeginPass(i);
- Vector2 startPos = Vector2(1, 1)*-1;
- Vector2 endPos = Vector2(1, 1);
- Vertex verts[4];
- verts[0].pos.absX = endPos.absX;
- verts[0].pos.absY = startPos.absY;
- verts[1].pos.absX = startPos.absX;
- verts[1].pos.absY = startPos.absY;
- verts[2].pos.absX = startPos.absX;
- verts[2].pos.absY = endPos.absY;
- verts[3].pos.absX = endPos.absX;
- verts[3].pos.absY = endPos.absY;
- short ib[] = { 0, 1, 2, 2, 3, 0 };
- device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
- reductionEffect->EndPass();
- }
- reductionEffect->End();
- quadRender->End();
- device->EndScene();
- device->SetRenderTarget(0, currentRenderTarget);
- s = d;
- step--;
- }
- LPDIRECT3DSURFACE9 destSurface;
- destination->GetSurfaceLevel(0, &destSurface);
- device->SetRenderTarget(0, destSurface);
- device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1);
- device->BeginScene();
- quadRender->Begin(D3DXSPRITE_ALPHABLEND);
- reductionEffect->SetTechnique(reductionEffect->GetTechniqueByName("Copy"));
- reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), d);
- UINT passes;
- reductionEffect->Begin(&passes, 0);
- for(int i = 0;i<(int)passes;i++)
- {
- reductionEffect->BeginPass(i);
- Vector2 startPos = Vector2(1, 1)*-1;
- Vector2 endPos = Vector2(1, 1);
- Vertex verts[4];
- verts[0].pos.absX = endPos.absX;
- verts[0].pos.absY = startPos.absY;
- verts[1].pos.absX = startPos.absX;
- verts[1].pos.absY = startPos.absY;
- verts[2].pos.absX = startPos.absX;
- verts[2].pos.absY = endPos.absY;
- verts[3].pos.absX = endPos.absX;
- verts[3].pos.absY = endPos.absY;
- short ib[] = { 0, 1, 2, 2, 3, 0 };
- device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
- reductionEffect->EndPass();
- }
- reductionEffect->End();
- reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), reductionRT[reductionChainCount - 1]);
- quadRender->End();
- device->EndScene();
- device->SetRenderTarget(0, currentRenderTarget);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement