3
\$\begingroup\$

I have two render targets:

  1. a fake backbuffer; a special render target where I do all my rendering.

  2. a light render target; where I render my light fx.

I'm sure I'm rendering correctly on both.

The problem arises when I overlay the light render target onto the fake backbuffer by drawing a quad covering it:

DxEngine.DrawSprite(0.0f, 0.0f, 0.0f,
    (float)DxEngine.GetWidth(), (float)DxEngine.GetHeight(),
    0xFFFFFFFF, LightSurface->GetTexture());

Regardless of what's in the light target, nothing is rendered onto the other target. I tried clearing the light target with full-white or full-black, but still get nothing.


Fake backbuffer created with

Direct3dDev->CreateTexture(Width, Height, 1, D3DUSAGE_RENDERTARGET,
    D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &Texture, nullptr);

Light render target created with

Direct3dDev->CreateTexture(Width, Height, 1, D3DUSAGE_RENDERTARGET,
    D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &Texture, nullptr);

I also tried to create both with D3DFMT_A8R8G8B8, again without difference. Both targets have the same width and height.

Only the fixed pipeline is used

DirectX setup for rendering :

Direct3dDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
Direct3dDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
Direct3dDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
Direct3dDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
Direct3dDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
Direct3dDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
Direct3dDev->SetRenderState(D3DRS_LIGHTING, false);
Direct3dDev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
Direct3dDev->SetRenderState(D3DRS_ZWRITEENABLE,D3DZB_TRUE);
Direct3dDev->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);

Direct3dDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  true );
Direct3dDev->SetRenderState(D3DRS_ALPHAREF, 0x00000000ul);
Direct3dDev->SetRenderState(D3DRS_ALPHATESTENABLE, true);
Direct3dDev->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATER);
Direct3dDev->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
Direct3dDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

Direct3dDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
Direct3dDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
Direct3dDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
Direct3dDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Direct3dDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
Direct3dDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

Direct3dDev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT);

Direct3dDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU);

//ensure the first stage is not used for now
Direct3dDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);

How can I do this right?

\$\endgroup\$
  • \$\begingroup\$ Should i add some more details to attract an answer?? \$\endgroup\$ – Chaotikmind Aug 17 '14 at 16:53
  • \$\begingroup\$ Yes, specifically how you set up your render targets, and how you set them to be rendered to. Are you trying to create a deferred renderer and want to write to multiple render targets at the same time MRT (msdn.microsoft.com/en-us/library/windows/desktop/… ) \$\endgroup\$ – Roy T. Aug 19 '14 at 18:19
  • \$\begingroup\$ Ok, i'll add that, and no i don't think we could call what i'm doing deferred rendering, i just want to write to a single target at a time, btw i'm only rendering quads, no real 3d here. \$\endgroup\$ – Chaotikmind Aug 19 '14 at 19:32
  • \$\begingroup\$ What's this: DxEngine.DrawSprite? \$\endgroup\$ – Laurent Couvidou Aug 21 '14 at 12:50
  • \$\begingroup\$ You have the depth tests enabled so it might be that all your pixels are discarded by that. Or maybe a problem with alpha. This is the kind of issue that can be easily solved using PIX / Visual Studio Graphics Debugger. Learn how to use it, you won't regret it. \$\endgroup\$ – Laurent Couvidou Aug 21 '14 at 12:59
0
\$\begingroup\$

Finally found the culprit, it was a really stupid typo error in my code, the light surface was not the same size as the backbuffer (width and height reversed)....

By the way i was able to pinpoint the problem really fast with PIX, if that can help someone.

\$\endgroup\$
  • \$\begingroup\$ Can you then mark your answer as correct answer? \$\endgroup\$ – alariq Jan 29 '15 at 19:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.