[질문] D3DRS_DEPTHBIAS 사용법??

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
감사여

[질문] D3DRS_DEPTHBIAS 사용법??

Post by 감사여 »

안녕하세요..

D3DRS_DEPTHBIAS을 사용하려고 하는데,
안되는군여.. 사용방법을 좀 알려주세요


오브젝트를 겹쳐 그리게 되서 D3DRS_DEPTHBIAS을 사용해서
얼룩을 제거 하려고 합니다.

여기 질문을 검색해 보니, 비디오드라이버 이야기가 나와서
최신것으로 다시 깔아도 되지 않는군여

pd3dDevice->SetRenderState( D3DRS_DEPTHBIAS, 0 );
렌더링
pd3dDevice->SetRenderState( D3DRS_DEPTHBIAS, 1 );
렌더링

이렇게 해도 얼룩이지고, 아래와 같이 해도 같은 결과가 나옵니다.
pd3dDevice->SetRenderState( D3DRS_DEPTHBIAS, 1 );
렌더링
pd3dDevice->SetRenderState( D3DRS_DEPTHBIAS, 0 );
렌더링

결론적으로
D3DRS_DEPTHBIAS의 정확한 사용법과, 주의 할점이
무엇인지 아시면 좀 가르쳐 주세요~
shepis

부동소수점으로 파라메터가 바뀐거 같던데...

Post by shepis »

저도 확실히 모르지만 똑같은 의문이 생겨서 고민했었는데요.
헬프를 보면 인자로주는 값이 8.x때는 0~16이었는데 지금은 부동소수점을 넣으라고 되어 있더군요.
그래서 부동소수점으로 0.001 이런식으로 주니까 제대로 되는거처럼 보였습니다.
그렇게 한번 해보시고 정확하게 아시는분이 답변주시기를 바랍니다.
비회원

float 요??

Post by 비회원 »

float 넣으니 워닝 나는데요?ㅡㅡ;;

이거 왜이런건지 흠;

float 가 아니라 ULONG 넣으라고 나오네요; 허허;

저만 이런가
비회원

Post by 비회원 »

Code: Select all

float fDepthBias = 0.0001f;
m_pD3DDevice->SetRenderState( D3DRS_DEPTHBIAS, *(DWORD*)&fDepthBias );
SetRenderState에 float값이 필요한 몇몇의 경우는

이렇게 DWORD*로 캐스팅해서 집어넣습니다.
jhk8211
Posts: 184
Joined: 2003-12-19 14:04
Location: 우리집

Z-Fighting...

Post by jhk8211 »

원래 DX 8.0 에서는 D3DRS_ZBIAS 라고 되어있었는데..

9.0에 와서

D3DRS_DEPTHBIAS 로 바뀌었더군요. 뿐만 아니라..

D3DRS_SLOPESCALEDEPTHBIAS 라는 옵션이 쌍으로 존재하기도 합니다.

인자 넘겨주는 것은 위엣 분이 말씀하셨던대로 해주시면 되구요.
(float 값을 DWORD 형으로 강제로 캐스팅해주는 겁니다. 인라인 함수로 만들어놓고 쓰면 유용하죠.)

여기에 Depth Bias 에 대한 좋은 샘플이 있습니다. 저도 예전에 이 문제가 걸렸었거든요. ^^

http://www.codesampler.com/dx9src.htm

찾아보시면 depth-bias에 대한 예제가 있을겁니다.


아, 그리고 Z-Fighting 을 해결하기 위해서.. Depth-Bias 는 그래픽카드마다 틀리게 작동한다,

아니다 9.0에 와서 고쳐졌다 뭐 이런 말이 있는데,


이렇게 하지 않더라도.. Z-Fighting 을 해결하기 위해서 프로젝션 행렬에 약간의 옵셋을 줘서

바꿔치기하는 것도 가능합니다. Z-Fighting이 일어나는 두 개의 평면에 약~간 다른 프로젝션 행렬을

셋팅해 주는 것이지요.

이건 그래픽카드마다 편차가 생길 일도 없고 오히려 명확해서

더 좋은 것 같더군요.

near나 far Plane을 약간만 다르게 해줘도 Z-Buffer 연산을 할 때

같은 평면이라도 깊이 값이 다르게 기록되어 Z-Fighting이 안 일어나고 판정이 되거든요.

근데 9.0의 Depth-Bias가 결국 같은 일을 한다는 말도 있습니다. 자세히는 모르겠구요. ^^

잘 해결되었으면 좋겠네요. ^^
Locked