문제

알파 구성 요소가 픽셀 셰이더에서 어떻게 처리되는지에 대해 특이한 것이 있습니까? 저의 아티스트가 배경으로 사용할 수있는 회색조 이미지를 제공하는 WPF 응용 프로그램이 있으며,이 응용 프로그램은 현재 상태에 따라 해당 이미지를 채색합니다. 그래서 이미지 요소에 영향을 미치기 위해 픽셀 셰이더 (WPF 픽셀 셰이더 효과 라이브러리 인프라를 사용하여)를 작성했습니다. 셰이더는 매개 변수로 색상을 취하여 HSL로 변환하여 밝기를 조작 할 수 있습니다. 그런 다음 각 회색 픽셀에 대해 소스 픽셀의 밝기에 비례하여 색상 매개 변수와 흰색 사이의 밝기가 보간되는 색상을 계산합니다.

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);

    // ...Do messy computation involving src brightness and color parameter...

    float4 dst;
    dst.r = ...
    dst.g = ...
    dst.b = ...
    dst.a = src.a;
    return dst;
}

이것은 alpha = 1 인 픽셀에서 잘 작동하지만 알파 = 0 인 경우 결과 픽셀이 창의 배경을 보여주기보다는 흰색으로 나옵니다. 그래서 나는 작은 변화를했다.

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);
    if (src.a == 0) 
        return src;
    ...

그리고 이제 투명한 부품은 실제로 투명합니다. 왜요? 왜 그렇지 않았습니다 dst.a = src.a 첫 번째 버전의 진술은 그것을 달성합니까? 불행히도, 이것은 0 <alpha <1이있는 픽셀처럼 보이기 때문에 이것은 부분적인 수정 일뿐입니다.

내가 알파에 대해 이해하지 못하는 것을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

더 많은 웹 검색 후, 나는 내가 놓친 작품을 발견했습니다.

에 따르면 MSDN에 관한 기사: "WPF는 여러 가지 성능의 이유로 내부적으로 모든 곳에서 사전 다생기 알파를 사용하므로 사용자 정의 픽셀 셰이더의 색상 값을 해석하는 방식이기도합니다."

따라서 고정은 알파의 곱셈을 던지는 것으로 밝혀졌습니다.

float4 main(float2 uv : TEXCOORD) : COLOR
{
    ...
    dst.rgb *= src.a;
    return dst;
}

그리고 이제 내 출력은 내가 기대하는 것처럼 보입니다.

다른 팁

0 <alpha <1이 흰색으로 나옵니다

여기서 어떤 범위를 기대하고 있습니까?

모든 값은 0.0 및 1.0 범위에있을 것입니다 ... 픽셀 셰이더는 이산 256 색 범위에서 작동하지 않으며 1.0이 최대 강도 인 부동 소수점입니다.

계산이 r/g/b 값을> 1.0으로 설정하면 흰색이 될 것입니다 ...

http://www.facewound.com/tutorials/shader1/

야, 나는 XNA 게임을하고 있는데 그레이 스케일 픽셀 셰이더를 사용해야했고 당신이 직면 한 것과 같은 문제를 얻었습니다. 당신이 XNA 환경에 익숙하지 않거나 그렇지 않다면 나는 스프라이트 배치 그림 SpriteBlendMode ~에서 spriteblendmode.ne 에게 SpriteBlendMode.Alpablend, 이것이 이유를 아는 데 도움이되기를 바랍니다.

문안 인사,

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top