Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Miguel Angel Sepúlveda
필자 소개: 1993년에 워싱턴대학(미국)을 졸업했다. 스페인, 이스라엘, 일본, 미국에서 과학연구 분야에서 일한다. 커널 0.98쯤부터 리눅스를 알게 되었다. (첫눈에 반했다) 현재는 자유 시간에 리눅스 포커스의 편집장으로 일한다.

필자에게 연락하기

들어가는 글

왜 리눅스인가?

학생상담가들

결론

OpenGL이란?

요약: 이 글은 OpenGL과 리눅스에서 OpenGL을 사용하는 방법에 관한 집중연재기사의 첫번째입니다. 이 기사는 자신의 개발프로그램에 고성능 2차원/3차원 그래픽을 추가하고 싶은 프로그래머를 위하여 쓰여졌다




이 글은 OpenGL과 리눅스에서 OpenGL을 사용하는 방법에 관한 집중연재기사의 첫번째입니다. 이 기사는 자신의 개발프로그램에 고성능 2차원/3차원 그래픽을 추가하고 싶은 프로그래머를 위하여 쓰여졌다.

OpenGL은 의심할 여지가 없이 가장 널리 퍼져있는 2차원,3차원 그래픽프로그램 개발 업계 표준 API이다. OpenGL은 SGI사의 웍스테이션을 공학용, 과학용, 또는 특수효과개발용 플랫폼으로 인기있게 만들었던 방대한 Sillicon Graphics사의 IRIS GL라이브러리를 계승한 것으로 인식되고 있다. SGI는 OpenGL을 좀더 쉽게 이용할 수 있고 직관적이며 미래를 대비하여 네트워크까지 고려된 API가 될 수 있도록 많은 전문가를 투입하고 있다. 동시에 우리는 SGI사가 공개표준들의 중요성을 인식하고 있다고 믿을만 하다. 몇몇 하드웨어, 소프트웨어 제작자는 OpenGL의 규정을 정하는데 참여하고 있으며 이를 지원하고 있다. 이 덕분에 OpenGL을 이용한 프로그램은 현재 시장에 나와 있는 가상적인 어떠한 플랫폼으로도 쉽게 이식되어질 수 있다. 이미 Windows95를 사용하는 개인용컴퓨터에서 우리들의 자랑스러운 리눅스시스템, 고성능 유닉스 워크스테이션뿐만 아니라 메인프레임급의 슈퍼컴퓨터까지도 쉽게 이식된다. Architectural Review Board를 살펴보면 OpenGL의 규약과 변화된 것이 수용되었는지 또는 거부되었는지 제안된 것이 검사에 일치한지 등을 알 수 있다.

이전 SGI사의 IRIS GL라이브러리와는 달리 OpenGL은 플랫폼이나 운영체제에 독립적으로 설계되었다. 이러한 점은 네트워크를 고려한 결과이며 실제 OpenGL응용프로그램이 있는 서버와 그래픽랜더링작업을 수행하는 클라이언트가 분리되어 있는 것도 가능하게 된다. 서버와 클라이언트에서 네트워크를 이용하여 OpenGL명령어를 전달하도록 하는 프로토콜이 있다. 운영체제에 독립적인 성격으로 인하여 서버와 클라이언트가 동일한 플랫폼일 필요는 없다. 일반적으로 서버는 매우 복잡한 시뮬레이션을 수행하는 슈퍼컴퓨터이며, 클라이언트는 그래픽을 보여주는 작업만을 담당하는 간단한 워크스테이션일 경우가 많다. 또한 개발자는 OpenGL을 이용하면 많은 플랫폼에서 작동하는 프로그램을 개발할 수 있다.

