2012-10-20 3 views
1

Direct3d9의 모든 프레임에서 버텍스 버퍼를 잠궈 블렌드 셰이프 코드의 데이터로 채 웁니다. 내 음영 처리는 두 단계를 사용하므로 하나의 쉐이더로 한 번 렌더링 한 다음 다른 쉐이더와 첨가제 블렌드를 그립니다.Z- 파이팅 Direct3D9, 다이나믹 버퍼 만 사용

저의 이유 때문에 두 번째 드로잉 호출에서 데이터가 (분명히) 약간 다릅니다. 왜냐하면 두 번째 패스가 가끔 '첫 번째'뒤에 렌더링되는 z- 싸움이 번쩍이기 때문입니다.

이것은 모두 하나의 스레드에서 수행되며 렌더링 호출이 오랜 시간 동안 버퍼가 잠금 해제됩니다. 또한 쉐이더 명령에 대한 변경이 일어나지 않으므로 두 호출에서 데이터가 정확히이되어야합니다. 블렌드 쉐이프가 변경되지 않으면 z- 파이팅이 수행되지 않습니다.

필자는 쉐이더에서 깊이를 조금씩 밀어 넣었지만, 이것은 매우 비 효과적 인 해결책입니다.

왜이 데이터가 변경 될 수 있습니까? DirectX가 잠금을 해제 한 후 왜 버퍼에서 데이터를 변경할 수 있습니까? 변경하지 않도록 강제 할 수 있습니까?

답변

1

첫 번째. 데이터가 D3D에 의해 정말로 변경 되었습니까? 아니면 이것은 단지 가정일까요? D3D가 데이터를 변경하지 않을 것이라고 확신합니다.

2 위입니다. 말했듯이, 지오메트리를 그리는 두 개의 셰이더가 있습니다. 그들은 서로 다른 변형 작업을합니다. 또는 최적화 때문에 쉐이더의 변형이 다를 수 있습니다. 왜 변형 된 꼭지점이 약간 다를 수 있습니다 (그러나 z- 싸움에 충분할 수 있습니다). 하나의 셰이더/기법에서 두 개의 패스를 사용하는 것이 좋습니다. 또는 여전히 두 개의 셰이더를 사용하려면 변형 및 기타 식별자 작업에 공유 코드를 사용하는 것이 좋습니다.

0

D3D 런타임은 버텍스 버퍼에 의해 전달 된 데이터를 변경하지 않을 것이라고 확신 할 수 있습니다. 두 레이어를 렌더링 할 때 Z- 파이팅이 아닌 동일한 작업을 수행했습니다. 그러나 실제로 삼각형을 픽셀로 래스터 화하는 동안 일부 렌더링 상태가 변경되어 D3D9의 D3DRS_DEPTHBIAS 및 D3DRS_SLOPESCALEDEPTHBIAS이거나 D3D10_RASTERIZER_DESC 구조의 같은 값입니다. 이러한 렌더링 상태가 변경된 경우이를 확인해야합니다.

셰이더에서 위치를 계산하는 모든 변환 행렬이나 다른 상수가 정확하게 동일해야합니다. 그렇지 않으면 z- 파이팅이 발생해야합니다.

일부 그래픽 디버깅 도구를 사용하여 검사하는 것이 좋습니다. NVIDIA 카드를 사용하는 경우 PIX 또는 PerfHUD 또는 Nsight를 사용할 수 있습니다.

가난한 영어를 유감스럽게 생각하며 이해하기 어려워합니다. 하지만이게 너를 도울 수 있으면 좋겠어, 고마워.