Hello, Cg 번역문


출처 : “Hello Cg.pdf

글쓴이 : Alex D’Angelo ([email protected])

참고서적

“The Cg Tutorial” by Fernando and Kilgard

cg셋업하기.

  1. cgtoolkit을 다운받는다. (http://developer.nvidia.com/view.asp?io=cg_toolkit)

cg 쉐이더는 vertex shader랑 fragment shader v1.0이상 지원하는 그래픽 카드를 사용해야 한다.

  1. 다운받은 cgtoolkit.zip을 풀고, vc와 연결한다.

  2. 모든 *.h파일은 include 디렉토리에 복사한다.

  3. 모든 *.lib파일은 lib 디렉토리에 복사한다.

  4. 모든 *.dll파일과 cg실행파일(cgc.exe)를 프로그램이 위치하게 될 곳에 같이 놓는다.

지금 작성할 프로그램은 cg.lib와 cggl.lib를 사용할 것이다.

  1. #pragma comment를 사용해서 코드를 집어넣도록 한다.

조금 더 자세히 cg 살펴보기

먼저 context를 만들어야 한다.

context안에 프로그램이 만들어 지고, 전체 프로그램이 실행되는 동안에는 단 하나의 CGcontext만 있으면 된다.

각각의 쉐이더는 CGprogram이 관할한다.

그리고 각각의 CGProfile이 연결이 되어있어서 어떤것이 vertex shader이고 어떤것이 vertex 쉐이더인지 알려준다.

쉐이더가 로딩되는 시점은 아무때나 쉐이더 코드에 해당되는 문자열을 전달하거나, 쉐이더 파일 이름을 주면 된다.

예를 들어서, 예제에서는 쉐이더를 메인 루프를 호출하기 전에 불렀다. 모든 하드웨어와 호환되는 가장 간단한 파일이 사용되었다.

프로그램에 쉐이더 추가하기

먼저 헤더파일을 include를 해야한다.

#include <Cg/cg.h>
#include <Cg/cgGL.h>

쉐이더를 저장하고 액세스할 수 있는 몇개의 변수를 설정해야 한다.

static CGcontext Context = NULL;
static CGProgram VertexProgram = NULL;

쉐이더를 초기화한 후에는 CGparameter를 사용해서 값들을 연결하게 된다.

그러므로 이 변수들이 필요할 것이고,

static CGparameter KdParam = NULL;
static CGparameter ModelViewProjParam = NULL;
static CGparameter VertexColorParam = NULL;

마지막으로 vertex shader profile을 초기화한다.

static CGprofile VertexProfile = CG_PROFILE_VP20;

Cg 초기화하기

먼저 OpenGL을 초기화하고 그 다음에 Cg를 초기화한다.

context를 하나 만들면 모든 쉐이더에서 사용하게 된다.

Context = cgCreateContext();

쉐이더의 타잎과 쉐이더 파일이름을 줌으로써 context에 버텍스 쉐이더를 추가한다.  

VertexProgram = cgCreateProgramFromFile(Context, CG_SOURCE, “vertexshader.cg”,
VertexProfile, NULL, NULL);

버텍스 쉐이더가 잘 짜여졌으면, 쉐이더가 로딩되게 된다.

이제 parameter를 바꿀 수 있는데, 예제 프로그램에서는 3가지 값을 바꿔보도록 하겠다.

디퓨즈 칼라값(KdParam),

버텍스 칼라값(VertexColorParam),

모델뷰 메트릭스(ModelViewProj)

메인루프에서 빠져나오면 이 쉐이더를 해제해야한다.

제거할 때 사용하는 함수는 다음과 같다.

    

cgDestroyProgram();
cgDestroyContext();

Hello, Cg 번역문

메인 그림그리기 루프

glBegin()과 glEnd()처럼 그리기 전에 활성화 시키고, 그린 다음에 비활성화 시키는 것이 관례화 되어있다.

활성화는 glBegin()전에 해야하고 비활성화는 glEnd()후에 해야한다.

쉐이더 코드와 실제 그림 그리는 코드와 연결하는 것은

cgGLBindProgram()을 통해서 할 수 있다.

cgGLEnableProfile()을 통해 어떤 종류의 쉐이더인지를 먼저 밝혀야 한다.

각각의 변수값들을 넘기고 받는 것은 cgGLSetParameter*()를 이용해서 할 수 있다.

그림을 다 그린다음에는 쉐이더를 비활성화한다.

cgGLDisableProfile()

쉐이더의 각각의 값을 실시간으로 바꿀수 있다. 예를 들면 다음 코드는 상자의 버텍스 칼라값을 바꿔준다.

cgGLSetParameter3f(VertexColorParam, 0.0, 1.0, 0.0); // 녹색으로 바꿔주겠지.

예를 들어 메인 draw코드를 살펴보면

void draw()
{
  cgGLBindProgram(program);
  cgGLEnableProfile(profile);
  drawing_code();
  cgGLDisableProfile(profile); </p>

  cgGlBindProgram(program2);
  cgGLEnableProfile(profile2);
  drawing_code();
  cgGLDisableProfile(profile2);
} </div>

결론은
쉐이더를 프로그램에 적용하는 것은 매우 쉽다.
쉐이더들도 많이 있고, nvidia developer 사이트에서 구할 수도 있고 다른 웹사이트에도 구할 수 있다.