위의 내용에서와 같이 OpenGL은 최신의 고성능 그래픽 랜더링 라이브러리이며 OpenGL의 기본요소를 하드웨어수준에서 수행하는 특별한 3차원 카드나 가속기능이 장착된 그래픽카드도 개발되어 있다. 현재까지 발전된 그래픽카드들은 매우 고가였으며 SGI웍스테이션이나 UNIX웍스테이션에서만 사용할 수 있는 것이 대부분이었다.실리콘그래픽사의 관대한 라이센스정책과 드라이버 개발킷덕분에 매우 빠른 변화가 이루어져 이제는 PC사용자를 위한 OpenGL하드웨어가 점점 늘어나고 있다. 리눅스사용자 역시 이런 기회를 잘 이용하여 즐길 수 있다. 바로 3Dfx Interactive사가 3차원 그래픽카드 시리즈를 제공하고 있으며 Glide 라이브러리를 이용하여 리눅스운영체제를 지원하고 있다. 여기에 관해서는 Phillip Ross씨가 쓴 다른 기사(3Dfx 그래픽카드)를 살펴보기 바란다. 그 글에서는 3Dfx카드를 이용하는 방법을 자세히 설명하고 있다. 이러한 사실은 대부분의 하드웨어생산업자들이 리눅스 시장성을 인식하여 태도의 변화를 보이고 있다는 것을 단적으로 보여준다. 리눅스지지자들은 이러한 변화를 지지하며 격려한다.

OpenGL은 하드웨어 독립성을 얻기 위하여 윈도우 작업에 관련된 명령이나 사용자의 입력을 받는 부분은 빠져있다. 어떻게 보면 OepnGL을 사용하는데 중요한 단점이 될 수 있다. 그러나 이점에 대해서는 별로 걱정할 필요없다. (GLUT 프로그래밍 연재를 읽어보기 바란다.) 윈도우와 관련된 작업이나 사용자 입력을 획득하는 것을 담당하는 유연한 다른 프로그래밍 라이브러리를 이용하여 OpenGL응용프로그램을 개발할 수 있다. 또한 OpenGL은 분자,비행기,집,새등과 같이 복잡한 모델을 서술하는 명령어를 제공하지 않는다. 그래서 여러분은 가장 기본적인 기하학적 형상인 점과 선, 그리고 다각형을 이용하여 여러분의 모델을 나타내야 한다. 복잡한 모델을 사용할 수 있도록 해주는 OpenGL관련 라이브러리가 있으므로 이를 이용하면 된다.

OpenGL프로그래밍에 관한 연재기사들에서는 C인터페이스를 사용할 것이다. C는 가장 인기있는 OpenGL의 프로그래밍 환경이다. 그러나 여러분은 FORTRAN, C++, Ada, Java와 같은 언어를 사용하여 프로그램을 작성할 수 있다. 이 연재를 진행해 가면서 OpenGL을 위한 C인터페이스를 충분히 익힌 다음 OpenGL의 C++확장 라이브러리인 Open-Inventor에 대해서도 살펴보겠다.

간단하게 OpenGL의 실행특징 몇가지를 살펴보자:

  • 기하학적 기본형상 수학적 설명을 통하여 물체를 구성할 수 있다. 현재 기본형상으로 점, 선, 다각형, 이미지, 비트맵을 지원한다.
  • 색상지원 RGBA (Red-Green-Blue-Alpha) 또는 인덱스된 색상모드 지원
  • 뷰와 모델링 3차원 화면내의 물체들을 위치시키고, 카메라를 공간내에 이리저리 옮길 수 있으며, 랜더링될 장면을 바라보는 시점을 지정할 수 있다.
  • 텍스쳐 맵핑 모델을 구성하고 있는 다각형의 면에 현실감있어보이도록 이미지를 랜더링하여 실제처럼 보이도록 해준다.
  • 재질광 이 기능은 3차원 그래픽에 필수적인 부분이다. OpenGL은 주어진 광원과 재질의 속성에 따라 어떤 위치의 색상을 계산하는 명령을 제공한다.
  • 이중버퍼 애니메이션시 깜빡거림을 없애준다. 애니메이션에서 각 연속적인 프레임은 독립된 각 메모리에서 이루어지며 프레임의 랜더링이 끝나면 보여지게 된다.
  • 앤티앨리어싱 컴퓨터 화면에 그려지는 선에서 계단효과를 작게해준다. 들쭉날쭉한 선은 종종 그려질때 아주 낮은 해상도를 가지게 되는데, 앤티앨리어싱기능은 인위적인 들쭉날쭉함을 없애주기 위하여 선과 가까운 픽셀의 색상과 강도를 조정해 주는 컴퓨터그래픽의 일반적인 기법이다.
  • Gouraud 쉐이딩 3차원 객체에 부드러운 쉐이딩을 부여하고 표면에 존재하는 미묘한 색상의 차이를 나타나게 해준다.
  • Z-버퍼링 3차원 객체의 Z좌표값의 연속트랙을 가지고 있다. Z-버퍼는 관찰자가 보는 물체의 근접도를 나타내는데 사용된다. 또한 은선(숨은선) 제거에 중요한 역할을 한다.
  • 대기효과 안개, 연기, 아지랑이등과 같은 대기효과를 가능하게 하여 주어진 영상을 더욱 현실감을 더해준다. 만약 대기효과가 지원되지 않는다면 영상이 때때로 비현실적으로 선명하게 보일 것이다. 안개효과는 아지랑이, 안개, 간단한 대기효과나 오염된 대기효과등을 만들어내는 알고리즘의 기본이다. 이를 이용하여 영상에 깊은 맛을 더해줄 수 있다.
  • 알파 블렌딩 RGBA값중 알파값(발산-재질 값)을 사용할 수 있어서 프레임버퍼에 이미 저장되어 있는 픽셀의 부분색상과 처리되어야 될 색상을 함께 가질 수 있다. 예를 들어 붉은색 상자앞에 빛이 투과되는 푸른색 창을 그린다고 생각해 보자. 알파블렌딩은 유리창의 투명도를 흉내내어 유리창으로 본 상자가 보라빛이 나도록 해준다.
  • 스텐실프레인(Stencil Plane) 화면의 특정영역에서만 그려지도록 제한해 줍니다.
  • 디스플레이 리스트 이후 랜더링을 위한 리스트구조를 가진 그림저장명령입니다. 적절하게 사용되면 랜더링 성능에 엄청난 발전을 가져옵니다.
  • 다항식 계산 non-uniform rational B-splines곡선/면을 지원합니다. 이를 이용하면 사이에 존재하는 많은 점을 저장할 필요 없이 몇개의 참고값을 가지고 부드러운 곡선을 그릴 수 있습니다.
  • 피드백, 영역선택과 물체선택 이 기능을 이용하여 화면에 그려진 물체나 화면의 영역을 선택할 수 있다. 피드백모드를 이용하여 개발자는 랜더링계산의 결과를 얻을 수 있다.
  • 래스터 기본형상 (비트맵과 픽셀 사각형) 
  • 픽셀 조작
  • 변환: 3차원에서 회전,축소,확대,이동,묘사방법 등의 변환을 지원

이미 말했었지만 OpenGL을 이식성이 높고 플랫폼에 독립적으로 작동하게하려면 윈도우시스템과의 인터페이스를 담당하는 모든 명령어를 희생할 수밖에 없다. 예를 들어 새로운 창을 열거나 닫거나, 창의 크기를 줄이고 늘이고, 창의 모양을 다르게 하고 커서의 위치를 구하며, 사용자로부터 키보드 입력을 받는 것이 생략되어 있다. 이러한 기능은 운영체제에 깊이 관련되어 있다. 원래 GL라이브러리는 자신이 창과 부가장치를 다루기 위한 특별한 명령어를 가지고 있었다. 그것은 SGI사의 UNIX운영체제에서 작동하는 IRIX에 해당될 뿐이었다. 결국 자신이 사용하는 운영체제에서 창을 다루고 관리하는 것은 OpenGL개발자가 자신의 플랫폼을 얼마나 알고 있는가에 달려있다.

SGI사의 Mark J. Kilgard씨 덕분에 이러한 문제를 해결해주는 부가라이브러리가 개발되어 있다. Mark씨는 이전의 AUX라이브러리(AUX라이브러리가 무엇인지 생각하지 말고, 그냥 잊어버리세요!)를 대체할 수 있는 GL유틸리티 라이브러리인 GLUT라이브러리를 개발하였다. GLUT라이브러리는 자유롭게 이용이 가능하다.OpenGL과 마찬가지로 리눅스용으로 된 바이너리 버전이나 소스코드를 구할 수 있다. GLUT라이브러리는 플랫폼에 의존적이며 윈도우와 부속장치등을 다루기 위한 공통적인 패러다임을 제공해 준다. 따라서 OpenGL프로그램에서 그래픽 애니메이션을 위한 새로운 창을 하나 열고자 할때 GLUT명렁어를 이용하면 작동하는 윈도우시스템에서 이러한 작업을 수행해준다. 쉽게 말하면 GLUT는 개발자가 특정한 윈도우시스템(X11,윈도우즈,모티프..등등..)을 다루기 위한 지저분할 정도로 자세한 부분을 알필요가 없게 이러한 부분을 감추어 주므로 관심있는 작업-OpenGL코드-에만 계속 집중하면 되는 것이다. GLUT를 이용할 때 또다른 좋은 점은 여러분의 코드가 플랫폼에 독립적이라는 것이다. 필자는 개인적으로 GLUT와 OpenGL을 사용하여 단백질과 젤의 시뮬레이션을 개발한 적이 있는데 아무런 문제없이 단 한줄의 플랫폼 의존코드없이 인텔기반 리눅스, 알파기반 리눅스, 윈도우즈95에서 잘 컴파일 되어 실행할 수 있었다.(솔직하게 말하면 필자는 종종 윈도우즈 95를 사용한다) 필자는 여러분이 OpenGL응용프로그램을 개발하는데 관심이 있다면 윈도우환경을 다루기 위하여 GLUT라이브러리를 이용하라고 강력히 추천하는 바이다.

