Einzelnen Beitrag anzeigen

XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: DirectX9 - Alphachannel einer Textur überschreiben

  Alt 21. Jan 2010, 10:39
Hi Frederic,

gute Idee. Hier ist zunächst mal der Pixelshader:

Code:
shared texture texture1;
shared texture maskTexture;

sampler2D textureSampler1 = sampler_state

    Texture = <texture1>;
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
    AddressU = Mirror;
    AddressV = Mirror;
};
 
sampler2D maskSampler = sampler_state

    Texture = <maskTexture>;
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
    AddressU = Mirror;
   AddressV = Mirror;
};

struct VertexShaderOutput

   float2 texC : TEXCOORD0;
};

float4 PixScene( VertexShaderOutput input ) : COLOR0 

    float4 color1 = tex2D( textureSampler1, input.texC );
    float4 color2 = tex2D( maskSampler, input.texC );
    color1.a = color2.a;
    return color1;                    


technique RenderScene

    pass P0 
    { 
        VertexShader = NULL;
        PixelShader = compile ps_2_0 PixScene();
    } 
}
Die Datei wird wie folgt geladen:

Delphi-Quellcode:
  // Shader laden {Shader_Ground: ID3DXEffect}
  D3DXCreateEffectFromFileA(Device, PChar('Shader.fx'), 0, nil, 0, nil, Shader_Ground, nil);
Ihm werden 2 Texturen übergeben - die Boden-Textur (in meinem Bild oben die linke obere) und die Maske (die rechte obere). Der Shader kombiniert die beiden Texturen, er nimmt RGB von der Textur und den Alpha-Channel von der Maske. Das Ergebnis schreibt er auf das RenderTarget vom DirectX Device.

Der Aufruf des Shaders erfolgt in meinem Code so:

Delphi-Quellcode:
  {Texture, Mask, Output_Texture: IDirect3DTexture9}
  {Output_Surface: IDirect3DSurface9}
  
  Shader_Ground.SetTexture('texture1', Texture);
  Shader_Ground.SetTexture('maskTexture', Mask);

  // Textur für die Ausgabe erstellen
  D3DXCreateTexture(Device, GROUND_WIDTH, GROUND_HEIGHT, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, Output_Texture);
  Output_Texture.GetSurfaceLevel(0, Output_Surface);

  // RenderTarget auf die Ausgabe-Textur setzen
  Device.SetRenderTarget(0, Output_Surface);
  Device.Clear(0, nil, D3DCLEAR_TARGET, $0, 0, 0);

  // Shader wird aufgerufen
  {i: integer, l: LongWord}

  Shader_Ground._Begin(@l, 0);
  for i := 0 to l - 1 do begin
    Shader_Ground.Pass(i);
  end;

  // An dieser Stelle zeichne ich via Vertex die Ausgabe-Textur auf den Backbuffer
  // Funktioniert nicht mit Sprites

  Shader_Ground._End;
Gruß an alle,
Xoric
"Gods are fragile things; they may be killed by a whiff of science or a dose of common sense."
- Chapman Cohen
  Mit Zitat antworten Zitat