shader SetValue

반응형


ID3DXBaseEffect::SetValue

Set the value of an arbitrary parameter or annotation, including simple types, structs, arrays, strings, shaders and textures.

HRESULT SetValue(
  D3DXHANDLE hParameter,
  LPCVOID pData,
  UINT Bytes
);
그래그래.. 분명 msdn에는 setvalue함수에 어레이가 가능하다고 적혀있단 말이야.
그래서 난 큐브를 찍기 위해 아래와 같이 정점을 만들었지.
D3DXVECTOR3 vertices[] =
 {
  D3DXVECTOR3( -1,  1,  1),  /// v0
  D3DXVECTOR3(  1,  1,  1),  /// v1
  D3DXVECTOR3(  1,  1, -1),  /// v2
  D3DXVECTOR3( -1,  1, -1),  /// v3
  D3DXVECTOR3( -1, -1,  1),  /// v4
  D3DXVECTOR3(  1, -1,  1),  /// v5
  D3DXVECTOR3(  1, -1, -1),  /// v6
  D3DXVECTOR3( -1, -1, -1),  /// v7
 };
그리고 이 아이를 shader에게 이렇게 넘겨 주었어
pEffect->SetValue("vecPos", vertices, sizeof(D3DXVECTOR3)*8);
 
fx파일에는 이 변수가 전역으로 float3 vecPos[202]; 이렇게 선언되어 있었지.
그런데 십할~!!! 안되는거야.
 
그래서 결국 SetVectorArray를 써보았지.
그런데 SetVectorArray는 병신같이 vector4짜리만 받잖아?
결국 난 나의 아름다운 코드를 아래와 같이 고쳐서 테스트를 해봤어.
D3DXVECTOR4 vertices4[] =
 {
  D3DXVECTOR4( -1,  1,  1,1),  /// v0
  D3DXVECTOR4(  1,  1,  1,1),  /// v1
  D3DXVECTOR4(  1,  1, -1,1),  /// v2
  D3DXVECTOR4( -1,  1, -1,1),  /// v3
  D3DXVECTOR4( -1, -1,  1,1),  /// v4
  D3DXVECTOR4(  1, -1,  1,1),  /// v5
  D3DXVECTOR4(  1, -1, -1,1),  /// v6
  D3DXVECTOR4( -1, -1, -1,1),  /// v7
 };
그리고 이아이를 shader에게 알려주었지.
pEffect->SetVectorArray("vertices4", vertices4, 8);
그랬더니....십할..조낸 잘돼...ㅜㅜ..
 
그럼머야...머가 문제야....
무조건 vector4야 된다는 거야??
그래서 난 다시 어떻게든 msdn을 믿고 SetValue에게 Array를 실험해 보고 싶었지.
pEffect->SetValue("vecPos", vertices4, sizeof(D3DXVECTOR4)*8);
짜잔~ 결과는 십할 또안돼~~!!!
그럼 결국 SetValue는 Array는 지원 안하는 거야??
msdn이 내게 구라친거니???
 
그러다가 다시 세시간에 걸쳐 Pix와 PerfHUD를 통해 다시 캐삽질을 해서 알아낸 결과.....
SetValue로 어레이를 쓰고 싶다면 fx의 해당 변수에 사이즈를 맞추어라~!!!.
fx파일에서 float3 vecPos[202]; 라고 설정했으니까.
pEffect->SetValue("vecPos", vertices, sizeof(D3DXVECTOR3)*202); 이렇게 하던지
pEffect->SetValue("vecPos", vertices, D3DX_DEFAULT);            이렇게 하라는 거지..
조낸....젠장..ㅜㅜ...
해결이돼서 기쁘긴 한데....아까운 내시간은 어디로 가버린 거니??....
TAGS.

Comments