10

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)

2
  • Why can't you use D3DX? are you not using DirectX at all, or is this some sort of test? Commented Feb 16, 2011 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. 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. Commented Aug 22, 2018 at 22:38

2 Answers 2

23

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.

Sign up to request clarification or add additional context in comments.

1 Comment

How to calculate checksum of cso while modifying it. My createVertextShader fails on checksum validation
8

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

1 Comment

This is the right answer for D3D9 shaders. Note that since VS2013, HLSL files in the solution are compiled automatically to $(OutDir)%(Filename).cso, and that you have to select a lower D3D9 compatible shader model in the HLSL property pages.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.