2012-11-29 6 views
0

DirectX 10에서 포워드 렌더러를 구현하고 있습니다. 무제한의 라이트를 처리하여 나중에 성능을 지연 렌더러와 비교할 수 있습니다. 그래서 기본적으로 제가 사용하고있는 알고리즘은 : 모든 객체에 대해, 모든 빛에 대해 -> 빛을 설정하고, 객체를 그립니다. 첨가제 블렌딩을 사용하여 각 조명에 대한 객체를 렌더링하여 각 조명의 기여도를 합산합니다. 모든 것은 혼합 블렌딩을 사용하고 깊이 쓰기를 사용하여 작동합니다. 내가 가지고있는 문제는이 단순한 접근 방법을 사용하면 다른 객체가 서로 블렌딩된다는 것입니다 (깊이 쓰기가 비활성화되어 있기 때문에). 단일 객체를 다른 광원 기여와 혼합하되 그 뒤에있는 다른 객체를 가리고 싶습니다. . 어떻게해야합니까? Z 프리 패스가 솔루션입니까? 모든 제안은 매우 감사하겠습니다. 감사.DirectX10의 멀티 패스 포워드 렌더러

이 내 HLSL 셰이더에서 사용하는 블렌딩과 깊이/스텐실 상태입니다 : 당신이 멀티를 깊이 프리 패스가 최선입니다 사용하여 구현하려는 경우

DepthStencilState NoDepthWritesDSS 
{ 
    DepthEnable = true; 
    DepthWriteMask = Zero; 
    StencilEnable = true; 
    StencilReadMask = 0xff; 
    StencilWriteMask = 0xff; 
    FrontFaceStencilFunc = Always; 
    FrontFaceStencilPass = Incr; 
    FrontFaceStencilFail = Keep; 
    BackFaceStencilFunc = Always; 
    BackFaceStencilPass = Incr; 
    BackFaceStencilFail = Keep; 
}; 

BlendState BlendingAddBS 
{ 
    AlphaToCoverageEnable = false; 
    BlendEnable[0] = true; 
    SrcBlend = ONE; 
    DestBlend = ONE; 
    BlendOp = ADD; 
    SrcBlendAlpha = ZERO; 
    DestBlendAlpha = ZERO; 
    BlendOpAlpha = ADD; 
    RenderTargetWriteMask[0] = 0x0F; 
}; 

답변

1

, 여러 개의 조명을 처리하기 위해 몇 가지 옵션이있다 옵션 (깊이 상태에서 LESS_EQUAL 비교를 사용하여 다시 그립니다).

이 방법은 많은 수의 조명/물체에서 매우 비효율적 일 수 있습니다.

몇 가지 조명을 렌더링하는 방법을 설명하는이 article을 권장합니다.이 조명은 여러 가지 흥미로운 구현을 가지고 있습니다.

여전히 렌더링 기대합니다 (I 그것의 DX9 버전이) 컴퓨팅 타일 다이렉트에서 작동하지 않습니다,하지만 형상 스프라이트 버전은 쉽게 이식 할 수 있습니다, 또한 빛 색인 기법, 구현 예 here

있다