GIS Developer, 개발자 김형준(Dip2K) -
   GIS Developer, 개발자 김형준(Dip2K)  
Front Page
Notice | E-Mail | Admin | Write Article   
 
2007/08/16 23:58 2007/08/16 23:58
OpenGL Shader - 7
GLSL을 위한 OpenGL 설정 - 프로그램 만들기
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?oglprogram

다음 그림은 쉐이더 프로그램을 준비하고 실행해가는데 필요한 함수 호출 단계이다.

첫번째 단계(glCreateProgram)는 프로그램(쉐이더에 대한) 컨테이너를 위한 객체를 생성이다. 이 함수는 컨테이너에 대한 핸들을 반환한다. OpenGL 2.0 문법은 아래와 같다.

GLuint glCreateProgram(void);

ARB 확장 형태의 문법은 아래와 같다.

GLhandleARB glCreateProgramObjectARB(void);

원하는 만큼의 프로그램 컨테이너를 생성할 수 있다. 렌더링 시에 원하는 쉐이더 프로그램으로 번갈아가며 교체할 수 있고, OpenGL에서 기본적으로 제공하는 고정기능(Fixed Functionality)으로 돌아갈 수도 있다. 예를들어서, 반사 쉐이더를 이용해 주전자를 그리고, 동시에 직육면체 큐브는 OpenGL의 원래 기능인, 고정기능으로 그릴 수 있다.

다음 단계는 이전 섹션에서 생성한 쉐이더를 프로그램 컨테이너에 붙이는 glAttachShader이다. 쉐이더는 이 시점에서 컴파일될 필요가 없고, 이 단계까지는 쉐이더 소스 코드를 가지지 않아도 된다. 쉐이더를 프로그램에 붙어기 위해 필요한 것은 오로지 쉐이더 컨테이너이다.

쉐이더를 프로그램에 붙이기 위한 OpenGL 2.0 함수의 형태는 다음과 같다.

void glAttachShader(GLuint program, GLuint shader);
Parameters:
  Program - 프로그램 컨테이너 핸들
  shader - 프로그램 컨테이너에 붙이고자 하는 쉐이더의 핸들

ARB 확장에 대한 함수 형태는 다음과 같다.

void glAttachObjectARB(GLhandleARB program, GLhandleARB shader);
Parameters:
  Program - 프로그램 컨테이너 핸들
  shader -  프로그램 컨테이너에 붙이고자 하는 쉐이더의 핸들

만약, 프로그램에 버텍스와 프레그먼트 쉐이더 두개를 동시에 붙이고자 할때가 있다. 같은 프로그램에 붙이고자 하는 같은 종류의 많은 쉐이더를 가질 수 있는데, 이것은 마치 C언어로 작성된 프로그램이 많음 모듈을 가질 수 있는 것과 같은 경우이다. C언에서와 마찬가지로 각각의 쉐이더에 대해서 딱 하나의 main 함수를 가질 수 있다.

하나의 쉐이더를 여러개의 프로그램에 붙일 수 있는데, 예를들어서 동일한 버텍스 쉐이더를 여러개의 프로그램에서 사용하는 것이다.

마지막 단계는 프로그램을 링크하는 것이다. 이 단계를 수행하기 위해서 세이더는 이전 섹션에서 설명했던 것처럼 반드시 컴파일 되어져 있어야 한다. 이렇게 컴파일 되어져 있는 쉐이더를 링크해주는 OpenGL 2.0 함수는 다음과 같다.

void glLinkProgram(GLuint program);
Parameters:
  program - 프로그램 컨테이너의 핸들

위의 함수를 ARB 확장 형태로 살펴보면 다음과 같다.

void glLinkProgramARB(GLhandleARB program);
Parameters:
  program - 프로그램 컨테이너의 핸들

링크가 된 후에, 쉐이더의 소스는 수정될 수 있고 프로그램에 영향을 미치지 않고 다시 컴파일 되어 진다.

