The objects that I have them displayed as transparent I want the part of the texture that is colored black to not be visible at all. How can I do that?
ColorKey with HLSL
The easiest way is to set an alpha channel in your texture at load time (i.e. if all of R, G and B are 0 then A is set to 0), then at runtime just enable alpha blending or alpha testing. You don't say which version of D3D you're using, but if you're creating and loading the texture manually you can do this with a simple pass over the texture data and an "if" statement (being sure to select D3DFMT_A8R8G8B8 or DXGI_FORMAT_R8G8B8A8_UNORM), if you're using D3DX then D3DXCreateTextureFromFileEx (D3D9) has an option to select a colour key (I don't see one available for D3D10/11 so you're SoL if they're what you're using).
The easiest way is to set an alpha channel in your texture at load time (i.e. if all of R, G and B are 0 then A is set to 0), then at runtime just enable alpha blending or alpha testing. You don't say which version of D3D you're using, but if you're creating and loading the texture manually you can do this with a simple pass over the texture data and an "if" statement (being sure to select D3DFMT_A8R8G8B8 or DXGI_FORMAT_R8G8B8A8_UNORM), if you're using D3DX then D3DXCreateTextureFromFileEx (D3D9) has an option to select a colour key (I don't see one available for D3D10/11 so you're SoL if they're what you're using).
I am using D3D9
here is what i am doing with my texture at load time.
hr = D3DXCreateTextureFromFileEx(Device,
TexturePath,
D3DX_DEFAULT,
D3DX_DEFAULT,
0,
0,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
D3DX_DEFAULT,
D3DX_DEFAULT,
0xFF000000,
NULL,
NULL,
&tex);
//0xFF000000 = black
here is how I enable transparency for the objects that need to be transparent
technique Transparent
{
pass Pass0
{
AlphaBlendEnable = true;
DestBlend = InvSrcAlpha;
VertexShader = compile vs_3_0 ShadowedSceneVertexShader();
PixelShader = compile ps_3_0 ShadowedScenePixelShader();
}
}
so what is happening right now, is that the the whole texture (that is on the transparent object) is transparent including the part with black color.
You're not setting SrcBlend in your effect, so it uses the default of One. Not sure if this is your intended behaviour, but try changing it to SrcAlpha and see what happens.
Also check your source images - if they have an alpha channel then your selected colour key will be invalid for them.
Look into the pixel shader command 'discard', this will give you the most flexibility.
example
bclr=tex2D(sampBase,In.UV);
if(bclr.w<TxtrData.y) { // don't need this pixel (alpha clipping)
discard;
}
I try SrcBlend = InvSrcAlpha; and SrcBlend = SrcAlpha; nothing really happened (with InvSrcAlpha the texture become a little darker )
the only difference i can see is that with SrcAlpha vs InvSrcAlpha is that invert the Alpha value
- the Output.Color.a = 1.0(in my PixelShader) is 100% transparent with SrcAlpha
- the Output.Color.a = 0.0 is 100% transparent with InvSrcAlpha
my source images were working before without the HLSL, anyway how can i check my source image if they have an alpha channel?