2012-04-05 6 views
0

타사 함수에서 픽셀 (ARGB)을 복사하는 표면 (OffScreenPlain 또는 RenderTarget with D3DFMT_A8R8G8B8)이 있습니다. 픽셀 복사 이전에, 비트는 LockRect에 의해 액세스된다.D3D9 알파 서페이스에서 블렌딩

이 표면은 (D3DFMT_A8R8G8B8) 인 Backbuffer에 대한 StretchRect입니다. Surface와 Backbuffer는 서로 다른 차원입니다. 필터링은 D3DTEXF_NONE으로 설정됩니다.

그냥 D3D 장치를 생성 한 후 나는 다음과 같은 설정 한 렌다 설정

D3DRS_ALPHABLENDENABLE -> TRUE 
D3DRS_BLENDOP   -> D3DBLENDOP_ADD 
D3DRS_SRCBLEND   -> D3DBLEND_SRCALPHA 
D3DRS_DESTBLEND  -> D3DBLEND_INVSRCALPHA 

는하지만 알파 블렌딩이 발생하지 않습니다를 참조하십시오. 알파가 픽셀 단위로 지정되었는지 확인했습니다.

필자는 정점 버퍼를 만들고 알파 블렌딩으로 표시되는 삼각형 (DrawPrimitive)을 그리는 간단한 테스트를 수행했습니다.

이 테스트 표면에는 StretchRect가 먼저 있고 그 다음에 DrawPrimitive가 있었으며 표면 내용은 알파 블렌딩없이 표시되고 삼각형은 알파 블렌딩으로 표시됩니다.

무엇이 여기에 있습니까? 감사합니다

답변

2

당신이 언급 한 국가에만 정점에만 영향을 미칩니다. 텍스처가 올바르게 혼합되도록하려면 텍스처 알파와 정점 1을 혼합하는 방법을 지정해야합니다. 이처럼 이렇게 기본적 ALPHAOP으로

d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); 

즉에만 텍스처 알파 렌더링으로 간주됩니다 SELECTARG1입니다.

또 다른 솔루션은 텍스처를 백 버퍼에 복사하는 방법을 사용하고 있습니다 (ID3DXSprite::Draw). 그냥 색상 D3DCOLOR_ARGB(X, 255, 255, 255)을 전달하십시오. 여기서 X는 귀하의 알파입니다. 이 방법은 모든 상태 조정을 수행하며 최종 결과는 예상과 일치합니다.

관련 문제