Cg Shader Programming 2005-11-17 yegam400@gmail.com 1. 기능 nvidia사에서 Cg Shader는 OpenGL/Direct3D의실시간 3D API에서그래픽하드웨어파이프라인을프로그래머가프로그래밍가능하게한언어이다. 이전세대에서는어셈블리로작성하였으나최근에는 C언어와유사한문법을사용하여프로그램가능하다. 2. 3D 그래픽파이프라인 2.1. 그래픽하드웨어파이프라인 2.2. 래스터연산
2.3. 프로그래밍가능한그래픽파이프라인 2.4. 프로그래밍가능한버텍스프로세서
2.5. 프로그래밍가능한픽셀프로세서 3. 셰이더언어의종류 이전언어의예제를분석하고호환성을해결하는용도로사용한다. 그리고참고자료는 Cg 하나의언어로만나오는것이아니니다양한언어를해석가능해야한다. 3.1. Direct3D GF 3TI ATI 8500~9200 GF 4TI GF 5*00 ATI 9500~ ATI X300 ~X800 GF 6*00 GF 7*00 ATI X850 ATI X1*00 VS 1.1 PS 1.1 (DirectX 8.0) PS 1.2, 1.3
(DirectX 8.0a) PS 1.4 (DirectX 8.1) (GF는 2.0에서에뮬레이션 ) VS 2.0, 2.x PS 2.0, 2.x (2.x는 GF만 ) (DirectX 9.0) VS 3.0 PS 3.0 (DirectX 9.0c) VS는 Vertex Shader, PS는 Pixel Shader의약자이다. 뒤의숫자는버전이다. DirectX의버전과 Direct3D의버전은동일하다. GF는 nvidia GeForce의약자이다. 3.2. OpenGL Direct3D Shader Version Vertex Shader 1.1 Pixel Shader 1.1 Pixel Shader 1.2 Pixel Shader 1.3 OpenGL Shader Extension nvidia NV_vertex_program(1.0) NV_vertex_program1_1(1.1) ARB_vertex_program NV_register_combiners NV_texture_shader NV_register_combiners2 NV_texture_shader2 NV_texture_shader3 ATI EXT_vertex_shader ATI_fragment_shader Pixel Shader 1.4 지원안함 Vertex Shader 2.0 ARB_vertex_program( 옵션으로가능 ) Vertex Shader 2.x NV_vertex_program2 Pixel Shader 2.0 ARB_fragment_program Pixel Shader 2.x NV_fragment_program Vertex Shader 3.0 ARB_vertex_program( 옵션으로가능 ) NV_vertex_program3 Pixel Shader 3.0 ARB_fragment_program( 옵션으로가능 ) NV_fragment_program2 자세한하드웨어별 OpenGL 확장 / 호환성부분은 5.2.5를참조
확장앞의 GL_ 은생략되었음 4. Cg nvidia 에서공식적으로나온튜토리얼서적인 The Cg Tutorial 을참고하기바란다. 4.1. 언어특징 Cg언어는기본적으로 C언어와유사하면서컴파일시에 3.x절에나오는어셈블리셰이더언어로컴파일되어사용되게된다. 4.2. 키워드 float2, float3, float4: float형의벡터 float4x4, float3x3: float형의매트릭스 sampler2d, samplercube, samplerrect: 텍스처샘플러 tex2d, texrect, texcube, tex3d: 텍스처샘플링함수 POSITION, NORMAL, TEXCOORDn, COLORn, : 버텍스 / 프라그먼트시멘틱 #include, #define, #ifdef, 등등등 4.3. 셰이더프로그램예제 4.3.1. 버텍스셰이더 float4x4 mvp : state.matrix.mvp; // OpenGL 스테이트매트릭스이다. struct VS_INPUT { float4 pos : POSITION; float4 tex0 : TEXCOORD0; float3 nor : NORMAL; }; struct VS_OUTPUT { float4 pos : POSITION; float4 tex0 : TEXCOORD0; }; VS_OUTPUT vs_main(vs_input input) { VS_OUTPUT output; output.pos = mul(mvp, input.pos); output.tex0 = input.tex0; }
4.3.2. 픽셀셰이더 sampler2d colorsampler; struct VS_OUTPUT {// VS의 OUTPUT을 PS의 INPUT으로사용 float4 pos : POSITION; float4 tex0 : TEXCOORD0; }; float4 ps_main(vs_output input) : COLOR { return tex2d(colorsampler, input.tex0.xy); } 4.4. Cg Toolkit 사용예제 VSS에 CgShaderSolution/CgAPISample 폴더에들어있다. 5. CgShader 라이브러리사용법 OpenGL에서파싱하고바인딩하여실제 Cg 셰이더를적용하기편하게 C++ 로랩핑한라이브러리이다. 5.1. 구성 5.1.1. 헤더 CgShader.h 가메인헤더이므로이것만인클루드하면된다. CgShaderD.lib(Debug), CgShader.lib(Release) 5.1.2. 클래스 CgShader Cg 버텍스 / 픽셀셰이더통합관리클래스멤버설명 copy CgShader 클래스를복사해서인스턴스를만든다. load 버텍스셰이더와픽셀셰이더를로딩한다. fn: 파일이름 vp: 버텍스셰이더함수이름 fp: 픽셀셰이더함수이름 ininame: fxi 설정파일이름 bind 버텍스셰이더와픽셀셰이더를바인딩한다. view: 렌더링되는시점의뷰매트릭스, 버텍스셰이더 texture: 외부의 CgTexture 가있을경우에설정, 픽셀셰이더 unbind Cg 셰이더적용상태를언바인딩한다.
getfilename Cg 셰이더파일이름을리턴한다. getworldmat 설정된월드매트릭스를리턴한다. getvp 버텍스셰이더의포인터를리턴한다. getfp 픽셀셰이더의포인터를리턴한다. _fn Cg 셰이더파일이름 _vp 버텍스셰이더함수이름 _fp 픽셀셰이더함수이름 _worldmat 월드매트릭스 CgProgram Cg 셰이더프로그램관련오퍼레이션을랩핑 멤버 설명 load Cg 프로그램스크립트파일을로딩한다. enable Cg 셰이더를가능하게한다. enable_bind Cg 셰이더를가능하게함과동시에로딩된 Cg 프로그램을바 인딩한다. 텍스처오브젝트 (CgTexture*) 가설정되면그텍스처오브젝트에 서설정된텍스처이름과텍스처아이디를렌더링시에반영한 다. disable Cg 셰이더를불가능하게한다. bind Cg 프로그램을바인딩한다. setprofile Cg 프로그램의프로필을설정한다. OpenGL, Direct3D 프로필, Vertex Shader, Pixel Shader 프로필의 종류가있다. 기본값은 CG_PROFILE_ARBVP1이다. getprofile Cg 프로그램의프로필을리턴한다. setlog 로그를기록할지를설정 getlog 로그를기록할지설정된값을리턴 setfloatparameter float형의파라메타를설정한다. setmatrixparameter matrix형의파라메타를설정한다. setstatematrixparameter OpenGL state machine의 matrix형의파라메타를설정한다. CG_GL_MODELVIEW_MATRIX, CG_GL_PROJECTION_MATRIX, CG_GL_MODELVIEW_PROJECTION_MATRIX 등이있다. settextureparameter texture형의파라메타를설정한다. enabletextureparameter texture형의파라메타를가능하게설정
disabletextureparameter setviewmatrix gettexture getmatrix getprogram isloaded loadprogram isvp isfp getparameter setupmatrix _context _profile _program _enable _log _texture _matrix _view texture형의파라메타를불가능하게설정바인딩될시점의뷰매트릭스설정된 CgTexture* 를리턴설정된 CgMatrix* 를리턴 Cg 프로그램의핸들을리턴 Cg 프로그램이로딩되었는지리턴 Cg 프로그램을파일에서로딩이 Cg 프로그램이버텍스셰이더인가이 Cg 프로그램이픽셀셰이더인가 Cg 파라메타의핸들을리턴버텍스셰이더가바인딩될때 CgMatrix에있는매트릭스의리스트의값을로딩하여세팅 Cg 컨텍스트 Cg 프로파일 Cg 프로그램핸들현재 Cg가가능한상태인가현재로그가가능한상태인가 CgTexture CgMatrix 현재의 view 매트릭스 CgTexture fxi파일에서모델에는없지만 Cg에서사용할외부에서정의된 추가적인텍스처를기술할수있다. 멤버 설명 load 텍스처설정 fxi파일을로딩한다. gettextureparameter 텍스처파라메타를리턴 gettextureidmap 텍스처 ID 맵을티런 loadimagefile 텍스처이미지를로딩 clearsharedtextureidmap 공유텍스처 ID 맵을삭제 bindtexturename 이름에해당하는텍스처를찾아서바인딩 addtexture 텍스처를추가 loaddds DDS 형태의텍스처로딩 loadhdr HDR 형태의텍스처로딩 _sharedtextureidmap 텍스처 ID 맵 _textureidmap 공유텍스처 ID 맵
CgMatrix fxi파일에서자주사용하는매트릭스의형태를 Cg 프로그램안에서자동으로삽입해주는기능이다. HLSL의 Effect에있는매트릭스시맨틱과같은기능을한다. World, WorldI, WorldIT, View, ViewI, ViewIT, Projection, WorldViewProjection의종류가있다. World는모델To월드좌표계로이동, View는월드To뷰좌표계이동을나타내는매트릭스이다. I는 Inverse를의미하며, T는 Transpose 를의미한다. 멤버설명 load 매트릭스설정 fxi파일을로딩한다. getmatrixvec 매트릭스벡터를리턴한다. _matrixvec 매트릭스를나타내는문자열의벡터 5.2. 데이터파일 (*.fxi) 의구조기본적으로윈도우에서사용하는 ini의구조를따라간다. 관례적으로 = 앞뒤에는스페이스를넣지않는다. 5.2.1. [CGFX] 5.2.1.1. MAXRIX_NUM 로딩할매트릭스의개수. 아래에있는 MATRIX= 이후의매트릭스개수를적으면된다. 5.2.1.2. TEXTURE_NUM 로딩할텍스처개수. 아래에있는 [TEXTURE_%d] 의개수와일치한다. 5.2.2. [TEXTURE_%d] %d 는 0 부터시작하는번호이다. 5.2.2.1. NAME Cg 프로그램소스에서사용할 sampler* 의이름을적으면된다. 다음의예에서는 colorsampler라는 Cg의샘플러객체가 color.dds 라는텍스처파일이바인딩되는것을예로보여준다. 예 ) sample.cg sampler2d colorsampler;
sample.fxi [TEXTURE_0] NAME=colorSampler FILE=color.dds 5.2.2.2. FILE 파일의이름을적는다. 파일의기본경로는 cg 파일이있었던경로이다. 파일포맷은 DDS, HDR 을지원한다. 5.2.3. [MATRIX] Cg 프로그램소스에서사용할 float4x4형의변수의이름을적으면된다. 다음의예에서는 World라는 float4x4형의객체가매트릭스바인딩되는과정을보여준다. 예 ) sample.cg float4x4 World sample.fxi [MATRIX] NAME=World 5.2.3.1. NAME NAME= 각매트릭스이름을스페이스로구분하여여러개를입력가능함예 ) NAME=World WorldI WorldIT View ViewIT WorldViewProjection 5.3. 예제 VSS에 CgShaderSolution/CgShaderSample 폴더에들어있다. 6. 참고자료 6.1. 서적 표지 이름 내용
Cg 로배우는셰이더 프로그래밍 ( 번역서 ) Cg 셰이더 DirectX9 셰이더프 로그래밍 ( 번역서 ) Direct3D 9.x 의 HLSL ShaderX 1( 번역서 ) Direct3D 8.x 의어셈블리셰이더 ShaderX 2 Tutorial( 번역서 ) HLSL 튜토리얼 ShaderX 2 Tip&Trick( 번역서 ) HLSL 의이펙트를소개 OpenGL Extension Guide OpenGL 확장으로가능한어셈블리셰이더언어 NV_vertex/fragment_program ARB_vertex/fragment_program ShaderX 3 HLSL 의이펙트를소개. 셰이더모델 3.0
Programming Vertex & Pixel Shaders HLSL 셰이더모델 3.0 까지의자주사용되는이펙 트가레벨별로정리되어있음. GPU Gems 1 언어와관련없이 nvidia 하드웨어위주로셰이더 효과를소개. 셰이더모델 2.0 GPU Gems 1 언어와관련없이 nvidia 하드웨어위주로셰이더 효과를소개. 셰이더모델 3.0 6.2. 웹 6.2.1. nvidia Cg Toolkit 다운로드페이지 http://developer.nvidia.com/page/tools.html 기타 nvidia GPU의유용한자료도많다. 6.2.2. ATI 개발자사이트 http://ati.com/developer/index.html ATI에서는 Cg가경쟁사의것이므로 GLSL을주력해서지원한다. 하지만어셈블리예제나기타유용한자료가많다. 6.2.3. 셰이더테크 ( 구 CgShaders.org) http://www.shadertech.com/ 국제적인 3D 셰이더개발자들이모이는포럼이다. Cg관련질문이가장활발하다. 예제도구할수있다. 6.2.4. Microsoft DirectX http://msdn.microsoft.com/directx/ DirectX 를만든 MS 의페이지이다. DirectX 의새버전이나뉴스등을참고가능하다.
6.2.5. OpenGL 확장호환성정리 http://delphi3d.net/hardware/listreports.php 확장호환성이드라이버 /CPU 별로정리되어있다. 프로그램배포시참고하면유용하다. 6.2.6. 국내 3D 프로그래밍포럼 http://gpgstudy.com/forum/ 국내 3D 개발자들이가장많이모이는포럼이다.