public override void SetAlphaRejectSettings( CompareFunction func, byte value, bool alphaToCoverage)
{
var a2C = false;
if ( func != CompareFunction.AlwaysPass )
{
SetRenderState( RenderState.AlphaTestEnable, true );
a2C = alphaToCoverage;
}
else
{
SetRenderState( RenderState.AlphaTestEnable, false );
}
// Set always just be sure
SetRenderState(RenderState.AlphaFunc, (int)D3DHelper.ConvertEnum(func));
SetRenderState(RenderState.AlphaRef, value);
// Alpha to coverage
if ( !Capabilities.HasCapability( Graphics.Capabilities.AlphaToCoverage ) )
return;
// Vendor-specific hacks on renderstate, gotta love 'em
switch ( Capabilities.Vendor )
{
case GPUVendor.Nvidia:
if ( a2C )
{
SetRenderState( RenderState.AdaptiveTessY, ( 'A' | ( 'T' ) << 8 | ( 'O' ) << 16 | ( 'C' ) << 24 ) );
}
else
{
SetRenderState( RenderState.AdaptiveTessY, (int)Format.Unknown );
}
break;
case GPUVendor.Ati:
if ( a2C )
{
SetRenderState( RenderState.AdaptiveTessY, ( 'A' | ( '2' ) << 8 | ( 'M' ) << 16 | ( '1' ) << 24 ) );
}
else
{
// discovered this through trial and error, seems to work
SetRenderState( RenderState.AdaptiveTessY, ( 'A' | ( '2' ) << 8 | ( 'M' ) << 16 | ( '0' ) << 24 ) );
}
break;
}
// no hacks available for any other vendors?
//lasta2c = a2c;
}