금일 세미나 내용 기반해서 자료 정리중. 개인적으로 여기 살을 조금씩 붙여나가면서 정리할 생각~
자료 출처 : openGL Korea http://openglkorea.tistory.com/5
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 (DirectX 9.0) |
|
|
|
○ (2.x는 GF만) |
○ |
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 |
OpenGL Shader Extension |
|
nVidia |
ATI |
|
Vertex Shader 1.1 |
NV_vertex_program(1.0) NV_vertex_program1_1(1.1) |
EXT_vertex_shader
|
ARB_vertex_program |
||
Pixel Shader 1.1 |
NV_register_combiners NV_texture_shader |
ATI_fragment_shader |
Pixel Shader 1.2
|
NV_register_combiners2 NV_texture_shader2 |
|
Pixel Shader 1.3 |
NV_texture_shader3 |
|
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 |
texture형의 파라메타를 불가능하게 설정 |
setViewMatrix |
바인딩 될 시점의 뷰 매트릭스 |
getTexture |
설정된 CgTexture*를 리턴 |
getMatrix |
설정된 CgMatrix*를 리턴 |
getProgram |
Cg 프로그램의 핸들을 리턴 |
isLoaded |
Cg 프로그램이 로딩 되었는지 리턴 |
loadProgram |
Cg 프로그램을 파일에서 로딩 |
isVP |
이 Cg 프로그램이 버텍스 셰이더인가 |
isFP |
이 Cg 프로그램이 픽셀 셰이더인가 |
getParameter |
Cg 파라메타의 핸들을 리턴 |
setupMatrix |
버텍스 셰이더가 바인딩 될 때 CgMatrix에 있는 매트릭스의 리스트의 값을 로딩하여 세팅 |
_context |
Cg 컨텍스트 |
_profile |
Cg 프로파일 |
_program |
Cg 프로그램 핸들 |
_enable |
현재 Cg가 가능한 상태인가 |
_log |
현재 로그가 가능한 상태인가 |
_texture |
CgTexture |
_matrix |
CgMatrix |
_view |
현재의 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 폴더에 들어있다.
nVidia Cg Toolkit 다운로드 페이지
http://developer.nvidia.com/page/tools.html
기타 nVidia GPU의 유용한 자료도 많다.
6.2.5. OpenGL 확장 호환성 정리
http://delphi3d.net/hardware/listreports.php
확장 호환성이 드라이버/CPU 별로 정리 되어 있다.
프로그램 배포시 참고하면 유용하다.
6.2.6. 국내 3D 프로그래밍 포럼
국내 3D 개발자들이 가장 많이 모이는 포럼이다.
'Technical Report > Unity Shader' 카테고리의 다른 글
Autodesk Media & Entertainment 2012 (4) | 2012.07.23 |
---|---|
lighting 관련 몇가지 용어 (0) | 2012.07.15 |
120710 아트 세미나 Photoshop Tool and Tip (0) | 2012.07.08 |
binormal, tangent normal (5) | 2012.05.24 |
hlsl : 고급쉐이더 언어(High Level Shader language)란? (0) | 2012.04.15 |