Results 1 to 2 of 2

Thread: fxsubtract possible?

  1. #1

    Thumbs up fxsubtract possible? (Solved)

    In an older version of asphyre was a blendingeffect called fxsubtract. I used this effect to render holes into rendertargets by subtracting the color $ff000000 which made the alphachannel on the rendertarget go back to $00 (completly transparent)

    With this trick i could create mirrors in my game engine which were defined by a rectangle and everything outside was subtracted.

    I could re-enable the blending bug i mentioned in the unofficial release thread which actually exactly did that but that wouldn't work with DX11.
    Last edited by Zimond; 17-03-2014 at 11:05 PM.

  2. #2

    Thumbs up

    I cannot say I really understood how all this Source/Dest Blending stuff really works (all these values confuse me) but I was able to McGyver a solution that works in OpenGL, DX9 and DX11.

    I added another Blendingeffect to Aspyhre.Canvas called beEraser.

    In OpenGL.Canvas i added :
    Code:
      beEraser:
       glBlendFuncSeparate(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
    In DirectX9.canvas :
    Code:
    
      beEraser: 
     with D3D9Device do
      begin
       SetRenderState(D3DRS_SRCBLENDALPHA,  D3DBLEND_ZERO);
       SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA);
      
       SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_ZERO);
       SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
       SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
       SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
      end;
    In DirectX11.Types i had to duplicate the function DX11CreateBasicBlendState so that alpha blend values can be changed :

    Code:
    function DX11CreateBasicBlendStateAlpha(SrcBlend, DestBlend,SrcAlpha,DestAlpha: D3D11_BLEND;
     out BlendState: ID3D11BlendState): Boolean;
    var
     Desc: D3D11_BLEND_DESC;
    begin
     if (not Assigned(D3D11Device)) then
      begin
       BlendState:= nil;
       Result:= False;
       Exit;
      end;
    
     FillChar(Desc, SizeOf(D3D11_BLEND_DESC), 0);
    
     Desc.RenderTarget[0].BlendEnable:= True;
    
     Desc.RenderTarget[0].SrcBlend := SrcBlend;
     Desc.RenderTarget[0].DestBlend:= DestBlend;
     Desc.RenderTarget[0].BlendOp  := D3D11_BLEND_OP_ADD;
    
     Desc.RenderTarget[0].SrcBlendAlpha := SrcAlpha;   //These 2 were predefined and could not be changed in the original function
     Desc.RenderTarget[0].DestBlendAlpha:= DestAlpha;
     Desc.RenderTarget[0].BlendOpAlpha  := D3D11_BLEND_OP_ADD;
    
     Desc.RenderTarget[0].RenderTargetWriteMask:= Ord(D3D11_COLOR_WRITE_ENABLE_ALL);
    
     PushClearFPUState();
     try
      Result:= Succeeded(D3D11Device.CreateBlendState(Desc, BlendState));
     finally
      PopFPUState();
     end;
    
     if (not Result) then BlendState:= nil;
    end;
    and finally in directx11.canvas :

    Code:
     // "Eraser"
     DX11CreateBasicBlendStateAlpha(D3D11_BLEND_ZERO, D3D11_BLEND_INV_SRC_ALPHA,D3D11_BLEND_ZERO,D3D11_BLEND_INV_SRC_ALPHA,
      BlendingStates[beEraser]);
    And now i can rip holes into my rendertargets again ^^

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •