2014-05-12 4 views
0

내 게임에서 알파 블렌딩을 사용할 수있게되었지만 일부 프리미티브는 투명 텍스처 뒤에 렌더링되지 않습니다. 여기 Direct3D에서 알파 블렌딩 9. 일부 프리미티브가 텍스처 뒤에 렌더링되지 않습니다.

Screenshot http://oi62.tinypic.com/t6rlv7.jpg

Screenshot

내 렌더링 상태입니다 : 여기 어떻게 투명 개체가 여전히 깊이 버퍼에 기록 얻을 따라서 그들 뒤에 거짓말 객체를 차단하는 것이 무엇

d3ddevice->SetRenderState(D3DRS_LIGHTING, true); 
d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); 
d3ddevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 
d3ddevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(15, 15, 15)); 
d3ddevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); 
d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
d3ddevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
d3ddevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); 

d3ddevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 

d3ddevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); 

d3ddevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_NONE); 
d3ddevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_NONE); 
d3ddevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE); 
+2

귀하의 스크린 샷을 모르겠습니다. 투명 텍스처는 어디에 있습니까? 투명한 무언가 뒤에 객체를 그리려면 먼저 객체를 그려야합니다. 그렇지 않으면 깊이 테스트는 해당 픽셀을 버립니다. –

답변

0

렌더링되지 않도록. 이 문제를 해결하는 데는 (최소한) 두 가지 방법이 있습니다.

  1. 씬의 모든 투명한 오브젝트가 앞뒤로 렌더링되도록 정렬합니다. 코드에서이 작업을 수행해야합니다. D3D는이 작업을 처리하지 않습니다. 이 부분에 Here is an MSDN article이 있습니다.

  2. 렌더링하는 모든 개체가 특정 시점에서 완전히 투명하거나 완전히 불투명 한 것으로 보입니다. 이 경우 투명도를 다루는 더 간단한 방법이 있습니다. 알파 테스트를 사용하여 0 알파 (또는 특정 임계 값 이하의 알파, 예를 들어 128)를 가진 모든 조각을 버릴 수 있습니다. 이 작업을 수행하는 방법은 Here is an article입니다. 셰이더를 사용하는 경우 discard 명령을 사용하여 모든 투명 조각을 삭제할 수 있습니다.