Jump to content

  • Log In with Google      Sign In   
  • Create Account


Compiling and using shaders

  • You cannot reply to this topic
23 replies to this topic

#21 megadan   Members   -  Reputation: 452

Like
1Likes
Like

Posted 06 September 2014 - 12:27 PM

Ah ok, I think I see what you're asking now.  Compiling a shader at your program runtime with D3DCompileFromFile is actually no different from compiling the shader offline from the command line using fxc.exe.  The same steps are performed and the same shader bytecode is generated.  So using #ifndef/#define will work exactly the same in both cases.

 

Edit: The shader compilation step (either through D3DCompileFromFile or fxc.exe) is what handles processing the defines.  So the defines work the same both ways.  Your actual application runtime or compilation doesn't affect it.


Edited by megadan, 06 September 2014 - 12:40 PM.


Sponsor:

#22 InfoGeek   Members   -  Reputation: 167

Like
0Likes
Like

Posted 06 September 2014 - 12:43 PM

yeah but...

 

say i have:

 

common.hlsli

#ifndef POOP_H
#define POOP_H

// whatever shared code goes here.

#endif

and i have two shader that use that include:

 

shader1.hlsl

#include "common.hlsli"

// Whatever entry.

shader2.hlsl

#include "common.hlsli"
#include "common.hlsli"

// Whatever entry.

then:

D3DCompileFromFile(L"shader1.hlsl", 0, 0, "PS", "ps_5_0", 0, 0, &PS_Buffer, 0);

D3DCompileFromFile(L"shader2.hlsl", 0, 0, "PS", "ps_5_0", 0, 0, &PS_Buffer2, 0);

this is all runtime, so will the common.hlsli be included 3 times ? 2 ? 1? how does this happen? would it be different if it were at compile time?



#23 megadan   Members   -  Reputation: 452

Like
2Likes
Like

Posted 06 September 2014 - 12:59 PM

shader1.hlsl and shader2.hlsl will both have exactly one copy of common.hlsli.  This works because D3DCompileFromFile is performing all of the steps necessary to make that happen.  

 

It opens shader1.hlsl, parses the #include, opens common.hlsli, defines POOP_H, copies the contents into shader1.hlsl, and then compiles the shader and generates the bytecode which is returned in PS_Buffer.  

 

For shader2.hlsl, it parses the first #include, opens common.hlsli, defines POOP_H, copies the contents into shader1.hlsl, parses the second include, POOP_H is already defined so the contents are not copied again, and then compiles the shader to bytecode.

 

This is a slight simplification from the actual steps, but this is essentially what happens.  Each shader file compilation has its own local set of defines which is why POOP_H wasn't defined at first for shader2.hlsli and the contents were able to be copied.



#24 InfoGeek   Members   -  Reputation: 167

Like
2Likes
Like

Posted 06 September 2014 - 01:06 PM

great stuff megadan laugh.png i am very grateful for your patience with me. i believe this thread has all the answers to compile and use shaders. i'm sure it will be useful to any beginner who comes here googling.

 

once again thanks everyone!







PARTNERS