将预编译的 HLSL 着色器加载到内存中以与 CreatePixelShader 一起使用

发布于 2024-10-17 11:41:50 字数 144 浏览 7 评论 0原文

我需要将编译的像素着色器加载到内存中以与 CreatePixelShader 一起使用,但我无法使用任何 D3DX 调用。

我该怎么做?

(我使用 Visual Studio 2010 作为编译器,使用 C++ 作为语言)

I need to load a compiled pixel shader into memory to use with CreatePixelShader but I can't use any D3DX calls.

How can I do this?

(I'm using Visual Studio 2010 as my compiler and C++ as the language)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南…巷孤猫 2024-10-24 11:41:50

我意识到有人早些时候发布了伪代码。以下是使用 Windows SDK(而不是所要求的 D3DX 库)的 C++ 代码。

这里的“PixelShader.cso”是由 Visual Studio 11 从项目中的 .hlsl 文件生成的预编译 hlsl 着色器。编译后的 .cso 文件通常默认移至 Projects/ProjectName/Debug 文件夹。因此,在使用之前必须将其剪切并粘贴到与源代码相同的目录中。请注意,可以通过在 Visual Studio 11 中右键单击 HLSL 文件并编辑输出设置来更改此设置。默认情况下为:$(OutDir)%(Filename).cso,将其更改为:$(Directory)%(Filename).cso

ID3D11PixelShader* 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);

请注意“PixelShader.cso”之前的 L。我的项目使用多字节字符集,如果您将其设置为 Unicode,则 L 可能不是必需的。

I realize someone posted pseudo-code earlier. Here is C++ code using the Windows SDK (and not the D3DX libraries as requested).

Here "PixelShader.cso" is the precompiled hlsl shader generated by Visual Studio 11 from a .hlsl file in the project. The compiled .cso file is usually moved to the Projects/ProjectName/Debug folder by default. As a result it must be cut and paste into the same directory as your source code before using. Mind you this setting can be changed by right-clicking the HLSL file while inside Visual Studio 11 and editing the Output Settings. By default its: $(OutDir)%(Filename).cso, change it to: $(Directory)%(Filename).cso

ID3D11PixelShader* 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);

Take note of the L before "PixelShader.cso". My project was using the Multi-Byte Character Set, if you have yours set to Unicode the L might not be necessary.

跨年 2024-10-24 11:41:50

使用 fxc 从命令行构建预编译着色器:

fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext

使用常规 C++ 文件加载代码加载预编译着色器数据。

在伪代码中:

byte * data = loadFile("precompiledShader.ext");
IDirect3DPixelShader9 *ps = NULL;
HRESULT hr = device->CreatePixelShader(data, ps);

build your precompiled shader from the command line using fxc:

fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext

load the precompiled shader data using regular c++ file loading code.

in psuedo-ish code:

byte * data = loadFile("precompiledShader.ext");
IDirect3DPixelShader9 *ps = NULL;
HRESULT hr = device->CreatePixelShader(data, ps);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文