9

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)

Calin Leafshade
  • 1,175
  • 1
  • 11
  • 21
  • Why can't you use D3DX? are you not using DirectX at all, or is this some sort of test? – thecoshman Feb 16 '11 at 18:26
  • @thecoshman Either he, like me, likes to understand what helper functions are doing, or he could see the future and saw this [link](https://blogs.msdn.microsoft.com/chuckw/2013/08/20/living-without-d3dx/). Yes, MS decided to break legacy code because... MS... Ironicaly enough, you still have to `#define NOMINMAX` to build a simple Windows application. Go figure. – user1593842 Aug 22 '18 at 22:38

2 Answers2

22

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.

izb
  • 45,586
  • 39
  • 110
  • 165
gundamb2
  • 243
  • 3
  • 6
6

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);
Jasper
  • 116
  • 4