Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将预编译的HLSL着色器加载到内存中以与CreatePixelShader一起使用_C++_Direct3d_Hlsl - Fatal编程技术网

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

C++ 将预编译的HLSL着色器加载到内存中以与CreatePixelShader一起使用,c++,direct3d,hlsl,C++,Direct3d,Hlsl,我需要将编译后的像素着色器加载到内存中,以便与CreatePixelShader一起使用,但我不能使用任何D3DX调用 我该怎么做 (我使用Visual Studio 2010作为编译器和C++作为语言)< p>使用FXC:从命令行构建预编译着色器 fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext 使用C++的文件加载代码加载预编译着色器数据。 在psuedo ish代码中: byte * data = loadFi

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

我该怎么做


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

< p>使用FXC:

从命令行构建预编译着色器
fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext

使用C++的文件加载代码加载预编译着色器数据。 在psuedo ish代码中:

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

我知道之前有人发布了伪代码。这里是使用Windows SDK的C++代码(而不是按要求的D3DX库)。 这里的“PixelShader.cso”是Visual Studio 11从项目中的.hlsl文件生成的预编译hlsl着色器。默认情况下,编译的.cso文件通常会移动到Projects/ProjectName/Debug文件夹。因此,在使用之前,必须将其剪切并粘贴到与源代码相同的目录中。请注意,在Visual Studio 11中右键单击HLSL文件并编辑输出设置可以更改此设置。默认情况下,其:$(OutDir)%(Filename).cso,将其更改为:$(Directory)%(Filename).cso


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

为什么不能使用D3DX?你根本不使用DirectX,还是这是一种测试?@Coshman要么像我一样,喜欢理解帮助函数在做什么,要么他可以预见未来并看到这一点。是的,MS决定破坏旧代码,因为。。。太太讽刺的是,您仍然需要定义NOMINMAX来构建一个简单的Windows应用程序。如图所示。如何在修改cso时计算其校验和。我的CreateVertexShader在校验和验证时失败
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);