DirectX Graphics 프로그래밍 가이드 고도의 주제 이펙트 이펙트값의 취득과 설정   [목차열람] [주소복사] [슬롯비우기]
이펙트값의 취득과 설정
 
Microsoft DirectX 9.0

이펙트값의 취득과 설정


이펙트값의 취득과 설정은,ID3DXBaseEffect 의 몇개의 타입 고유 메서드를 사용해 실행한다. 또는,ID3DXBaseEffect::GetValueID3DXBaseEffect::SetValue 의 2 개의 범용 메서드만으로도 실행할 수 있다. 이것은 임의의 파라미터 또는 어노테이션, 단순한 형태, 구조체, 배열, 캐릭터 라인, 셰이더, 텍스처를 포함한다. 이러한 2 개의 메서드는,ID3DXBaseEffect 의 거의 모든 GetxxxSetxxx 호출 대신에 사용할 수 있다.

이러한 모든 예로, 나타나고 있는 캐릭터 라인 대신에 핸들을 사용할 수 있다.

임의의 값의 취득

다음과 같은 이펙트 파일 파라미터가 주어지고 있다고 한다.

float fValue;
float4 vecLight;
float4x4 mWorld;
float3x2 m3x2matrix;
string xFile = "bigship1.x";
texture tex1;
vertexshader vsMyShader;
vertexshader vsArray[4] = {
    /* initialize 4 vertex shaders here ... */
};

struct {
    float fArray[4];
    float fSingle;
} myStruct, myStructArray[2];

// and a pointer to an effect interface
LPD3DXEFFECT pEffect;
// which needs to be initialized before using it.

단일의 부동 소수점수(실수)값을 얻어온다.

FLOAT f;
pEffect->GetValue("fValue", (void*) &f, D3DX_DEFAULT);

캐릭터 라인을 얻어온다.

LPCSTR szString;
pEffect->GetValue("xFile", (void*) &szString, sizeof(LPCSTR));

정점 셰이더를 얻어온다. 셰이더는 텍스처와 완전히 같은 방법으로 처리한다. 불필요하게 된 셰이더는, 릴리즈 할 필요가 있다.

LPDIRECT3DVERTEXSHADER9 pVShader;
pEffect->GetValue("vsMyShader", (void*) &pVShader, sizeof(LPDIRECT3DVERTEXSHADER9));
SAFE_RELEASE(pVShader);

벡터를 얻어온다.

D3DXVECTOR4 vecLight;
pEffect->GetValue("vecLight", (void*)(FLOAT*) vecLight, sizeof(D3DXVECTOR4));

행렬을 얻어온다.

D3DXMATRIX matWorld;
pEffect->GetValue("mWorld", (void*)(FLOAT*) matWorld, sizeof(D3DXMATRIX));

4 × 4 가 아닌 행렬을 얻어온다. 행렬은 패딩없이 저장 되므로, 3 × 2 행렬은 6 개의 부동 소수점수(실수)이다.

FLOAT m3x2matrix[3 * 2];
pEffect->GetValue("m3x2matrix", (void*) m3x2matrix, desc.Bytes);

GetParameterDesc 로 설정한 D3DXPARAMETER_DESC "desc" 가 있는 경우는, desc.Bytes 를 건네줄 수도 있다.

캐릭터 라인을 얻어온다. const 캐릭터 라인의 포인터를 얻어온다 뿐이다. 사이즈는 항상 sizeof(LPCSTR)이며, 이 이펙트를 사용해 더 이상 처리를 실행한 후에 캐릭터 라인이 남아 있는 보증은 없기 때문에, 향후 사용할 예정이 있는 경우는, 캐릭터 라인을 복사 할 필요가 있다.

LPCSTR szString;
pEffect->GetValue("xFile", (void*) &szString, sizeof(LPCSTR));

텍스처를 얻어온다. 텍스처 파라미터의 포인터를 설정해, 참조 카운트를 인크리먼트(increment) 한다. 그 때문에, 포인터의 처리가 종료하면 그 포인터에 대한 Release 를 호출해야 한다.

LPDIRECT3DBASETEXTURE9 pTexture;
pEffect->GetValue("tex1", (void*) &pTexture, sizeof(LPDIRECT3DBASETEXTURE9));
SAFE_RELEASE(pTexture);

정점 셰이더의 포인터 배열을 얻어온다.

LPDIRECT3DVERTEXSHADER9 pVSArray[4];
pEffect->GetValue("vsArray", (void*) pVSArray, sizeof(LPDIRECT3DVERTEXSHADER9) * 4);
// don't forget to release each object in the array

