脱机编译

效果编译器工具 (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 及更高版本的硬件上运行。

另请注意,应查阅与 FXC 编译器版本关联的 SDK 发行说明,了解受 /Gec 开关影响的行为。

在子流程中使用效果编译器工具

如果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 的参考页。