c++ - 如何在 Visual Studio 11 中使用 Shader Model 5.0 编译的着色器?

标签 c++ directx offline hlsl build-time

我试图在我的项目中为我的 C++ DirectX 11 项目预/离线/构建时编译 .hlsl 文件。 Visual Studio 将 .hlsl 文件编译为 .cso 文件。我现在无法将 SM 5.0 的 .cso 文件读入我的程序以创建着色器。

以下是我必须从预编译的 .cso 文件创建像素着色器的代码:

ID3D11VertexShader* PS;
ID3DBlob* PS_Buffer;

D3DReadFileToBlob(L"PixelShader.cso", &PS_Buffer);
d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);
d3d11DevCon->PSSetShader(PS, 0, 0);

像素着色器只是应该返回蓝色像素。通过在 Visual Studio 11 中更改其编译设置,它已被编译为 Shader Model 5.0。但是,在运行该程序时,我尝试渲染的三角形并未显示,尽管它们没有生成或运行时错误消息。

在运行时编译时使用:

D3DCompileFromFile(L"PixelSHader.hlsl", 0, 0, "main", "ps_5_0", 0, 0, &PS_Buffer, 0);

仍然没有渲染三角形,而不是 D3DReadFileToBlob(..)。

但是,当使用 Shader Model 4.0 时,无论是构建时还是运行时编译,都会显示蓝色三角形,表明它可以正常工作。

这是我的 PixelShader.hlsl 文件中的代码。它对于 Shader Model 5.0 来说是否过于过时,是否会成为我问题的根源?

float4 main() : SV_TARGET
{
    return float4(0.0f, 0.0f, 1.0f, 1.0f);
}

我使用的是 Windows SDK 库,而不是 2010 年 6 月的 DirectX SDK。 我的显卡是 nVidia 8800 GTS。

最佳答案

Shader model 5 支持 nVidia 卡的 GeForce 400 系列及更新版本,以及 AMD 卡的 Radeon 5000 系列及更新版本。您的 GeForce 8800 仅支持着色器模型 4,这就是着色器无法运行的原因。为了解决这个问题,您可以使用引用设备(通过使用 D3D_DRIVER_TYPE_REFERENCE),但这会非常慢。此外,如果您有 Windows 8 预览版(添加了对 D3D_FEATURE_LEVEL_11_0 的 WARP 支持),则可以使用 WARP 设备,该设备的性能比引用设备更好,但仍远不能在硬件设备上运行。

关于c++ - 如何在 Visual Studio 11 中使用 Shader Model 5.0 编译的着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759300/

相关文章:

c++ - 嵌套的 boost::variant fusion 对的编译失败

opengl - 为什么 OpenGL 和 DirectX 中没有更小的浮点类型?

android - 下载/缓存 Google map 以供离线使用

Django Compressor 离线继承

c++ - 如果不同翻译单元中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?

C++ 将 2 个字符串合并在一起

c++ - 等同于DirectX 9的DirectX 11错误

directx - IDXGIFactory::EnumAdapters() 不返回任何适配器

directx - HLSL float 组打包在常量缓冲区中?

javascript - 在仅限客户端的 Web 应用程序上保存和加载文件的正确方法是什么?