Jump to content

  • Log In with Google      Sign In   
  • Create Account


ColorKey with HLSL


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 06 March 2013 - 10:31 AM

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, 06 March 2013 - 10:33 AM.


Sponsor:

#2 mhagain   Crossbones+   -  Reputation: 7865

Like
0Likes
Like

Posted 06 March 2013 - 01:27 PM

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


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#3 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 06 March 2013 - 01:48 PM

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.



#4 mhagain   Crossbones+   -  Reputation: 7865

Like
0Likes
Like

Posted 06 March 2013 - 02:01 PM

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.


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#5 LancerSolurus   Members   -  Reputation: 586

Like
0Likes
Like

Posted 06 March 2013 - 03:35 PM

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, 06 March 2013 - 03:36 PM.

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


#6 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 06 March 2013 - 03:37 PM

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?






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS