【DX12を学びたい】テクスチャの透過データに対応する【αブレンド】

αブレンドの結果 DirextX

前回、テクスチャを表示しましたが、まだまだできないことが多いです。

今回は下記を行い、テクスチャの透明対応を行います。

1:ピクセルシェーダーの修正
2:アルファブレンドの設定

スポンサーリンク

ピクセルシェーダーの修正

サンプラーから返ってきた値にカラー値の乗算を追加します。

struct PSInput
{
    float4 pos : SV_POSITION;
    float4 color : COLOR;
    float2 uv : TEXCOORD;
};

Texture2D g_texture : register(t0);
SamplerState g_sampler : register(s0);

float4 PSMain( PSInput input ) : SV_TARGET
{
	return g_texture.Sample(g_sampler, input.uv) * input.color;
}

 

アルファブレンドの設定

アルファブレンドの設定はグラフィックスパイプラインの設定で行います。

D3D12_BLEND_DESCD3D12_RENDER_TARGET_BLEND_DESCを修正します。

下記がアルファブレンドの計算式なので、この計算になるようにブレンドを設定します。

OUTrgb = SRCrgb * SRCα + DESTrgb * (1 ー SRCα)

// グラフィックスパイプラインの設定
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};

//
// その他諸々の設定
//

// ブレンド状態の設定
psoDesc.BlendState.AlphaToCoverageEnable = FALSE;
psoDesc.BlendState.IndependentBlendEnable = FALSE;
const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
{
	FALSE,FALSE,
	D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
	D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
	D3D12_LOGIC_OP_NOOP,
	D3D12_COLOR_WRITE_ENABLE_ALL,
};
for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) {
	psoDesc.BlendState.RenderTarget[i] = defaultRenderTargetBlendDesc;
}

//---------------------------
//        修正部分

// ブレンドを有効にする
psoDesc.BlendState.RenderTarget[0].BlendEnable = TRUE;

// ピクセルシェーダーが出力するRGB値に対してαを乗算する(SRCrgb * SRCα)
psoDesc.BlendState.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA;

// レンダーターゲットの現在のRGB値に対して1-αを乗算する(DESTrgb * (1 ー SRCα))
psoDesc.BlendState.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA;

//---------------------------

 

さいごに

これで画像で透過されている部分は透明になり、頂点情報のカラー値(α)を変更して透明にすることもできるようになりました!

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
DirextX
スポンサーリンク
シェアする

コメント