Advertisement
Guest User

Untitled

a guest
Jul 27th, 2010
688
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.49 KB | None | 0 0
  1. #include "ShadowmapResolver.h"
  2. #define CHECK(A, B) if((HRESULT)A != S_OK){ \
  3. std::cout << "D3D '" << (int)B << "' error: 0x"; \
  4. std::cout << std::hex << (HRESULT)A << std::endl; \
  5. }
  6.  
  7. ShadowmapResolver::ShadowmapResolver(ShadowmapSize maxShadowmapSize, ShadowmapSize maxDepthBufferSize)
  8. {
  9.     D3DXCreateSprite(static_cast<D3DRenderSystem*>((D3DRenderSystem*)EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice(), &quadRender);
  10.  
  11.     reductionChainCount = (int)maxShadowmapSize;
  12.     baseSize = 2 << reductionChainCount;
  13.     depthBufferSize = 2 << (int)maxDepthBufferSize;
  14. }
  15.  
  16. void ShadowmapResolver::LoadContent()
  17. {
  18.     LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
  19.     HRESULT hr = D3DXCreateEffectFromFile(device, "../Media/Shaders/reductionEffect.fx", NULL, NULL, D3DXSHADER_DEBUG, NULL, &reductionEffect, NULL);
  20.     CHECK(hr, 0);
  21.     hr = D3DXCreateEffectFromFile(device, "../Media/Shaders/resolveShadowsEffect.fx", NULL, NULL, 0, NULL, &resolveShadowsEffect, NULL);
  22.     CHECK(hr, 0);
  23.  
  24.     hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &distortRT);
  25.     CHECK(hr, 1);
  26.     hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &distancesRT);
  27.     CHECK(hr, 2);
  28.     hr = D3DXCreateTexture(device, 2, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &shadowMap);
  29.     CHECK(hr, 3);
  30.     //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &distortRT, NULL);
  31.     //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &distancesRT, NULL);
  32.     //device->CreateTexture(2, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &shadowMap, NULL);
  33.     reductionRT = new LPDIRECT3DTEXTURE9[reductionChainCount];
  34.     for (int i = 0; i < reductionChainCount; i++)
  35.     {
  36.         hr = D3DXCreateTexture(device, 2 << i, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &reductionRT[i]);
  37.         CHECK(hr, 4);
  38.         //device->CreateTexture(2 << i, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &reductionRT[i], NULL);
  39.     }
  40.  
  41.     hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &shadowsRT);
  42.     CHECK(hr, 5);
  43.     hr = D3DXCreateTexture(device, baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &processedShadowsRT);
  44.     CHECK(hr, 6);
  45.     //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &shadowsRT, NULL);
  46.     //device->CreateTexture(baseSize, baseSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &processedShadowsRT, NULL);
  47. }
  48.  
  49. static bool drawn = false;
  50. void ShadowmapResolver::ResolveShadows(LPDIRECT3DTEXTURE9 shadowCastersTexture, LPDIRECT3DTEXTURE9 result, Vector2 lightPosition)
  51. {
  52.     //graphicsDevice.BlendState = BlendState.Opaque;
  53.  
  54.     ExecuteTechnique(shadowCastersTexture, distancesRT, "ComputeDistances");
  55.  
  56.     if(!drawn)
  57.     {
  58.         HRESULT hr = D3DXSaveTextureToFileA("shadowCastersTexture.png", D3DXIFF_PNG, shadowCastersTexture, 0);
  59.         CHECK(hr, 10);
  60.     }
  61.  
  62.     if(!drawn)
  63.     {
  64.         HRESULT hr = D3DXSaveTextureToFileA("DistancesRT.png", D3DXIFF_PNG, distancesRT, 0);
  65.         CHECK(hr, 10);
  66.     }
  67.  
  68.     ExecuteTechnique(distancesRT, distortRT, "Distort");
  69.     if(!drawn)
  70.     {
  71.         HRESULT hr = D3DXSaveTextureToFileA("distortRT.png", D3DXIFF_PNG, distortRT, 0);
  72.         CHECK(hr, 10);
  73.     }
  74.  
  75.     ApplyHorizontalReduction(distortRT, shadowMap);
  76.     if(!drawn)
  77.     {
  78.         HRESULT hr = D3DXSaveTextureToFileA("shadowMap.png", D3DXIFF_PNG, shadowMap, 0);
  79.         CHECK(hr, 10);
  80.     }
  81.  
  82.     ExecuteTechnique(NULL, shadowsRT, "DrawShadows", shadowMap);
  83.     if(!drawn)
  84.     {
  85.         HRESULT hr = D3DXSaveTextureToFileA("shadowsRT.png", D3DXIFF_PNG, shadowsRT, 0);
  86.         CHECK(hr, 10);
  87.     }
  88.  
  89.     ExecuteTechnique(shadowsRT, processedShadowsRT, "BlurHorizontally");
  90.     if(!drawn)
  91.     {
  92.         HRESULT hr = D3DXSaveTextureToFileA("processedShadowsRT.png", D3DXIFF_PNG, processedShadowsRT, 0);
  93.         CHECK(hr, 10);
  94.     }
  95.  
  96.     ExecuteTechnique(processedShadowsRT, result, "BlurVerticallyAndAttenuate");
  97.     if(!drawn)
  98.     {
  99.         HRESULT hr = D3DXSaveTextureToFileA("result.png", D3DXIFF_PNG, result, 0);
  100.         CHECK(hr, 10);
  101.         drawn = true;
  102.     }
  103. }
  104.  
  105. void ShadowmapResolver::ExecuteTechnique(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination, std::string techniqueName)
  106. {
  107.     ExecuteTechnique(source, destination, techniqueName, NULL);
  108. }
  109.  
  110. void ShadowmapResolver::ExecuteTechnique(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination, std::string techniqueName, LPDIRECT3DTEXTURE9 shadowMap)
  111. {
  112.     LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
  113.     Vector2 renderTargetSize((float)baseSize, (float)baseSize);
  114.     //graphicsDevice.SetRenderTarget(destination);
  115.     //graphicsDevice.Clear(Color.White);
  116.        
  117.     LPDIRECT3DSURFACE9 currentRenderTarget;
  118.     device->GetRenderTarget(0, &currentRenderTarget);
  119.  
  120.     LPDIRECT3DSURFACE9 surface;
  121.     destination->GetSurfaceLevel(0, &surface);
  122.  
  123.     device->SetRenderTarget(0, surface);
  124.     device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1.0f);
  125.     device->BeginScene();
  126.  
  127.     quadRender->Begin(D3DXSPRITE_ALPHABLEND);
  128.     //resolveShadowsEffect->SetFloatArray(resolveShadowsEffect->GetParameterByName(0, "renderTargetSize"), (FLOAT*)&renderTargetSize, 2);
  129.     //resolveShadowsEffect->Parameters["renderTargetSize"].SetValue(renderTargetSize);
  130.  
  131.     D3DXVECTOR4 size(renderTargetSize.absX, renderTargetSize.absY, 0, 0);
  132.     HRESULT hr = resolveShadowsEffect->SetVector(resolveShadowsEffect->GetParameterByName(0, "renderTargetSize"), &size);
  133.     CHECK(hr, 21);
  134.  
  135.     if (source != NULL)
  136.     {
  137.         hr = resolveShadowsEffect->SetTexture(resolveShadowsEffect->GetParameterByName(0, "InputTexture"), source);
  138.         CHECK(hr, 22);
  139.     }
  140.  
  141.     if (shadowMap != NULL)
  142.     {
  143.         hr = resolveShadowsEffect->SetTexture(resolveShadowsEffect->GetParameterByName(0, "ShadowMapTexture"), shadowMap);
  144.         CHECK(hr, 23);
  145.     }
  146.  
  147.     hr = resolveShadowsEffect->SetTechnique(resolveShadowsEffect->GetTechniqueByName(techniqueName.c_str()));
  148.     CHECK(hr, 24);
  149.          
  150.     UINT passes;
  151.     hr = resolveShadowsEffect->Begin(&passes, 0);
  152.     CHECK(hr, 27);
  153.  
  154.     for(int i = 0;i<(int)passes;i++)
  155.     {
  156.         hr = resolveShadowsEffect->BeginPass(i);
  157.         CHECK(hr, 25);
  158.  
  159.         Vector2 startPos = Vector2(1, 1)*-1;
  160.         Vector2 endPos = Vector2(1, 1);
  161.  
  162.         Vertex verts[4];
  163.         verts[0].pos.absX = endPos.absX;
  164.         verts[0].pos.absY = startPos.absY;
  165.  
  166.         verts[1].pos.absX = startPos.absX;
  167.         verts[1].pos.absY = startPos.absY;
  168.  
  169.         verts[2].pos.absX = startPos.absX;
  170.         verts[2].pos.absY = endPos.absY;
  171.  
  172.         verts[3].pos.absX = endPos.absX;
  173.         verts[3].pos.absY = endPos.absY;
  174.  
  175.         short ib[] = { 0, 1, 2, 2, 3, 0 };
  176.         hr = device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
  177.         CHECK(hr, 20);
  178.  
  179.         hr = resolveShadowsEffect->EndPass();
  180.         CHECK(hr, 26);
  181.     }
  182.  
  183.     hr = resolveShadowsEffect->End();
  184.     CHECK(hr, 28);
  185.  
  186.     quadRender->End();
  187.     device->EndScene();
  188.  
  189.     device->SetRenderTarget(0, currentRenderTarget);
  190. }
  191.  
  192.  
  193. void ShadowmapResolver::ApplyHorizontalReduction(LPDIRECT3DTEXTURE9 source, LPDIRECT3DTEXTURE9 destination)
  194. {
  195.     LPDIRECT3DDEVICE9 device = static_cast<D3DRenderSystem*>(EngineRoot::GetSingleton()->GetRenderSystem())->GetD3DDevice();
  196.  
  197.     int step = reductionChainCount-1;
  198.     LPDIRECT3DTEXTURE9 s = source;
  199.     LPDIRECT3DTEXTURE9 d = reductionRT[step];
  200.     reductionEffect->SetTechnique(reductionEffect->GetTechniqueByName("HorizontalReduction"));
  201.  
  202.     LPDIRECT3DSURFACE9 currentRenderTarget;
  203.     device->GetRenderTarget(0, &currentRenderTarget);
  204.  
  205.     while (step >= 0)
  206.     {
  207.         d = reductionRT[step];
  208.         LPDIRECT3DSURFACE9 dSurface;
  209.         d->GetSurfaceLevel(0, &dSurface);
  210.  
  211.         device->SetRenderTarget(0, dSurface);
  212.         device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1);
  213.         device->BeginScene();
  214.  
  215.         quadRender->Begin(D3DXSPRITE_ALPHABLEND);
  216.         reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), s);
  217.  
  218.         Vector2 textureDim(1.0f / (float)baseSize, 1.0f / (float)baseSize);
  219.         reductionEffect->SetValue(reductionEffect->GetParameterByName(0, "TextureDimensions"), &textureDim, sizeof(float)*2);
  220.  
  221.         UINT passes;
  222.         reductionEffect->Begin(&passes, 0);
  223.  
  224.         for(int i = 0;i<(int)passes;i++)
  225.         {
  226.             reductionEffect->BeginPass(i);
  227.             Vector2 startPos = Vector2(1, 1)*-1;
  228.             Vector2 endPos = Vector2(1, 1);
  229.  
  230.             Vertex verts[4];
  231.             verts[0].pos.absX = endPos.absX;
  232.             verts[0].pos.absY = startPos.absY;
  233.  
  234.             verts[1].pos.absX = startPos.absX;
  235.             verts[1].pos.absY = startPos.absY;
  236.  
  237.             verts[2].pos.absX = startPos.absX;
  238.             verts[2].pos.absY = endPos.absY;
  239.  
  240.             verts[3].pos.absX = endPos.absX;
  241.             verts[3].pos.absY = endPos.absY;
  242.  
  243.             short ib[] = { 0, 1, 2, 2, 3, 0 };
  244.             device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
  245.             reductionEffect->EndPass();
  246.         }
  247.  
  248.         reductionEffect->End();
  249.  
  250.         quadRender->End();
  251.         device->EndScene();
  252.         device->SetRenderTarget(0, currentRenderTarget);
  253.  
  254.         s = d;
  255.         step--;
  256.     }
  257.  
  258.     LPDIRECT3DSURFACE9 destSurface;
  259.     destination->GetSurfaceLevel(0, &destSurface);
  260.  
  261.     device->SetRenderTarget(0, destSurface);
  262.     device->Clear(0, 0, D3DCLEAR_TARGET, 0xFFFFFFFF, 0, 1);
  263.     device->BeginScene();
  264.  
  265.     quadRender->Begin(D3DXSPRITE_ALPHABLEND);
  266.     reductionEffect->SetTechnique(reductionEffect->GetTechniqueByName("Copy"));
  267.     reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), d);
  268.  
  269.     UINT passes;
  270.     reductionEffect->Begin(&passes, 0);
  271.  
  272.     for(int i = 0;i<(int)passes;i++)
  273.     {
  274.         reductionEffect->BeginPass(i);
  275.         Vector2 startPos = Vector2(1, 1)*-1;
  276.         Vector2 endPos = Vector2(1, 1);
  277.  
  278.         Vertex verts[4];
  279.         verts[0].pos.absX = endPos.absX;
  280.         verts[0].pos.absY = startPos.absY;
  281.  
  282.         verts[1].pos.absX = startPos.absX;
  283.         verts[1].pos.absY = startPos.absY;
  284.  
  285.         verts[2].pos.absX = startPos.absX;
  286.         verts[2].pos.absY = endPos.absY;
  287.  
  288.         verts[3].pos.absX = endPos.absX;
  289.         verts[3].pos.absY = endPos.absY;
  290.  
  291.         short ib[] = { 0, 1, 2, 2, 3, 0 };
  292.         device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ib, D3DFMT_INDEX16, &verts, sizeof(Vertex));
  293.         reductionEffect->EndPass();
  294.     }
  295.  
  296.     reductionEffect->End();
  297.  
  298.     reductionEffect->SetTexture(reductionEffect->GetParameterByName(0, "SourceTexture"), reductionRT[reductionChainCount - 1]);
  299.        
  300.     quadRender->End();
  301.     device->EndScene();
  302.     device->SetRenderTarget(0, currentRenderTarget);
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement