728x90

※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다.

※ 생략 되어 있는 부분이 많습니다.

 

 

struct Vtx
 {
      D3DXVECTOR3 p;

      Vtx() : p(0, 0, 0) {}
      Vtx(FLOAT X, FLOAT Y, FLOAT Z) : p(X, Y, Z) {}

      enum { FVF = (D3DFVF_XYZ), };
 };

 

LPDIRECT3DVERTEXSHADER9  m_pVs;

LPDIRECT3DVERTEXDECLARATION9  m_pFVF;

LPD3DXCONSTANTTABLE  m_pTbl; 

D3DXHANDLE  m_hDif;

Vtx   m_pVtx[3];

 

정점 구조체 선언하고, 필요한 객체들 (정점 셰이더, 정점 선언자, 상수 테이블, 핸들) 선언해주고,

삼각형을 그리기위한 정점 3개 선언해준다. 

 

** shader.fx **

 

// 전역 변수
float4 Dif  = float4(0,1,1,1); //파랑색 계열

void VtxPrc( in float3 iPos : POSITION, out float4 oPos: POSITION, out float4 oD0 : COLOR)
{
     // 지역 변수
     float4 Dif  = float4(1,1,0,1); //노랑색 계열

     oPos = float4(iPos, 1);
     oD0  = Dif;
}

shader.fx라고 하는 셰이더 파일을 외부로부터 작성한다. 정점들의 포지션값을 입력받고 새로 포지션 값과, 색상을 지정하여 리턴해준다.

 

HRESULT hr = D3DXCompileShaderFromFile("data/shader.fx", NULL, NULL, "VtxPrc", "vs_1_1", dwFlags, &pShd, &pErr, &m_pTbl );

 

//m_hDif = m_pTbl->GetConstantByName(NULL, "Dif");

 

m_pVtx[0] = Vtx(-1, -1, 0);
m_pVtx[1] = Vtx(0, 1, 0);
m_pVtx[2] = Vtx(1, -1, 0);

 

D3DXCompileShaderFromFile을 이용하여 외부에서 셰이더파일을 불러와 컴파일을 해준다.

상수 테이블(m_pTbl)로부터 GetConstantByName을 이용하여 셰이더 파일 안에있는 Dif의 핸들을 얻어온다.

 

m_pdev->SetRenderState(D3DRS_LIGHTING, FALSE);


m_pdev->SetVertexShader(m_pVs);
m_pdev->SetVertexDeclaration(m_pFVF);


D3DXCOLOR color(1, 0, 1, 1); //보라색 계열


 

// 이름에 의한 상수 레지스터 설정
m_pTbl->SetVector(m_pdev, "Dif", (D3DXVECTOR4*)&color);

 

// 핸들에 의한 상수 레지스터 설정
m_pTbl->SetVector(m_pdev, m_hDif, (D3DXVECTOR4*)&color);

 

m_pdev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, m_pVtx, sizeof(Vtx));

 

m_pdev->SetVertexDeclaration(NULL);
m_pdev->SetVertexShader(NULL);

 

SetVertexShader을 이용하여 셰이더를 사용한다 알리므로 shader.fx 파일안에 있는 VtxPrc 함수안의 지역변수 Dif값으로 인해 삼각형이 노랑색으로 나오게 된다. 만약 지역변수 Dif값을 삭제하면,

 

D3DXCOLOR color(1, 0, 1, 1); 이 부분으로 인해 전역변수 Dif값이 보라색으로 바뀌게 되고 삼각형이 보라색으로 나오게 된다.

 

셰이더안의 값을 변경하는 방법으로는 

1.

m_pTbl->SetVector(m_pdev, "Dif", (D3DXVECTOR4*)&color);

 

와 같이 "Dif"처럼 직접 이름을 지정해주는 방법.

 

2.

m_hDif = m_pTbl->GetConstantByName(NULL, "Dif");

m_pTbl->SetVector(m_pdev, m_hDif, (D3DXVECTOR4*)&color);

 

와 같이 GetConstantByName을 이용하여 상수 테이블로부터 핸들을 얻어오는 방법이 있다.

 

상수 테이블에는 셰이더파일 안에 들어있는 변수들의 정보가 들어있다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침