Direct X Shader Programming 3 1 High Level























- Slides: 23

Direct. X Shader Programming 제 3 주차 1. High Level Shader Language 2. 램버트 확산 조명

High Level Shader Language Direct. X의 버전이 높아짐 셰이더 확장 복잡도 증가 High Level Shader Language 등 장






전역 변수의 선언 //전역변수 선언 float 4 x 4 m. MWP; //로컬 좌표 변환 //텍스쳐 texture Tex; // 텍스쳐 정보 sample Samp { Texture = Min. Filter Mip. Filter Address. U }; = sampler_state <Tex>; = LINEAR; Mag. Filter = LINEAR; = NONE; = CLAMP; Address. V = CLAMP;

정점 셰이더 출력용 구조체 struct VS_OUTPUT 다른 용도로도 사용 가능 { float 4 Pos : POSITION float 2 Tex. Coord : TEXCOORD 0 } 시멘틱스 : 출력레지스터에 대응 POSITION o. POS TEXCOORD 0 o. T 0

정점 셰이더 사용 VS_OUTPUT VS( float 4 Pos : POSITION float 2 Tex. Coord : TEXCOORD 0 ){ VS_OUTPUT Out = (VS_OUTPUT) = 0; Out. Pos = mul(Pos, m. WVP); Out. Tex. Coord = Tex; return Out; }

픽셀 셰이더 사용 float 4 PS( VS_OUTPUT In ) : COLOR { return tex 2 D( Samp, In. Tex. Coord ); } Tex 2 D 샘플러에 등록되어 있는 텍스쳐를 읽어옴

테크닉 tenique TShader { pass P 0 { Vertex. Shader = compile vs_1_1 VS(); Pixel. Shader = compile ps_1_1 PS(); } }


Create Effect #1 HRESULT D 3 DXCreate. Effect. From. File( LPDIRECT 3 DDEVICE 9 p. Device, // 디바이스 LPCTSTR p. Src. File, // 이펙트 파일 CONST D 3 DXMACRO * p. Defines, // 전처리기 옵션 (null) LPD 3 DXINCLUDE p. Include, // 옵션인터페이스 (null) DWORD Flags , // D 3 DXSHADER 식별용 LPD 3 DXEFFECTPOOL p. Pool, // 이펙트풀 LPD 3 DXEFFECT * pp. Effect, // 셰이더 변수 LPD 3 DXBUFFER * pp. Compilation. Errors // 에러를 저장할 곳 ); 적색을 제외한 나머지 옵션은 NULL을 넣어주면 OK 함수가 제대로 실행되면 S_OK 가 리턴되고, 아니면 에러넘버가 리턴됨

Create Effect #2 D 3 DXCreate. Effect. From. File로 이펙트를 컴파일 Get. Technique. By. Name() 이펙트 파일 내부의 테크닉 핸들을 얻어옴 Get. Parameter. By. Name() 테크닉 내부의 변수를 얻어옴 Technique = Effect->Get. Technique. By. Name( “TShader”); WVP = Effect->get. Parameter. By. Name(NULL, “m. MVP”);


Rendering From Effect File 이펙트 설정 Effect->Set. Technique( Technique ); Effect->Begin( NULL, 0 ); Effect->Pass (0); 셰이더 상수 설정 D 3 DXMATRIX m = world * view * proj; Effect->Set. Matrix( WVP, &m ); ▪ 어셈 셰이더와 달리 전치행렬을 쓰지 않아도 OK Effect->Set. Texture(“Tex”, Mesh->m_Ptextures[0]); 실제 렌더링 pd 3 d. Device->Set. Vertex. Declaration(m_p. Decl); Mesh->Render(pd 3 d. Device); 렌더링 종료 Effect->End();





