2015-01-13 2 views
0

문제는 다음과 같습니다. 텍스처에 스프라이트를 렌더링하고 화면에 텍스처를 렌더링합니다. 간단 하죠? 그러나 그렇게하면 스프라이트가 렌더링 될 때마다 픽셀의 알파 값과 관계없이 모든 픽셀을 덮어 씁니다. 예 :DirectX에서 텍스처 알파 블렌딩

여기

enter image description here

당신은 텍스트 "ABC"두 개의 스프라이트를 볼 수 있습니다. 첫 번째는 오른쪽 상단 모서리에 렌더링되고 두 번째는 Y 오프셋과 함께 렌더링됩니다. 보시다시피, 두 번째 것은 배경 색상으로 덮어 쓰면 안되는 첫 번째 스프라이트의 픽셀조차 무시합니다. 동일한 작업을 수행 할 때 텍스처를 렌더링 한 다음 해당 텍스처를 화면에 렌더링하는 대신 화면에 직접 스프라이트를 렌더링하고 결과는 예상대로이며 두 번째 스프라이트는 덮어 쓸 픽셀 만 덮어 씁니다.

알파 블렌딩이 모든 렌더링 대상에 사용 가능하고 화면 및 텍스처 렌더링에 대한 깊이 테스트가 해제되어 있기 때문에 어떤 일이 일어나고 있는지 잘 모르겠습니다. DirectX interop을 사용하는 Windows Phone 8 - XAML에서 DirectX11을 사용하고 있습니다.

EDIT : 문제를 다시 말하기 비트 : 빨강으로 텍스처를 지우는 경우 화면에 렌더링 할 때 빨간색 화면이 나타납니다. 이제 완전히 빨간 텍스처에 투명 (색상 0,0,0,0) 텍스처를 렌더링합니다. 나는 아무 변화도 기대하지 않을 것이고 스크린에 렌더링 한 후에, 나는 빨간 스크린을 얻을 것이다. 이것은 투명한 스프라이트를 렌더링 할 때와 같지 않습니다. 실제로 텍스처에 색을 (0,0,0,0) 씁니다. 투명 창이있는 빨간색 텍스처를 얻습니다. 그래서 그것을 화면에 렌더링 한 후에, 나는 컬러 스크린이 지워진 것을 볼 수 있습니다. 무슨 일이야?

+0

당신의 접근 방식은 잘 작동합니다. 다른 모든 파이프 라인 상태가 백 버퍼 -RTV와 임시 -Texture-RTV의 경우에서 동일하다고 확신합니까? – MooseBoys

+0

나는 꽤 확신한다. 내가 보는 문제는 각 픽셀이 0 알파 색상으로 덮어 쓰는 배경색 (렌더링 대상을 지우는 데 사용되는 색상)을 확장하는 방식으로 이전 픽셀을 완전히 버리는 것이 가능한지 여부입니다. 빨간색 배경을 가지고 있다고 가정 해 봅시다. 최종 텍스처는 빨간색입니다. 투명도가 높은 스프라이트를 렌더링하면 완전히 빨간색으로 유지되어야하지만 대신 투명 스프라이트가 렌더링되므로 투명감이있는 빨간색 텍스처가 나타납니다. – user1760770

답변

2

마지막 의견은 문제를 암시합니다. 나는 모두 소스 텍스처와 중간 렌더 타겟에 알파 ​​채널이 있다고 가정합니다. 그렇다면 알파 채널 모두 색상에 대해 올바른 혼합 방정식을 사용해야합니다. 일반적으로 백 버퍼 알파에 블렌딩하기위한 표준 방정식은 일반적으로 백 버퍼 알파가 무시되므로 올바른 알파 채널 블렌딩을 생략합니다. 귀하의 경우, 색상 채널이 올바르게 혼합되고 있지만 마지막 렌더링 된 스프라이트가 알파 값 지시문을 중간 텍스처에 쓰고있는 것으로 의심됩니다. 결과적으로, 이전의 드로잉으로 인해 불투명하게 유지 되었더라도 해당 픽셀은 완전히 투명합니다. 이후에이 텍스처를 백 버퍼에 렌더링하면 동일한 색상의 알파 블렌딩으로 인해 해당 픽셀이 최종 이미지에 아무런 영향을 미치지 않습니다.

이 투명성과 질감 표준 알파 혼합 된 렌더링을위한 올바른 설정입니다 :

또한
// dest.rgb = dest.rgb * (1 - src.a) + src.rgb * src.a 
SrcBlend = SRC_ALPHA 
DestBlend = INV_SRC_ALPHA 
BlendOp = ADD 

// dest.a = 1 - (1 - dest.a) * (1 - src.a), with some rearranging 
SrcBlendAlpha = INV_DEST_ALPHA 
DestBlendAlpha = ONE 
BlendOpAlpha = ADD 

는 불투명 (렌더링하기 전에 투명에 중간 목표를 취소하는 것을 잊지 마세요 블랙, 일반적으로) 텍스쳐의 일부가 렌더링 후에 투명 해지기를 원한다고 가정하십시오.

+0

이것이 해결책입니다. 정말 고마워요. – user1760770