위의 그림에서 처럼, 프로그램이 링크되어지면 이제 실제로 프로그램은 사용할 수 있게되는데, 이것은 ARB 확장함수인 glUseProgramObjectARB나 OpenGL 2.0인 glUseProgram을 이용한다. 각 프로그램은 핸들에 할당되어져 있고, 하드웨어가 허락하는 한, 우리가 사용하길 원하는 만큼 프로그램을 링크해 놓고 사용할 수 있다.

실제 컴파일되어진 쉐이더 프로그램을 사용하는 OpenGL 2.0 형태의 함수는 다음과 같다.

void glUseProgram(GLuint prog)
Parameters:
  prog - 사용하길 원하는 프로그램의 핸들이며 고정기능으로 복귀할 경우 0

ARB 확장의 형태는 다음과 같다.

void glUseProgramObjectARB(GLhandleARB prog);
Parameters:
  prog - 사용하길 원하는 프로그램의 핸들이며 고정기능으로 복귀할 경우 0

만약 프로그램이 사용중이고, 다시 링크되어진다면, 자동으로 수정된 내용이 사용되도록 설정되므로, 이 함수를 다시 호출할 필요가 없다. 그리고 OpenGL의 고정기능으로 복귀할 경우에 prog 인자에 0(Zero)을 넣고 호출하면 된다.
Tag : ,
Track this back : 이 글에는 트랙백을 보낼 수 없습니다
BLOG main image
GIS Developer, 김형준 / (주)지오서비스 서비스개발팀 팀장 / '모바일 3D 그래픽스' 번역 및 출판 / '모바일 GIS 프로그래밍' 집필 및 출판
 Notice
 Category
전체 (664)
GIS 개발 (201)
프로그래밍 (255)
스치는 생각들 (141)
번역 또는 집필 (4)
 TAGS
GIS Xr OpenGL Shader BlackPoint FingerEyes Algorithm Java DuraMap ActionScript WPF Map Engine Android ArcObjects C++ 안드로이드 ArcGIS C# Flex DuraMap-Xr JavaScript FingerEyes-Xr OrangeMap template WPF 3D Service HTML5 Pattern .NET BlackPoint-Xr XGE GIS Korea Design OpenGL ES GPS PSP OOD Graphic WebService XML 검색 정규표현식 도로명 Oracle WKT SolidCube PostGIS Objective-C TMS KASS
 Calendar
«   2014/11   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
 Recent Entries
[GIS] Point Counter - ...
[GIS] PointToSomething,...
PostgreSQL의 확장 기능 ...
[GIS] Hexagon Builder, ...
[GIS] FingerEyes-Xr, 속...
 Recent Comments
정말 큰~~~~~~ 도움이 되...
에이아이쥐 - 10/31
말씀하신 내용에 대해 검...
김형준 - 10/30
말씀하신 내용에 대해 검...
김형준 - 10/30
좋은 프로그램 공개해 주...
일사천리 - 10/29
잘 정리하셨네요...
현우짱 - 10/23
'대구광역시 북구 학정로...
대구 - 10/23
간단히 Encryt 할게 있었...
수천 - 10/22
완전 감사드립니다 주말...
김멍멍 - 10/14
참 안타깝습니다.. 판결...
Dip2K - 10/13
혹시 판결문을 받아볼 수...
신명 - 10/10
GIS 개발자로써 Dip2K님...
glanner - 10/10
저희는 처음부터 지오서...
glanner - 10/10
안녕하세요 좋은 자료 감...
rmi - 09/29
이번에 업데이트된 주소D...
Anuyasha - 09/29
감사합니다 말씀해 주신...
박의수 - 09/22
toWGS84 변환 파라메터를...
김형준 - 09/04
안녕하세요. 올려주신 프...
박의수 - 09/03
9월 2일까지 서비스를 잠...
김형준 - 08/29
안녕하세요. 도로명을 좌...
jw - 08/29
답변 감사합니다~
glenn - 08/12
 Archive
2014/10
2014/09
2014/08
 Link Site
GADM
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OnSpatial
OSGeo 한국 지부
Paul Bourke Site
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
대한측량협회
류광님의 블로그
비즈GIS
지오서비스(GeoService)
 Visitor Statistics
Total : 3321032
Today : 176
Yesterday : 2736
태터툴즈 배너
rss