仅对某些输出颜色进行 alpha 混合
Only do alpha blending on certain output colors
在 MonoGame 中,我有一个具有两种输出颜色的像素着色器。
第一个是绘制到标准 4 通道 32 位颜色渲染目标的常规颜色。
第二个是绘制到 1 通道 16 位 HalfSingle 渲染目标的 z-index。
我想对第一种颜色进行 alpha 混合,但不对 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();
}
};
您可以为每个渲染目标设置一个独立的混合状态:
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;
您可以将不想混合的颜色的 alpha 设置为 1。这里我用于深度的渲染目标没有 alpha 通道,但这仍然有效。
output.depth.a = 1;
在 MonoGame 中,我有一个具有两种输出颜色的像素着色器。
第一个是绘制到标准 4 通道 32 位颜色渲染目标的常规颜色。
第二个是绘制到 1 通道 16 位 HalfSingle 渲染目标的 z-index。
我想对第一种颜色进行 alpha 混合,但不对 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();
}
};
您可以为每个渲染目标设置一个独立的混合状态:
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;
您可以将不想混合的颜色的 alpha 设置为 1。这里我用于深度的渲染目标没有 alpha 通道,但这仍然有效。
output.depth.a = 1;