본문으로 바로가기

Cg Shader Programming

category Technical Report/Unity Shader 2012. 7. 12. 22:09
반응형

금일 세미나 내용 기반해서 자료 정리중. 개인적으로 여기 살을 조금씩 붙여나가면서 정리할 생각~

자료 출처 : 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 프로그래밍 포럼

http://gpgstudy.com/forum/

국내 3D 개발자들이 가장 많이 모이는 포럼이다.


반응형