티스토리 뷰

HLSL 프로그램은 ASCII 문자 형태로만 작성이 되면 된다.

프로그래밍 하는 코드 안에 문자열로 코드를 포함하는것도 가능하다.

 

D3DXCompileShader 함수를 이용하여 다음과 같이 컴파일하며

(D3DXCompileShader : 컴파일된 셰이더 코드를 리턴한다.    

실패했을 경우에는

 LPD3DXBUFFER 타입 변수( pError )에 오류코드와 메세지 문자열을 담아 E_FAIL을 리턴한다)

 

컴파일된 셰이더코드를 가져다가 이렇게 셰이더를 만들어준 후 이용했던 pShader 를 해제해준다.

 

 

 

 

그치만그치만그치만

모듈화/ 편리함의 측면에 있어 프로그래밍코드와 셰이더코드는 분리를 하는것이 바람직하다

.txt .fx등의 파일형태로 저장하고

프로그래밍 코드에서는 해당파일로 셰이더를 로딩해오기만 하자

D3DXCompileShaderFromFile 함수를 이용하면 되는데 픽셀셰이더, 버텍스 셰이더 둘다 컴파일할 수 있다

 

셰이더 버전은

버텍스셰이더 : vs_1_1, vs_2_0, vs_2_sw 등등

픽셀셰이더 : ps_1_1, ps_1_1, ps_1_3, ps_1_4, ps_2_0, ps_2_sw 등등

이 있다.

컴파일된 셰이더 코드를 가져다가

 요렇게 셰이더를 만들어주면 된다.(윗부분에 있는것과 같음)

 

 

파일에 픽셀셰이더와 버텍스셰이더를 동시에 넣는것도 가능하며

위에서 불러왔던 shader.fx에 픽셀셰이더도 있다면

 

이렇게 똑같이 픽셀셰이더도 컴파일하고 만들어주면된다.

 

 

 

//에러메세지를 위한 여러가지 방법

 if (FAILED(hr))
 {
  char sErr[2048] = { 0 };
  if (pError)
  {
   char* s = (char*)pError->GetBufferPointer();
   sprintf(sErr, s);
  }
  else
  {
   sprintf(sErr, "Cannot Compile Shader.");
  }

  MessageBox(hWnd, sErr, "Err", MB_ICONEXCLAMATION);
  return -1;
 }

//////////////

  if (pError)
  {
   OutputDebugStringA((char*)pError->GetBufferPointer());
   SAFE_RELEASE(pError);
  }

//////////////


  if(pError)
  {
   int size = pError->GetBufferSize();
   void *str = pError->GetBufferPointer();

   if (str)
   {
    char* printStr = new char[size];
    sprintf(printStr, (const char*)str, size);
    OutputDebugString(printStr);
    delete[] str;
   }


  }

 

 

튤텨 및 참고

셰이더 프로그래밍입문 책

http://3dapi.com/bs26_shader2/

 

댓글