2011-05-05 5 views
0

현재 씬에 direct3d로 그림자를 그려보고 있습니다. 몇 가지 패스 렌더링을 시도하고 블렌드 모드를 사용/설정하는 방법을 이해하는 데 어려움이 있습니다.Direct3D 9 그림자 맵핑 블렌드 모드

나는 깊이 버퍼를 채우는 깊이 패스를했는데 장면의 모든 조명을 반복하는 루프가 있습니다. 그 루프 내에서 나는 2 개 루프가 장면의 모든 모양을 통해하는 두 루프

내가 실행할 때 내가하지만 난 그게 각각의 빛을 통해 루프 것을 알 수있다 PIX에서

for(number of shapes) 
{ 
    //render from camera position and fill depth buffer 
} 
for(number of lights) 
{ 
    for(number of shapes) 
    { 
    //render to shadow map 
    } 
    for(number of shapes) 
    { 
    //render to screen 
    } 
} 

설정의 종류가 광원 배열의 마지막 조명 만 표시됩니다. 블렌드 모드와 관련이 있다고 생각합니다.

블렌드 모드를 살펴본 결과 소스 및 대상 혼합에 대한 정보를 찾았습니다. 이게 내가 필요로하는 것이거나 누군가가 설명해 줄 수 있겠 니? 사전에

감사합니다,

마크

[편집] 나는

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); 
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 

그림자가 올바른 보이지 않는 다음 코드를 사용하여 두 조명 볼 수있어하지만 난 더 가까워지고 있어요 원하는 결과로

더 이상의 조언은 좋은 것,

감사합니다,

마크

답변

1

나는 또한 당신이 잘못 알파 혼합 상태가 설정되어 있다고 생각합니다. SRC 블렌드를하고 기존 이미지를 새 이미지로 바꾸고 알파 블렌딩을하지 않는 것으로 가정합니다. 원하는 것을 생각해야합니다. SRC_OVER 혼합을 원한다고 가정합니다.
Porter Duff 규칙은 힌트를 줄 수 있으며 directX로 구현하기가 쉽습니다. 보기를 위해 here를보십시오.
[편집] 더 자세히 읽어야합니다.

알파 블렌딩 및 픽셀 쉐이더는 독립적입니다. 따라서 픽셀 쉐이더를 사용하여 소스의 색상 값을 변경할 수 있습니다. 어쩌면 몇 가지 특수 효과를 추가하거나 시도해보고 싶을 수도 있습니다. 그러나 대상을 원본과 혼합하고 모든 픽셀을 새로운 픽셀로 교체하지 않으려는 즉시 알파 블렌딩을 활성화해야합니다. 예 : 이

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 

처럼이 코드는 자신의 알파 값과 1 source_alpha 모든 대상 픽셀 모든 소스 픽셀을 곱합니다. 그리고 그들을 새로운 목적지에 결합하십시오.

+0

고정 기능 파이프 라인을 사용하고 있지 않습니다. 현재 3 세트의 쉐이더가 있습니다. 깊이 미리 패스에서 사용되는 첫 번째 세트. 두 번째 세트는 라이트 위치에서 장면의 깊이를 출력하고 세 번째 세트는 그림자 맵 텍스처 깊이를 사용하여 장면에서 그림자를 렌더링하는 데 사용됩니다. 내가 생각하는 문제는 패스 간의 블렌딩이다. – MulletDevil

+0

대상이 렌더링 대상이라고 가정합니다. 출처는 무엇입니까/어떻게 설정합니까? – MulletDevil

+0

Destination은 렌더링 대상이며 source는 혼합하도록 설정된 텍스처의 색상입니다. – mkaes