ColorKey with HLSL

Started by
4 comments, last by michaelmk86 11 years, 1 month ago

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?

Advertisement

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).

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

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.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

Look into the pixel shader command 'discard', this will give you the most flexibility.


bclr.w = alpha channel, x-red, y-green,z-blue, you can use any color you want and not even have an alpha channel in the texture
TxtrData.y = the value I used to clip the image with

example


 
bclr=tex2D(sampBase,In.UV);
if(bclr.w<TxtrData.y) {                    // don't need this pixel (alpha clipping)
    discard;
}

******************************************************************************************
Youtube Channel

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?

This topic is closed to new replies.

Advertisement