다음을 통해 공유


오프라인 컴파일

fxc.exe(효과 컴파일러 도구)는 HLSL 셰이더의 오프라인 컴파일을 위해 설계되었습니다.

현재 컴파일러를 사용하여 컴파일

현재 컴파일러에서 지원하는 셰이더 모델은 프로필에 표시됩니다. 다음은 셰이더 모델 5.1 대상에 대한 픽셀 셰이더를 컴파일하는 예제입니다.

fxc /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

이 예제에서는 다음이 적용됩니다.

  • ps_5_1 대상 프로필입니다.
  • PixelShader1.fxc는 컴파일된 셰이더를 포함하는 출력 개체 파일입니다.
  • PixelShader1.hlsl이 원본입니다.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

디버그 옵션에는 컴파일러 최적화(Od)를 사용하지 않도록 설정하고 줄 번호 및 기호와 같은 디버그 정보(Zi)를 사용하도록 설정하는 추가 옵션이 포함됩니다.

명령줄 옵션의 전체 목록은 구문 페이지를 참조하세요.

레거시 컴파일러를 사용하여 컴파일

Direct3D 10부터 일부 셰이더 모델은 더 이상 지원되지 않습니다. 여기에는 매우 제한된 리소스를 지원하고 하드웨어에 의존하는 ps_1_1, ps_1_2, ps_1_3 및 ps_1_4 픽셀 셰이더 모델이 포함됩니다. 컴파일러는 셰이더 모델 2(이상)로 다시 디자인되어 컴파일을 통해 효율성을 높일 수 있습니다. 물론 셰이더 모델 2 이상을 지원하는 하드웨어에서 실행해야 합니다.

또한 /Gec 스위치의 영향을 받는 동작은 FXC 컴파일러 버전과 연결된 SDK 릴리스 정보를 참조해야 합니다.

하위 프로세서에서 효과 컴파일러 도구 사용

fxc.exe 애플리케이션에 의해 하위 프로세스로 생성되는 경우 애플리케이션이 CreateProcess 함수에 전달된 출력 또는 오류 파이프의 데이터를 확인하고 읽는지 확인하는 것이 중요합니다. 애플리케이션이 하위 처리가 완료될 때까지 대기하고 파이프 중 하나가 가득 차면 하위 처리가 완료되지 않습니다.

다음 예제 코드에서는 하위 프로세서에서 대기하고 하위 프로세스에 연결된 출력 및 오류 파이프를 읽는 방법을 보여 줍니다. 배열의 WaitHandles 내용은 하위 프로세서, stdout용 파이프 및 stderr의 파이프에 대한 핸들에 해당합니다.

HANDLE WaitHandles[] = {
  piProcInfo.hProcess, hReadOutPipe, hReadErrorPipe
};

const DWORD BUFSIZE = 4096;
BYTE buff[BUFSIZE];

while (1)
{
    DWORD dwBytesRead, dwBytesAvailable;

    dwWaitResult = WaitForMultipleObjects(3, WaitHandles, FALSE, 60000L);

    // Read from the pipes...
    while (PeekNamedPipe(hReadOutPipe, NULL, 0, NULL, &dwBytesAvailable, NULL) && dwBytesAvailable)
    {
        ReadFile(hReadOutPipe, buff, BUFSIZE - 1, &dwBytesRead, 0);
        streamOut << std::string((char*)buff, (size_t)dwBytesRead);
    }
    while (PeekNamedPipe(hReadErrorPipe, NULL, 0, NULL, &dwBytesAvailable, NULL) && dwBytesAvailable)
    {
        ReadFile(hReadErrorPipe, buff, BUFSIZE - 1, &dwBytesRead, 0);
        streamError << std::string((char*)buff, (size_t)dwBytesRead);
    }

    // Process is done, or we timed out:
    if (dwWaitResult == WAIT_OBJECT_0 || dwWaitResult == WAIT_TIMEOUT)
        break;
}

프로세스 생성에 대한 자세한 내용은 CreateProcess에 대한 참조 페이지를 참조하세요.