Registriert seit: 20. Sep 2005
43 Beiträge
RAD-Studio 2009 Arc
|
Re: DirectX9 - Alphachannel einer Textur überschreiben
21. Jan 2010, 11: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
|
|
Zitat
|