GLUT를 어떻게 사용하는지 확실히 아는 것은 OpenGL을 배우는데 배우 중요하다. 그래서 리눅스포커스의 OpenGL에 관한 연재기사에서는 단계별로 GLUT를 어떻게 사용하는지, 그리고 어떻게 부가장치를 다룰 수 있는지에 대해 여러 기사를 통해 살펴볼 것이다.

글을 마치기 전에 "위대한 장인" Brian Paul씨에 대한 소개를 빼놓아서는 안될 것이다. 그는 꾸준히 리눅스에서 OpenGL과 같이 작동하는 라이브러리인 Mesa를 개발해 오고 있다. 현재 Mesa는 소프트웨어에 의해서만 랜더링 작업을 수행하므로 랜더링작업을 수행하는데 걸리는 시간은 CPU의 성능이나 3차원관련 하드웨어의 성능에 달려 있다. 그러나 Mesa는 하드웨어가속기용 드라이버를 사용할 수 있도록 해주는 훅(hook)기능을 내부적으로 수행한다.. 현재 Mondello, S3 Virge (Win95용만), GLINT,Voodoo 3Dfx칩 계열만 이런 드라이버가 나와있다. David Bucciarelli씨가 Voodoo용 드라이버를 개발해 준 덕분에 고가의 SGI웍스테이션과 동일한 성능수준까지 Mesa에서 이용할 수 있다. 만약 고성능의 3차원 그래픽을 수행하고자 한다면 바로 3Dfx칩을 사용하는 그래픽카드를 구입하기 바란다.

첫번째 연재를 끝맺으면서 필자의 알파컴퓨터(21164 550MHz, 164MRam, Linux 2.0.32)에서의 경험을 이야기 하겠다.필자는 Mesa라이브러리를 이용하여 젤 시뮬레이션 프로그램을 개발하였다. Glide라이브러리가 현재까지 알파용으로는 개발되어 있지 않다.(빨리 좀 만들어 주지...) 음. 필자와 Phil Ross씨는 Matrox Millennium카드를 장착한 필자의 알파컴퓨터와 Rhil씨의 3Dfx카드를 장착한 펜티엄 컴퓨터에서 동일한 젤 애니메이션을 실행시켜보았는데 놀랍게도 Phil의 컴퓨터에서 실행되는 만큼 필자의 컴퓨터에서도 부드럽게 애니메이션이 실행되었다. 심지어 OpenGL데모프로그램은 필자의 컴퓨터에서 더욱 성능이 우수하였다(물론 이때 텍스쳐기능은 사용하지 않았다.) 이 말은 결국 OpenGL을 지원하지 않는 하드웨어의 부족을 알파CPU의 강력한 성능이 보완해준다고 볼 수 있다. 젤 애니메이션의 각 프레임은 10개의 젤 모델구조를 그려주는데 각 모델은 1000개의 구와 실린더에 모두 광원계산을 실행하는 애니메이션이다. PC에서는 빈약한 Intel CPU의 기능때문에 계산을 많이 수행하지 못하여 많은 단량체(화학용어)들을 가진 젤을 볼 수 없었지만...반면 알파컴퓨터에서는 아무 문제가 없었다! 필자는 3Dfx를 장착한 알파컴퓨터와 Mesa를 지원하는 하드웨어를 기다릴 수 밖에 없다.


더 자세히 알고싶은가요?:



번역 : 이주호


본 웹사이트는 Miguel Angel Sepulveda씨에 의해 관리됩니다.
© Emre Demiralp 1998
LinuxFocus 1998