DX11 How do I work with ID3D10Include::Open()?

Recommended Posts

Hi guys, since yesterday I want to try to include additional HLSL Shader Files with the D3DX11 Effect Framework but I have none success. As I looked to the documentation, I found out that I have to create a class which inherits from ID3D10Include and I have to write the functions Open() and Close(). I think Close() isn't a problem, but Open(). As I read from documentation, I'm reading "A user-implemented method for opening and reading the contents of a shader #include file.". So I'm understanding that I have to read the content from a file and save it into ppData. Am I right?
// The defined open Method for ID3D10Include
STDMETHOD(Open)(D3D10_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes)
{
FILE *f = fopen(pFileName, "rb");
if(f == nullptr)
{
char buffere[2048];
sprintf_s(buffere, 2048, "Could not load the effect include file \"%s\".", pFileName);
BSX_ERROR(buffere);
return E_FAIL;
}

// Get the file size
fseek(f, 0, SEEK_END);
long sz = ftell(f);
fseek(f, 0, SEEK_SET);

// Get the file content
char *buffer = new char[sz];
fclose(f);

// Save the file data into ppData and the size into pBytes.
*ppData = buffer;
pBytes = new UINT; *pBytes = UINT(sz);

// return E_FAIL; // Because it isn't successfull supported...
return S_OK;
}

But it doesn't work and my shader is telling me, that the definitions from the include file are not known. Another possibility I checked out was to compile the shader file. But here the shader will completly fail. The ID3D10Include::Open() should be identical with it from D3D9 and D3D10 the documentation says. Has somebody an idea where the problem is or knows my ideologic error? [oh] Thank you

Share on other sites
DieterVW    724
First, your code has an error. pBytes is being passed in so that you can set the size, not create a new UINT. Your code should read *pByte = sz; It's not working right now because the size value after the call to open would still be zero and your memory would be leaked.

The other thing is that the compiler will search for include files automatically in the same directory as the file you are trying to compile (provided that the include object is NULL). If I recall correctly, I believe that it even recursively searches down the sub directories. This interface is more useful for doing things like opening resources that are in the exe, like a resource file, or unpacking shaders that are in zip files.

Share on other sites
Oh my god, and now it works fine.

Sometimes I watching hours to the monitor and a can't find the bug. What for an horror to waste time for this simple bug.

Really really thank you! [smile] And the day is saved!

Create an account

Register a new account

• Similar Content

• By gsc
Hi! I am trying to implement simple SSAO postprocess. The main source of my knowledge on this topic is that awesome tutorial.
But unfortunately something doesn't work... And after a few long hours I need some help. Here is my hlsl shader:
float3 randVec = _noise * 2.0f - 1.0f; // noise: vec: {[0;1], [0;1], 0} float3 tangent = normalize(randVec - normalVS * dot(randVec, normalVS)); float3 bitangent = cross(tangent, normalVS); float3x3 TBN = float3x3(tangent, bitangent, normalVS); float occlusion = 0.0; for (int i = 0; i < kernelSize; ++i) { float3 samplePos = samples[i].xyz; // samples: {[-1;1], [-1;1], [0;1]} samplePos = mul(samplePos, TBN); samplePos = positionVS.xyz + samplePos * ssaoRadius; float4 offset = float4(samplePos, 1.0f); offset = mul(offset, projectionMatrix); offset.xy /= offset.w; offset.y = -offset.y; offset.xy = offset.xy * 0.5f + 0.5f; float sampleDepth = tex_4.Sample(textureSampler, offset.xy).a; sampleDepth = vsPosFromDepth(sampleDepth, offset.xy).z; const float threshold = 0.025f; float rangeCheck = abs(positionVS.z - sampleDepth) < ssaoRadius ? 1.0 : 0.0; occlusion += (sampleDepth <= samplePos.z + threshold ? 1.0 : 0.0) * rangeCheck; } occlusion = saturate(1 - (occlusion / kernelSize)); And current result: http://imgur.com/UX2X1fc
I will really appreciate for any advice!
• By isu diss
I'm trying to code Rayleigh part of Nishita's model (Display Method of the Sky Color Taking into Account Multiple Scattering). I get black screen no colors. Can anyone find the issue for me?

• I made my obj parser
and It also calculate tagent space for normalmap.
it seems calculation is wrong..
any good suggestion for this?
https://gamedev.stackexchange.com/questions/147199/how-to-debug-calculating-tangent-space
and I uploaded my code here

• Hi guys,

I dont know if this is the right section, but I did not know where to post this.
I am implementing a day night cycle on my game engine and I was wondering if there was a nice way to interpolate properly between warm colors, such as orange (sunset) and dark blue (night) color. I am using HSL format.
Thank  you.

• I am aiming to learn Windows Forms with the purpose of creating some game-related tools, but since I know absolutely nothing about Windows Forms yet, I wonder:
Is it possible to render a Direct3D 11 viewport inside a Windows Form Application? I see a lot of game editors that have a region of the window reserved for displaying and manipulating a 3D or 2D scene. That's what I am aiming for.
Otherwise, would you suggest another library to create a GUI for game-related tools?

EDIT:
I've found a tutorial here in gamedev that shows a solution:
Though it's for D3D9, I'm not sure if it would work for D3D11?

• 9
• 10
• 18
• 9
• 9