myStruct 를 얻어온다. 구조체는 항상 수치형이며, 패딩없이 투영 된다. 이 예의 구조체는 5 개의 부동 소수점수(실수)를 가지므로, 그것을 보관 유지하는 배열을 초기화한다.

FLOAT pMyStruct[4 + 1];
pEffect->GetValue("myStruct", (void*) pMyStruct, sizeof(pMyStruct));

구조체의 배열을 얻어온다.

FLOAT pMyStructArray[ (4+1) * 2 ];
pEffect->GetValue("myStructArray, (void*) pMyStructArray, sizeof(pMyStructArray));

임의의 값의 설정

단일의 부동 소수점수(실수)값을 설정한다.

FLOAT f = 1.0f;
pEffect->SetValue("fValue", (void*) &f, D3DX_DEFAULT);

캐릭터 라인을 설정한다.

LPCSTR szString = "some string";
pEffect->SetValue("xFile", (void*) &szString, sizeof(LPCSTR));

정점 셰이더를 설정한다. 셰이더는 텍스처와 완전히 같은 방법으로 처리한다. 불필요하게 된 셰이더는, 릴리즈 할 필요가 있다.

LPDIRECT3DVERTEXSHADER9 pVShader; // needs initialization
pEffect->SetValue("vsMyShader", (void*) &pVShader, sizeof(LPDIRECT3DVERTEXSHADER9));
SAFE_RELEASE(pVShader);

벡터를 설정한다.

D3DXVECTOR4 vecLight; // needs initialization
pEffect->SetValue("vecLight", (void*)(FLOAT*) vecLight, sizeof(D3DXVECTOR4));

행렬을 설정한다.

D3DXMATRIX matWorld; // needs initialization
pEffect->SetValue("mWorld", (void*)(FLOAT*) matWorld, sizeof(D3DXMATRIX));

4 × 4가 아닌 행렬을 설정한다. 행렬은 패딩없이 저장 되므로, 3 × 2 행렬은 6 개의 부동 소수점수(실수)이다.

FLOAT m3x2matrix[3 * 2]; // needs initialization
pEffect->SetValue("m3x2matrix", (void*) m3x2matrix, desc.Bytes);

GetParameterDesc 로 설정한 D3DXPARAMETER_DESC "desc" 가 있는 경우는, desc.Bytes 를 건네줄 수도 있다.

캐릭터 라인을 설정한다. const 캐릭터 라인의 포인터를 얻어온다 뿐이다. 사이즈는 항상 sizeof(LPCSTR)이며, 이 이펙트를 사용해 더 이상 처리를 실행한 후에 캐릭터 라인이 남아 있는 보증은 없기 때문에, 향후 사용할 예정이 있는 경우는, 캐릭터 라인을 복사 할 필요가 있다.

LPCSTR szString; // needs initialization
pEffect->SetValue("xFile", (void*) &szString, sizeof(LPCSTR));

텍스처를 설정한다. 텍스처 파라미터의 포인터를 설정해, 참조 카운트를 인크리먼트(increment) 한다. 그 때문에, 포인터의 처리가 종료하면, 그 포인터에 대한 Release를 호출해야 한다.

LPDIRECT3DBASETEXTURE9 pTexture; // needs initialization
pEffect->SetValue("tex1", (void*) &pTexture, sizeof(LPDIRECT3DBASETEXTURE9));
SAFE_RELEASE(pTexture);

다음과 같이, 정점 셰이더의 포인터 배열을 설정한다.

LPDIRECT3DVERTEXSHADER9 pVSArray[4]; // needs initialization
pEffect->SetValue("vsArray", (void*) pVSArray, sizeof(LPDIRECT3DVERTEXSHADER9) * 4);
// Don't forget to release each object in the array.

myStruct 를 설정한다. 구조체는 항상 수치형이며, 패딩없이 투영 된다. 이 예의 구조체는 5 개의 부동 소수점수(실수)를 가지므로, 그것을 보관 유지하는 배열을 초기화한다.

FLOAT pMyStruct[4 + 1]; // needs initialization
pEffect->SetValue("myStruct", (void*) pMyStruct, sizeof(pMyStruct));

구조체의 배열을 설정한다.

FLOAT pMyStructArray[ (4+1) * 2 ]; // needs initialization
pEffect->SetValue("myStructArray, (void*) pMyStructArray, sizeof(pMyStructArray));


© 2002 Microsoft Corporation. All rights reserved.
↑TOP