문제

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

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

쿼드를 가져와 선택한 이미지로 텍스처링된 화면에 렌더링하는 정점/픽셀 셰이더 조합을 설정했습니다.이것은 완벽하게 작동합니다.그런 다음 첫 번째 효과의 출력에 대해 순수 픽셀 셰이더인 또 다른 효과를 실행하고 최종 이미지(후처리)를 화면에 표시해야 합니다.이것은 전혀 작동하지 않습니다.

지난 며칠 동안 작동시키려고 노력했지만 뚜렷한 이유 없이 각 효과를 렌더링하는 데 사용된 동일한 코드 블록은 첫 번째 효과만 렌더링했습니다.두 번째 셰이더 파일을 첫 번째 셰이더 파일의 두 번째 패스로 추가하면 완벽하게 실행됩니다(사용자가 만든 셰이더를 미리 보는 목표는 완전히 무너지지만).두 번째 효과(잘 로드되고 컴파일되는)를 사용하려고 하면 아무 작업도 수행되지 않습니다.첫 번째 셰이더(GetRenderTargetData 포함)의 결과를 가져와 텍스처 및 표면(destTex 및 destSur)에 배치한 다음 해당 텍스처를 두 번째 패스의 입력으로 설정했습니다(dev->SetTexture 및 이후 효과 사용). SetTexture("thisframe", destTex)).

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

도움이 되었습니까?

해결책

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

다른 팁

먼저 텍스처를 생성한 다음 첫 번째 셰이더를 해당 텍스처에 직접 렌더링합니다.마지막으로 텍스처를 Backbuffer에 대한 입력으로 사용하여 두 번째 셰이더를 렌더링합니다.

픽셀 셰이더가 실행되려면 일종의 정점 입력 및 정점 처리(고정 기능 또는 셰이더)가 있어야 합니다.정점 셰이더를 제공하고 있습니까? 그렇다면 픽셀 셰이더가 기대하는 대로 작동한다고 확신합니까?당신의 드로우 콜은 어떤 모습인가요?

사용자 효과를 사용하려고 할 때 기기 상태를 확인하려면 앱의 PIX 추적을 살펴보는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top