렌더몽키 기초

셰이더를 테스트하고 실행 해볼수 있는 툴은 RenderMonkey와 FX Composer가 있다.
여기 설명에 사용된 렌더몽키 버전은 1.71이다.

화면에 버텍스와 텍스쳐를 렌더링 하는 쉐이더를 작성하는 방법을 단계적으로 설명하겠다.
File 메뉴에서 Add Effect Group --> Effect Group w/DirectX Effect를 실행하여 이펙트 그룹을 생성한후 작업을
교체하는 방법이 가장 간단하고 편하다.

간단한 방법이 있지만 기초를 다지기 위해 한단계씩 익히는 방식으로 진행하겠다.

1. Add Effect Group:   
Empty Effect Group  --> 이름 수정 ("MyEffect Group")

Effect Workspace 마우스 오른쪽 버튼을 눌러 이펙트 그룹을 만든다.

2. Add Effect:   
DirectX --> DirectX  --> 하위트리 모두 삭제 --> 이름 수정 ("MyEffect")

"MyEffect Group" 마우스 오른쪽 버튼을 눌러 이펙트를 추가한다.

3. Add Variable:
matrix - float[4X4]  --> 이름 수정("matWorldViewProj")
Variable Symantic --> WorldViewProjection

"MyEffect Group" 마우스 오른쪽 버튼을 눌러 전역 변수를 추가한다.
"matWorldViewProj" Variable Symantic을 WorldViewProjection으로 변환해야 화면에 제대로 출력된다.

4. Add Model --> Teapot.3ds

"MyEffect Group" 마우스 오른쪽 버튼을 눌러 렌더링할 모델을 선택한다.

5. Add Stream Mapping:
이름 수정("MyMapping")

"MyMapping"를 더블클릭하여 셰이더에의해 그려질 입력 데이터를 추가한다. default로 POSITION이 들어 있으니
Usage - TEXCOORD, Data Type - FLOAT2만 추가한다.

Attribute Name은 셰이더 에디터에서 OpenGL ES effect를 사용할때는 적용되지만,
DirectX 나 OpenGL effect에서는 제대로 적용 안되고 있다.

 

6. Add Texture :
hex.dds 추가

사용할 셰이더를 추가한다.

7. Add Pass :
차일드 트리 노드 모두 삭제

Add Pass를 추가하면 셰이더를 코드를 추가할 수 있다.

8. Add Model Reference
Teapot 클릭

"Pass 0"에서 마우스 오른쪽 버튼을 눌러 패쓰에서 참조할 모델을 지정한다.

9. Add Stream Mapping Reference
MyMapping

"Pass 0"에서 마우스 오른쪽 버튼을 눌러 패쓰에서 참조할 맵핑을 지정한다.

10. Add Texture Object
Hex 클릭

"Pass 0"에서 마우스 오른쪽 버튼을 눌러 패쓰에서 참조할 텍스쳐를 지정한다.

11. Add Vertex Shader
DirectX HLSL

Vertex Shader를 더블 클릭하여 아래의 코드를 입력한다.

//Vertex Shader

float4x4 matWorldViewProj;

 

struct VS_OUTPUT

{

   float4 Pos: POSITION;

   float2 Tex: TEXCOORD0;

};

 

 

VS_OUTPUT vs_main( float4 inPos: POSITION, float2 Tex: TEXCOORD0 )

{

   VS_OUTPUT Out;

 

   Out.Pos = mul(inPos, matWorldViewProj);  //3D --> 2D

   Out.Tex = Tex;

 

   return Out;

}

 

12. Add Pixel Shader :
DirectX HLSL

Pixel Shader를 더블 클릭하여 아래의 코드를 추가한다.

//Pixel Shader

sampler Texture0;

 

float4 ps_main(float4 inDiffuse: COLOR0, float2 inTex: TEXCOORD0)

: COLOR0

{

   return tex2D(Texture0,inTex);

}