Делайте альфа-смешивание только для определенных выходных цветов - PullRequest
0 голосов
/ 01 декабря 2018

В MonoGame у меня есть пиксельный шейдер, который имеет два выходных цвета.

Первый - это обычный цвет, рисуемый для стандартной 4-канальной 32-битной цветовой цели визуализации.

Вторым является z-индекс, отрисованный для одноканальной 16-битной цели рендеринга HalfSingle.

Я хочу сделать альфа-смешивание на первом цвете, но не на z-index.

Есть ли способ сделать это без объявления сэмплера для базовой текстуры и выполнения alphablendingвручную?

matrix WorldViewProjection;

Texture2D SpriteTexture;

sampler2D SpriteTextureSampler = sampler_state
{
    Texture = <SpriteTexture>;
};

struct VertexShaderOutput
{
    float4 Position : SV_POSITION;
    float4 Color : COLOR0;
    float2 TextureCoordinates : TEXCOORD0;
    float2 depth : TEXCOORD1;
};

struct PS_OUTPUT
{
    float4 color : COLOR0;
    float4 depth : COLOR1;
};

VertexShaderOutput SpriteVertexShader(float4 position : POSITION0, float2 float4 color : COLOR0, float2 texCoord : TEXCOORD0)
{
    VertexShaderOutput output = (VertexShaderOutput)0;
    output.Position = mul(position, WorldViewProjection);
    output.Color = color;
    output.TextureCoordinates = texCoord;
    output.depth.x = position.z;
    return output;
}

PS_OUTPUT SpritePixelShader(VertexShaderOutput input) : COLOR
{
    PS_OUTPUT output = (PS_OUTPUT)0;
    float4 color = tex2D(SpriteTextureSampler, input.TextureCoordinates) * input.Color;
    output.color = color;
    output.depth.x = input.depth.x;
    return output;
}

technique SpriteDrawing
{
    pass P0
    {
        VertexShader = compile vs_2_0 SpriteVertexShader();
        PixelShader = compile ps_2_0 SpritePixelShader();
    }
};

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете установить альфа цвета, который вы не хотите смешивать, равным 1. Здесь у цели рендеринга, которую я использую для глубины, нет альфа-канала, но это все еще работает.

output.depth.a = 1;
0 голосов
/ 29 декабря 2018

Вы можете установить состояние наложения, которое является независимым для каждой цели рендеринга:

BlendState myBlendState = new BlendState();
myBlendState.IndependentBlendEnable = true;

//0 is default and is opaque, modify the blend operation
myBlendState[0].ColorDestinationBlend = Blend.DestinationAlpha;
myBlendState[0].ColorSourceBlend = Blend.InverseDestinationAlpha;

//1 is opaque, no changes needed
myBlendState[1] = noBlend ;

Затем вы можете присоединить это состояние, используя:

//if you want to restore
var oldBlendState = device.BlendState;

device.BlendState = myBlendState;

//do your draw here
//Restore old blend state if needed
device.BlendState = oldBlendState;
...