2012-12-10 2 views
0

여러 개를 겹쳐서 만들 때 적어도 한 번 이상 "빈"이미지 나 배경과 결합해야합니다. 그러나 "비어있는"것과 같은 것은 없습니다. 그것은 투명한 검정색 또는 투명 한 흰색입니다. 완전히 투명해도 표시 할 때 일반적으로 무시되는 색상이 있습니다.두 이미지를 최종 이미지에 결합 (혼합)하지만 현재 내용은 사용하지 마십시오

나는 folloing 가지고 싶습니다

Destination = Image1 + Image2 

내가 실제로 어떻게 이렇게하려면를이 :

대상 투명 검은 색이 최종 결과에 검은 색 기여하지만
Clear(Destination, 0); // Clear it with transparent black 
Blend Image1 over Destination 
Blend Image2 over Destination 

나는 피하고 싶습니다. 투명 흰색으로 대상을 지울 수는 있지만이 예제에서만 작동하며 어두운 이미지에서도 동일한 문제가 발생합니다. DirectX를 혼합 포뮬러 그런 식으로 설정됩니다 :

BlendOp = Add; 
SrcBlend = SrcAlpha; 
DestBlend = InvSrcAlpha; 

대상 (DestAlpha)의 알파는 고려되지 않은에서 모두 그것이 같은 결과가 왜

Combining Problem

는 이해 이 공식. 두 이미지를 다른 곳에 렌더링하기 전에 함께 혼합하는 일상적인 문제를 구현하려면 어떻게해야합니까?

+0

난 당신이 고정 기능 파이프 라인으로이 문제를 해결할 수 있는지, 확실하지 않다. 이미지가 대상 배경에 직접적으로가 아니라 여분의 버퍼로 구성되는 것이 중요한 이유는 무엇입니까? 달성하고자하는 것은 무엇입니까? – Gnietschow

+0

이 여분의 버퍼는 픽셀 쉐이더에 입력으로 공급되기 때문에 필요합니다. –

+0

반드시 고정 함수 파이프 라인에서 수행 할 필요는 없지만 혼합 공식은 여전히 ​​수정되어 있습니다. 나는 DirectX9를 사용하고있다. 내가 싫어하는 것은 별도의 픽셀 셰이더에서 두 개의 버퍼를 결합하는 것이 오버 헤드가 많아지기 때문입니다. –

답변

0

Afaik 당신은 정상적인 블렌딩 작업으로 이것을 달성 할 수 없지만, 적절한 쉐이더를 작성하여 블렌딩을 할 수는 있습니다. 추가 텍스처를 렌더링 타겟으로 렌더링하고 픽셀 텍스처에이 텍스처를 설정합니다. 이제 배경색이 알파 값을 0으로 설정하면 imagecolor를 씁니다. 그렇지 않으면 이미이 픽셀에 쓴 이미지가 있고 쉐이더에서 일반적인 알파 블렌딩을 할 수 있습니다. 이 브랜치를 사용하면 픽셀이 비어 있거나 이전에 쓰여졌는지 여부를 감지 한 다음 검정색이 영향을 미치지 않도록 할 수 있습니다. 희망이 도움이 :)

약간의 예는 무슨 뜻인지 시각화 :

float4 targetColor = tex2D(backgroundSampler,screen.TexCoord); 
float4 diffuse = tex2D(imageSampler,image.TexCoord); 
// overwrite black background 
if (targetColor.a == 0.0) { 
    return diffuse; 
} 
// do alphablending 
return targetColor*(1-diffuse.a)+diffuse*(diffuse.a); 
+0

예, 작동하지만 엔진을 훨씬 더 복잡하게 만듭니다. 특히 멀티 패스 쉐이더로 이펙트를 만들면 매번 패스 할 때마다 블렌딩을해야합니다. –

+0

내가 염두에두고있는 유일한 해결책은 미리 곱셈 된 알파 및 혼합 블렌딩을 사용하는 것입니다.하지만 결과가 과도하게 노출됩니다. – Gnietschow

+0

이 접근법의 또 다른 문제점 : 고정 함수 블렌드 수식이 픽셀 겹침에 사용되므로 투명도가있는 도형이 겹치는 경우 잘못된 결과가 나타납니다. –

관련 문제