Что такое «альфа» значение пиксельного шейдера? - PullRequest
0 голосов
/ 28 мая 2019

Привет, день, когда я делаю 2d игру с использованием API DirectX11.и пришло время указать, что мне нужно использовать прозрачный эффект.

, поэтому у меня зеленый фон и один след в середине.enter image description here и просто без установки ничего, кроме альфа-значения возвращаемого цвета в пиксельном шейдере, я добился небольшого успеха, но проблема в том, что он не работает для белого цвета.

это код пиксельного шейдера

cbuffer CB_TRANSPARENCY : register(b0)
{
    float tp;
};

Texture2D footprint : register(t0);
SamplerState samplerState : register(s0);

struct PS_INPUT
{
    float4 pos : SV_POSITION;
    float2 tex : TEXCOORD;
};

float4 main(PS_INPUT input) : SV_Target
{
    float3 texColor = footprint.Sample(samplerState, input.tex).xyz;
    return float4(texColor, tp);
}

это что-то, что мне не хватает?или я должен использовать некоторые вещи blendingstate?любая помощь будет оценена

[править] вот что редактировать.на самом деле альфа-значение ничего не делает без настройки смешивания.только одна переменная, которая будет использоваться для любого пользовательского расчета.В моем проекте я использовал spritebathch, класс spritefont для рендеринга шрифта на экране, поэтому я предполагаю, что в классе spritebatch может быть blendingState под капотом, который смешивает черный цвет, так что я получил этот эффект без установки моего blendingState.

1 Ответ

0 голосов
/ 28 мая 2019

Да, вам нужно создать состояние наложения с соответствующим режимом альфа-обработки, а затем убедиться, что созданное состояние наложения присоединено к стадии слияния вывода конвейера рендеринга до рисования:

D3D11_BLEND_DESC blendStateDesc{};
blendStateDesc.AlphaToCoverageEnable = FALSE;
blendStateDesc.IndependentBlendEnable = FALSE;        
blendStateDesc.RenderTarget[0].BlendEnable = TRUE;
blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
blendStateDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

if(not SUCCEEDED(p_device->CreateBlendState(&blendStateDesc, &blendState)))
{
    std::abort();
}

p_device_context->OMSetBlendState(blendState, nullptr, 0xFFFFFFFF);
//draw calls...
...