Sign in to follow this  

ColorKey with HLSL

This topic is 1777 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

Edited by michaelmk86

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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;
}
Edited by LancerSolurus

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

This topic is 1777 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this