DirectX 10

쉐이더 이펙트 생성시 define을 사용했을때 런타임 에러 발생하는 경우

공대나온남자 2010. 9. 21. 18:26

쉐이더 코드내에서도 #define, #ifdef 등등을 사용할 수 있다. #define 을 코드 내에 직접 넣을 수도 있고 이펙트를 생성할 때 추가시킬 수도 있다. 이펙트를 생성하는 API들을 보면 define 리스트를 매개변수로 받는다. 예로 D3DX10CreateEffectFromFile()를 보면,

 

HRESULT D3DX10CreateEffectFromFile(
  LPCTSTR pFileName,
  CONST D3D10_SHADER_MACRO *pDefines,
  ID3D10Include *pInclude,
  LPCSTR pProfile,
  UINT HLSLFlags,
  UINT FXFlags,
  ID3D10Device *pDevice,
  ID3D10EffectPool *pEffectPool,
  ID3DX10ThreadPump *pPump,
  ID3D10Effect **ppEffect,
  ID3D10Blob **ppErrors,
  HRESULT *pHResult
);

처럼 define 리스트를 매개변수를 받는 부분을 볼 수 있다.

그래서 이펙트를 생성할 때 D3D10_SHADER_MACRO 의 리스트를 넘겨주면 되는데...

 

DX SDK를 보면,

 

You may use macros in your shaders. This enables the application to #define tokens at runtime, before the file is parsed. This structure defines a single macro. For example:

D3D10_SHADER_MACRO Shader_Macros[1] = { "zero", "0"  };
라고 나와있다. 하지만 이런 식으로 하면 정체를 알 수 없는 런타임 에러가 발생한다. 무엇이 문제일까. 
SDK에서 D3DX10CreateEffectFromFile()의 매개변수에 대한 부분을 보면,
 pDefines 
[in] A NULL-terminated array of shader macros (see D3D10_SHADER_MACRO);
set this to NULL to specify no macros.

라고 나와있고, D3D10CompileShader()의 매개변수에 대한 부분을 보면,

pDefines
[in] Optional. Pointer to an array of macro definitions (see D3D10_SHADER_MACRO). The last structure in the array serves as a terminator and must have all members set to 0. If not used, set pDefines to NULL.

 

라고 나와있다. 그래서...

 

D3D10_SHADER_MACRO Shader_Macros[1] = { "zero", "0", NULL  };

이런식으로 하면 별문제 없이 동작한다.

 

MS... 이딴식으로 할거야? 앙?

'DirectX 10' 카테고리의 다른 글

텍스쳐 해제  (0) 2011.06.13
Rendering to multi window in DX10  (0) 2011.03.13
쉐이더 파일 내에서 Render State 설정  (0) 2010.11.20
텍스쳐 포맷  (0) 2010.09.29
Register에 텍스쳐 할당하기  (0) 2010.06.22