김형준 GIS 연구소 (for Developers)  
Front Page
Notice | E-Mail | Admin | Write Article   
 
2007/09/06 23:27 2007/09/06 23:27
OpenGL Shader - 17
GLSL Samples - Hello World in GLSL
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?minimal

이 섹션은 Hello World에 대한 GLSL 판이다. 가장 기본적인 내용을 수행하는 쉐이더를 살펴볼 것이다 : 버텍스의 변환, 단일 색상으로 프리미티브 렌더링하여 화면 표시.

버텍스 쉐이더
이전 섹션중에 버텍스 쉐이더 부분에서 언급했듯이, 버텍스 쉐이더는 버텍스의 변환을 담당한다. OpenGL의 고정기능과 동일한 내용을 수행하는 버텍스의 변환을 수행하는 쉐이더를 살펴볼 것이다.

고정기능은 다음과 같이 모델뷰 행렬과 투영행렬에 의해 변환을 수행한다.

vTrans = projection * modelview * incomingVertex

GLSL에서 위의 내용을 수행하는 코드를 작성하려면 모델뷰 행렬과 투영행렬을 얻을 수 있도록 OpenGL에 접근할 필요가 있다. 이전에 언급했듯이, OpenGL의 상태 중 일부를 GLSL에서 접근할 수 있는데, 주로 언급한 투영행렬과 모델뷰행렬이다. 행렬은 이미 정의된 Uniform 변수를 통해서 제공된다.
uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ProjectionMatrix;
하나 더 필요한 것은 입력 버텍스에 접근하는 것이다. 이런 버텍스는 하나씩 하나씩 버텍스 쉐이더에 접근되는데 Attribute 변수를 통해서 제공된다.
attribute vec4 gl_Vertex;
행렬에 의해 변환된 버텍스를 출력하기 위해서, 쉐이더는 반드시 미리 정의된 변수인 gl_Position을 사용해야 하며 gl_Position은 vec4로 선언된 변수다.

위처럼 한다면, 이제 버텍스 쉐이더를 작성하는게 가능하다. 하지만 아직은 버텍스 변환 연산만 가능하다. 주의할 것은 버텍스 변환 이외의 다른 기능은 작동하지 않는데, 예를들어 빛계산은 수행되지 않는다.

버텍스 쉐이더는 main 함수를 가져야만 한다.
void main()
{
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}
위의 코드에서, 투영행렬은 모든 버텍스에 대해서 모델뷰행렬과 곱해지는데, 이것은 분명이 시간 낭비다. 왜냐하면 투영행렬과 모델뷰행렬은 모든 버텍스에 대해서 변하지 않는다. 이 행렬들은 Uniform 변수다.

GLSL은 몇개의 파생된 행렬을 제공하는데, 바로 gl_ModelViewProjecteionMatrix로써, 투영행렬과 모델뷰행렬을 곱한 결과 매트릭스이다. 이 변수를 사용해 다시 코드를 작성하면...
void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
위의 두 main() 함수에 대한 쉐이더의 최종 결과는 동일하다. 그런데 고정기능과 동일한 변환을 보장하는가? 음... 이론적으로 그렇다. 그러나 버텍스의 변환의 실제 절차는 여기와 달리 동일한 순서를 따르지 않는다. 이것은 보통 그래픽 카드에 매우 최적화된 작업인데, 최적화의 이점을 취하기 위해 하나의 특별한 기능이 제공된다. 이 기능의 또 다른 이유는 float 데이터 타입의 정밀도에 제약이 있기 때문이다. 계산이 다른 순서로 이뤄질때, 이 제한된 정밀도로 인해 다른 결과가 얻어진다. 그래서 GLSL은 최고의 수행속도뿐만 아니라 고정기능과 동일한 결과를 항상 얻을 수 있는 함수를 제공한다. 바로 마법과 같은 그 함수는:
vec4 ftransform(void);
이 함수는 입력받은 버텍스를 변환한 결과를 반환하며, 고정기능과 동일한 단계를 수행해 고정기능과 동일한 결과를 제공한다. 이제 쉐이더는 다음과 같이 재작성될 수 있다.
void main()
{
    gl_Position = ftransform();
}
프레그먼트 쉐이더
프레그먼트 쉐이더 역시 프레그먼트의 색상을 설정할 수 있는 미리 정의된 변수를 가지고 있다: gl_FragColor. 버텍스 쉐이더의 경우에서처럼, 프레그먼트 쉐이더 역시 main 함수를 가지고 있다. 다음 코드는 푸르스름한 색상으로 모든 프레그먼트를 그리는 프레그먼트 쉐이더 코드이다.

void main()
{
	gl_FragColor = vec4(0.4, 0.4, 0.8, 1.0);
}
위의 버텍스 쉐이더와 프레그먼트 쉐이더를 적용한 결과는 아래와 같다.



Tag : ,
Track this back : http://www.gisdeveloper.co.kr/trackback/300
Commented by sun at 2007/09/07 01:53  r x
쉐이더.. 이거..재밌는데요? ㅋ
Commented by 김형준 at 2007/09/07 09:16  r x
ㅎㅎ ^^ 고정독자분이 생긴듯해서 좋습니다~
쉐이더에 대한 글은 단순하지만, 그 결과는 매우 화려하죠.
기회가 된다면 추후에 쉐이더를 응용한 화려한 강좌를 별도로 올려보고 싶습니다~ 그럼 열심히 하시구요~ ^^
Commented by SUN at 2007/09/07 11:49  r x
오옷!!!!!!!!!!!! 화려한 강좌~~~ >_<)/~~
꼭 기대하면서 기다리고 있겠습니다.
Commented by Pidoli at 2007/11/23 20:03  r x
멋진 강좌네요~
Commented by 김형준(Dip2K) at 2007/11/24 11:47  r x
^^ 감사합니다~

name    password    homepage
 hidden
BLOG main image
 Notice
DuraMap-Xr 소개 및 다운로드
[오픈소스] SimpleSHP v0.1
FingerEyes-Xr 소개 및 다운로드
OpenGL Tutorials
 Category
전체 (531)
GIS 개발 (146)
프로그래밍 (233)
스치는 생각들 (129)
번역 또는 집필 (3)
 TAGS
GIS Xr OpenGL Shader FingerEyes BlackPoint Algorithm Java Map Engine WPF
 Calendar
«   2012/02   »
      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      
 Recent Entries
[FingerEyes] 지오메트리...
[FingerEyes] Geometry로...
[FingerEyes] FID 리스트...
[FingerEyes] UPDATE, INS...
영화, "부러진 화살"
 Recent Comments
메일로 답변드렸습니다....
김형준 - 02/01
txt파일을 엑셀로 변환하...
최상준 - 02/01
코봉히님두 새해 복 많이...
김형준 - 01/25
아 너무 감사합니다. 새해...
코봉히 - 01/23
wkb는 http://www.gisdeve...
김형준(Dip2K) - 01/23
wkb의 구조가 shp파일의...
코봉히 - 01/20
wkb는 바이너리인지라.....
김형준(Dip2K) - 01/20
정말 좋은 정보 감사합니...
코봉히 - 01/20
은빛소나기님의 블로그를...
김형준 - 01/20
네, 빨간색으로 표시되는...
김형준 - 01/20
 Archive
2012/02
2012/01
2011/12
2011/11
2011/10
2011/09
2011/08
2011/07
2011/06
2011/05
2011/04
2011/03
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GADM
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Paul Bourke Site
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
이민파님의 공간분석과 리...
지오서비스(GeoService)
 Visitor Statistics
Total : 928693
Today : 172
Yesterday : 317
태터툴즈 배너
rss