2009-06-25 7 views
1

사용자가 쉐이더 (.fx HLSL 또는 어셈블리 파일, 다중 패스가있을 수 있지만 모두 픽셀 쉐이더 만 가능)를 선택하고 미리 볼 수있는 간단한 응용 프로그램이 있습니다.DirectX 사후 처리 쉐이더

응용 프로그램이 실행되고 쉐이더 목록이 나타나고 버튼이 "미리보기 창"을 시작합니다. 이 미리보기 창 (DirectX 뷰포트가 있음)에서 사용자가 이미지를 선택하면 해당 이미지에서 셰이더가 실행되고 표시됩니다. 한 프레임 만 렌더링해야합니다 (실시간이 아님).

쿼드를 사용하여 선택한 이미지로 텍스처 된 화면을 렌더링하는 버텍스/픽셀 쉐이더 조합이 있습니다. 이것은 완벽하게 작동합니다. 첫 번째 효과의 출력에서 ​​다른 효과 (순전히 픽셀 쉐이더)를 실행하고 최종 이미지를 화면에 표시 (사후 처리)해야합니다. 이것은 전혀 작동하지 않습니다.

지난 몇 일 동안 작동 시키려고 노력했지만 아무런 이유없이 각 효과를 렌더링하는 데 사용 된 동일한 코드 블록이 첫 번째 렌더링에만 사용됩니다. 두 번째 쉐이더 파일을 첫 번째 쉐이더 파일의 두 번째 패스로 추가 할 수 있으며 완벽하게 실행됩니다 (사용자 작성 쉐이더를 미리 보는 목표는 완전히 상실 되었음). 두 번째 효과 (로드 및 컴파일이 잘됨)를 사용하려고하면 아무 효과가 없습니다. 첫 번째 셰이더의 결과 (GetRenderTargetData 포함)를 텍스처 & 표면 (destTex 및 destSur)에 배치 한 다음 해당 텍스처를 두 번째 패스의 입력으로 설정합니다 (dev-> SetTexture를 사용하고 나중에 effect- > SetTexture ("thisframe", destTex)).

모든 호출이 성공하고, 효과 컴파일, 텍스처로드, 쿼드가 그려 지지만 효과는 표시되지 않습니다. 처음에는 소프트웨어 정점 처리로 생성 된 장치가 문제를 일으키는 것으로 의심되었지만 하드웨어와 혼합을 시도한 경우가 아닌 것 같습니다. 또한 HAL 및 REF 장치를 사용하여 (문제가 아니 어서 응용 프로그램이 실시간이 아니기 때문에) 두 번째 셰이더는 표시되지 않습니다. 모든 것은 C++에서 Direct3D 9 용으로 작성되었습니다.

답변

1

쿼드를 렌더링 할 때마다 깊이 스텐실 버퍼를 지우십시오.

0

픽셀 쉐이더를 실행하려면 일종의 정점 입력 및 정점 처리 (고정 기능 또는 쉐이더)가 있어야합니다. 버텍스 쉐이더를 공급하고 있습니까? 그렇다면 픽셀 쉐이더가 기대하는 것만 큼 확실합니까? 콜 드 콜은 어떻게 생겼지?

사용자 효과를 사용하려고 할 때 장치 상태를 확인하려면 앱의 PIX 추적을 살펴볼 가치가 있습니다.

1

처음으로 텍스처를 만든 다음 첫 번째 셰이더를 그 텍스처에 직접 렌더링합니다. 마지막으로 텍스처가있는 두 번째 셰이더를 Backbuffer의 입력으로 렌더링합니다.