Jump to content
  • Advertisement
Sign in to follow this  
jiro27

DX11 Why does D3DX11CompileFromFile keep returning a NULL pointer?

This topic is 2188 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi everyone, I'm really new to DirectX programming and I have been having a problem with the attached code, [attachment=11424:drawTriangle.txt], where I am getting the error:
Unhandled exception at 0x777b15de in d3dDrawTriangle.exe: 0xC0000005: Access violation reading location 0x00000000.

[font=arial, helvetica, sans-serif]I've narrowed the problem down to these lines:[/font]
[font=courier new,courier,monospace] // load and compile the two shaders[/font]
[font=courier new,courier,monospace] ID3D10Blob *VS, *PS;
ID3D10Blob *VErrorMessage, *PErrorMessage;
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, &VErrorMessage, 0); // for some reason this is returning a NULL pointer for &VS
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, &PErrorMessage, 0); // for some reason this is returning s NULL pointer for &PS[/font]
[font=courier new,courier,monospace] // encapsulate both shaders into shader objects
dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);[/font]
[font=arial, helvetica, sans-serif]After some research I figured out that for some reason, D3DX11CompileFromFile is returning a NULL pointer, so when it tries to use VS, and I'm assuming PS, it is NULL, and thus doesn't work. I've tried updating my graphics card driver, but that hasn't helped, and I have no idea how to fix this problem. [/font][font=arial, helvetica, sans-serif]Any help would be amazing.[/font]
[font=arial, helvetica, sans-serif]Also, here's the shader file I am using:[/font]
struct VOut
[font=arial, helvetica, sans-serif][font=courier new,courier,monospace]{
float4 position : SV_POSITION;
float4 color : COLOR;
};[/font][/font]
[font=arial, helvetica, sans-serif][font=courier new,courier,monospace]VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
VOut output;[/font][/font]
[font=arial, helvetica, sans-serif][font=courier new,courier,monospace] output.position = position;
output.color = color;[/font][/font]
[font=arial, helvetica, sans-serif][font=courier new,courier,monospace] return output;
}[/font][/font]

[font=arial, helvetica, sans-serif][font=courier new,courier,monospace]float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
return color;
}[/font][/font]

Share this post


Link to post
Share on other sites
Advertisement
If you take your VErrorMessage and PErrorMessage blobs, call GetBufferPointer on them and cast the result to "char *" it will tell you what went wrong. Most probable is that it can't find the files you specify.char *verror = (char *) VErrorMessage->GetBufferPointer ();
char *perror = (char *) PErrorMessage->GetBufferPointer ();
Edited by mhagain

Share this post


Link to post
Share on other sites

If you take your VErrorMessage and PErrorMessage blobs, call GetBufferPointer on them and cast the result to "char *" it will tell you what went wrong. Most probable is that it can't find the files you specify.

Alright, I did that, and the char on both Error Messages results to this:
= CXX0030: Error: expression cannot be evaluated
I don't really get what that means, and I have moved the shaders.hlsl file into the project file, but that hasn't helped. I'm still stuck...

Share this post


Link to post
Share on other sites
If you provide the file name but not the path, the file is expected to be in the same directory as the executable. The file being included in the project does not in any way guarantee this.

A robust way is to get the path of the executable using GetModuleFileName (, strip the exe file name from that), and concatenate it with the shader file name.

The error blobs do not catch "file not found", because the errors are written by the compiler after it actually gets to work on a found file data.

Share this post


Link to post
Share on other sites
Have you ever checked the return code (HRESULT) of the D3DX11CompileFromFile() call?

If it's unclear whether the FromFile() methods even know where to find the files in the first place, you should use a custom loader for the hlsl data. First make sure the data is available, then pass it to D3DX11CompileFromMemory. Edited by eppo

Share this post


Link to post
Share on other sites
Alright, maybe I need to first ask how I properly add a shader file to VC++ 2010 in the first place, as this might be the main problem.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!