쉐이더 코드내에서도 #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
set this to NULL to specify no macros.
라고 나와있고, D3D10CompileShader()의 매개변수에 대한 부분을 보면,
라고 나와있다. 그래서...
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 |