Viewport 나누어 사용하기

가끔 가다보면 화면을 둘로 나누어 사용하고 싶은 경우가 있다. MFC 같으면 Split window
를 만들어서 할 수도 있지만 귀차니즘이 발동하면 이런 것도 하기 싫어진다. 게다가 윈도가
분리되는 경우 렌더링 컨텍스트를 사용하고 나서 꼭 release 해 주어야 한다. ( 그렇다고
이 작업이 어려운 것은 아니다… .-_-;;;;)
여기서는 간단히 뷰포트를 나누어 멀티뷰나 화면 구석에 메뉴를 그리고 싶다거나 할 때 사
용할 수 있는 팁을 설명하도록 하겠다.
OpenGL에서 뷰포트 셋팅은 glViewport(x, y, w, h) 함수로 하게 된다. 명심할 것은 첫 번
째와 두 번째 인자는 뷰포트의 시작점을, 다음의 두 인자 w와 h는 글자 그대로 사용할 뷰
포트의 폭과 높이를 나타낸다. X와 y 값은 음수가 될 수도 있으며, 뷰포트의 좌측 하단 (오
픈지엘 윈도우의 좌측하단)에 오게 될 점의 좌표이다. 즉, 뷰포트의 시작점이 된다.
뷰포트를 설정한다고 하는 것은 쉽게 말해서 오픈지엘이 생성한 윈도우에서 “여기부터 저
기까지의 영역에만 그림을 그리겠다” 라고 말하는 것과 같다.

glViewport(0, 0, viewport1_x, viewport1_y) ; 첫 번째 뷰포트 설정
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glOrtho(……..) ; 클리핑 볼륨 설정.
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
(… 첫 번째에 들어갈 그림을 그려준다…….)
glViewport(…….) ; 두 번째 뷰포트 설정
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glOrtho(0,100,0,500,-50,50) ; 두번째 뷰포트의 클리핑 볼륨 설정.
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
(…..두 번째 뷰포트에 들어갈 그림을 그려준다….)

따라서 첫번째 뷰포트에 그려줄 루틴을 부르기 전에 첫 번째 뷰포트를 설정해주고, 두 번
째 그림을 그려주기 전에 두 번째 뷰포트를 그려주면 된다.
이 때, 각 뷰포트의 설정은 RenderScene() 함수 내부에서 해 주어야 한다.

예제 프로그램 실행 화면

그럼 첫번째 뷰포트는 일반적인 프로그램들의 예제를 보면 모두 glViewport(0,0,w,h)와 같
은 방법으로 사용하는데 두 번째는 어떻게 해야할까 ?
첫 번째 뷰포트가 w1, h1의 폭과 너비를 가진다면 두 번째 뷰포트의 시작점은 (w1, 0)
가 된다. 폭은 당연히 window_size_x – w1, 높이는 h1 으로 동일할 것이므로
glViewport(w1, 0, window_size_x – w1, h1) ;
와 같이 설정해 줄 수 있을 것이다.
실제로 나누어 쓰는 방법은 간단하기 그지 없지만 약간의 실수로 인해 화면이 표시가 안되
는 경우도 있다. 약간의 실수라 함은 다음과 같다.
일반적으로 뷰포트 및 클리핑 볼륨 설정은 프로그램 초기화시에 한 번 해주면 이후에는 다
시 할 필요가 없다. 그래서 만일 Init() 이라는 함수에서 첫 번째 뷰포트를 설정하고 다음에
RenderScene() 함수에서 두번째 뷰포트를 설정하게 되면 RenderScene()이 한 번 호출된
다음에는 뷰포트 및 클리핑 볼륨이 두번째 것으로 설정이 되어 있는 상태이므로 당연히 제
대로 된 화면이 나올리 만무하다.
(실제로 저도 이 실수 때문에 한참 동안 삽질만 했습니다. .. -_-;;;;;)

<Example source code>

예제 프로그램에서는 각 뷰포트의 폭과 높이를 변수로 정하여 윈도우가 리사이즈 되는 경우
뷰포트의 크기가 조절되도록 하였다. 윈도우를 리사이즈 하지 않고 정해진 크기에서만 사용
한다면 변수로 할당할 필요는 없다.

#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
float angle = 0 ;
// 아래의 변수들은 뷰포트의 폭을 저장할 변수들.
// 명심하자, 점의 좌표가 아니라 뷰포트의 가로 세로의 폭이다.
float viewport1_x ,viewport1_y ;
float viewport2_x, viewport2_y ;
// 렌더링 함수. 여기서 각 뷰포트 설정과 클리핑 볼륨 설정이 이루어진다.
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
////////////////////////////////////////////////////////////////
// 첫번째 뷰포트 설정. 일반적인 설정과 같다.
////////////////////////////////////////////////////////////////
glViewport(0, 0, viewport1_x, viewport1_y) ;
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glOrtho(-7,7,-7,7,-7,7) ; // 클리핑 볼륨 설정.
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
// 구와 좌표축을 그려준다. 역시 일반적인 부분.. -_-;;
glRotatef(angle, 0,1,0) ;
glBegin(GL_LINES) ;
glColor3f(1,0,0) ;
glVertex3f(0,0,0) ;
glVertex3f(10,0,0) ;
glColor3f(0,1,0) ;
glVertex3f(0,10,0) ;
glVertex3f(0,0,0) ;
glColor3f(0,0,1) ;
glVertex3f(0,0,10) ;
glVertex3f(0,0,0) ;
glEnd() ;
glColor3f(1,0,0) ;
glutSolidSphere(4,12,12) ;
///////////////////////////////////////
// 두번째 뷰포트의 설정을 한다.
// 첫번째와 거의 같다.
////////////////////////////////////////
glViewport(viewport1_x, 0, viewport2_x, viewport2_y) ;
// 첫번째 뷰포트가 끝난 곳에서 다음 뷰포트가 시작하기 때문에
// 처음 두개의 인자는 viewport1_x, 0 이 된다.
// 세 번째와 네 번째는 역시 폭과 높이를 입력.
// 나머지는 평범한 부분이다.
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glOrtho(0,100,0,500,-50,50) ; //클리핑 볼륨 설정.
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
glColor3f(1,2,0) ;
glBegin(GL_QUADS) ; // 클리핑 볼륨의 x-y 크기와 동일하게 그려주었으므로
glVertex2f(0,0) ; // xy 평면에 가득찬 사각형이 그려질 것이다.
glVertex2f(100,0) ;
glVertex2f(100,500) ;
glVertex2f(0,500) ;
glEnd() ;
glutSwapBuffers() ; // 버퍼를 비워준다.
}
void idle()
{
angle += 0.51 ;
if (angle >= 360)
angle = 0 ;
RenderScene() ;
}
void SetLighting()
{
glClearColor(0,0,0,0) ;
glEnable(GL_LIGHTING) ;
glEnable(GL_LIGHT0) ;
float specularLight[] = {0.7,0.7,0.7} ;
float diffuseLight[] = {0.7, 0.7, 0.7} ;
float ambientLight[] = {0.7, 0.7, 0.7} ;
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight) ;
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight) ;
glEnable(GL_COLOR_MATERIAL) ;
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE) ;
glMaterialfv(GL_FRONT, GL_SPECULAR, specularLight) ;
glMaterialf(GL_FRONT, GL_SHININESS, 128) ;
}
void Reshape(int x, int y)
{
if (y==0)
y = 1 ;
viewport1_x = 0.8 * x ; // 첫 번째 뷰포트의 폭을 설정 윈도우 폭의 80%.
viewport1_y = y ; // 높이는 윈도우 높이와 같다.
viewport2_x = x - viewport1_x ; //두 번째 뷰포트의 폭은 나머지 부분이 된다.
viewport2_y = y ; // 역시 높이는 동일하다.
// 아래의 주석 처리된 부분은 보통 Reshape 함수 또는 MFC의 OnSize 에서
// 처리하는 부분이다. 그러나 지금은 RenderScene 에서 해주기 때문에
// 여기서는 윈도가 리사이즈 되는 경우 각 뷰포트의 폭을 비율에 맞게
// 재할당 하는 일만 해주면 된다.
/* glViewport(0,0,x,y) ;
glViewport(0,0,400,y) ;
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glOrtho(-7,7,-7,7,-7,7) ;
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
*/
}
int main()
{
glutInitWindowSize(600,500) ;
glutInitDisplayMode(GLUT_RGB| GLUT_DOUBLE) ;
glutInitWindowPosition(50,50) ;
glutCreateWindow("LIGHTING TEST") ;
glutDisplayFunc(RenderScene) ;
glutReshapeFunc(Reshape) ;
glutIdleFunc(idle) ;
SetLighting() ;
glEnable(GL_DEPTH_TEST) ;
glutMainLoop() ;
return 0 ;
}

본 문서의 배포는 자유이며, 상업적인 목적으로 사용하는 것을 금합니다.
(상업적으로 사용할 꺼리나 있었더냐 …. ㅡㅡ;;)
작성자 : 샤이니레드 in 왕십리 OpenGL
e-mail : mail2lww@hanmail.net
날 짜 : 2003/01/09/목요일

'Programming > OpenGL, DirectX' 카테고리의 다른 글

ARToolKit 설치 및 실행하기  (0) 2011.03.28
DirextX 9.0 설정 in Visual Studio 6.0  (0) 2010.09.20
Posted by duki 두기

  Setup 프로그램을 제작하기 위해서 가장 많이 사용하는 Tool이 InstallShield이다. InstallShield는 Visual Studio Enterprise Edition 6.0에서 기본적으로 제공하는 Version이 있고 판매용 버전이 있다. Visual Studio에서 제공하는 버전에 약간의 기능 제한이 있는 것을 제외하면 사용법이 같으므로 Visual Studio 제공버젼으로 설명한다.

  프로그램을 배포할 때 대부분 Debug 정보들이 들어 있지 않는 Release 버전(프로그램 크기가 훨씬 작음)으로 컴파일하여 배포한다. 또한 프로그램이 1개의 실행 파일로 되어 있을 경우에는 컴파일 옵션에서 'Use MFC in a Static Library'를 선택하여 컴파일하고 그 실행 파일만 Setup 프로그램으로 만들면 되나(이 경우 그냥 실행 파일을 그냥 복사해서 쓰는 것이 더 낳을 것이다), 실행 파일이 여러개로 구성된 경우에는 각 실행 파일들을 모두 컴파일 옵션에서 'Use MFC in a Shared DLL'을 선택하여(기본값) 컴파일하고 그 실행 파일 및 필요한 MFC Dll을 포함하여 Setup 프로그램을 만들어 배포한다. MFC Dll을 포함하지 않고 배포하면 Visual Studio가 설치되지 않은 PC에서는 프로그램이 실행되지 않는다.

참고)필요한 MFC DLL

    기본적으로 들어가야 하는 DLL : MFC42.DLL, Msvcrt.dll

    콘솔 프로그램 중 MFC를 지원하는 프로그램으로 제작했을 경우 필요한 DLL : MSVCP60.DLL

    지금까지 프로그램하면서 배포시 필요한 DLL은 위의 3가지였다. 필요한 DLL이 없을 경우 에러 대화 상자에 DLL이름이 나오므로 Visual Studio가 설치되지 않은 컴퓨터에서 실행을 해본 후 Setup 프로그램을 제작하기 바란다. 3가지 DLL은 Visual Studio가 설치된 컴퓨터의 windows system 디젝토리에서 찾으면 되나 여기에서 Link시켜 두겠다.

    참고로 그럴 경우는 거의 없겠지만 Debug 버전을 배포할 경우 필요한 Dll은 Mfc42d.dll, Mfcd42d.dll, Mfcn42d.dll, Mfco42d.dll, Msvcrtd.dll, Msvcp60d.dll 등이 있다.

 

InstallShield 설치

앞에서도 말했듯이 InstallShield는 Visual Studio에 들어 있다. Visual Studio를 설치할 때 마지막 단계에서 재 부팅을 한다. 재 부팅을 한 후 자동으로 생성되는 대화 상자에서 InstallShield 버튼을 선택하여 설치하거나 Visual Studio CD의 첫 번째장 ISHIELD 디렉토리의 Setup.exe를 실행하면 설치가 된다.

 

InstallShield 사용법

InstallShield를 실행하여 나타난 화면에서 Project Wizard를 선택하거나 File메뉴의 부메뉴 New를 선택하여 생성된 대화 상자에서 Project Wizard를 선택하고 확인을 하면 다음과 같은 대화 상자가 생성된다.

    Application : 프로그램 이름을 입력한다

    Company Name : 회사 이름을 입력한다.

    Application : 적당한 Application 종류를 선택한다.

    Application Version : 프로그램 Version을 입력한다.

 

다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    이 대화 상자는 InstallShield에서 Setup 프로그램을 작성해서 설치할 때 나타나는 대화 상자의 종류를 설정합니다. 읽어 보면 대강 알 것이고 모르겠으면 다음을 누르면 된다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    이 대화 상자는 프로그램이 지원하는 OS을 선택하는 부분이다. 원래 기능은 선택하지 않은 OS에서는 설치가 되지 않을 것 같은데 잘 안되고 그냥 표시만 하는 것 같다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    지원 언어를 선택하는 부분이다. English로 설정해도 한글을 지원하므로 그대로 다음을 선택하면 된다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    Setup Type을 설정하는 부분이다. 선택한 Type에 따라 다른 파일이 Setup되게 구성할 수 있다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    Component 명칭 및 갯수를 설정하는 부분이다. Component는 InstallShield에서 파일 관리를 편하게 하기 위해서 파일들을 Group으로 설정하고 그 그룹들을 다시 Component로 설정하고 Component별로 파일을 다루도록 되어있다. 즉 Component는 File Group의 Group이다. Visual Studio에서 제공하는 InstallShield는 이 Component 갯수가 5개 이하로 제한되어 있다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    File Group명칭 및 갯수를 설정하는 부분이다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    지금까지 설정한 내용을 화면에 표시하는 대화 상자이다.

 

마침을 선택하면 Step #1의 Application부분에 설정한 프로그램 이름 대로 Setup 프로젝트가 생성되고 InstallShield 화면은 다음과 같이 된다.

 

지금까지 설정한 내용이 Setup.rul에 스크립트로 저장되어 있다. 스크립트는 대강 읽어 보면 어떤 내용이구나 하고 알 수 있을 것이나 몰라도 된다. 남은 작업을 정리해 보면 다음과 같다.

1. File들을 그룹별로 File Group에 설정한다.

2. 그룹들을 기능 별로 Component에 설정하고 설치될 디렉토리등을 설정한다. 설치될 디렉토리는 Component별로 설정하게 되어있다.

3. Setup Type에 따라 설치될 Component를 설정한다.

4. 시작 메뉴 및 바탕 화면에 추가될 Icon을 설정한다(옵션).

5. 레지스트리 등록이 필요한 경우 등록해 준다(설명하지 않음).

6. 컴파일을 수행한다.

7. Setup 파일을 생성한다.

 

  먼저 File Groups Tab Icon()을 선택한 후 각 File Group의 하위 Tree Links를 선택하면 화면이 다음과 같이 변한다.

    Insert 메뉴의 부메뉴 Links into File Groups을 선택하여 나타난 파일 선택 대화 상자에서 파일들을 선택하면 파일들이 추가된다. 또한 탐색기를 띄워 파일들을 선택한 후 InstallShield로 Drag&Drop하면 파일들이 추가된다. 디렉토리 전체를 추가할 경우 이 두 번째 기능을 사용하는 것이 가장 쉽다.

 

  Components Tab Icon()을 선택하면 화면이 다음과 같이 변한다.

    Destination을 더블 클릭하면 Component에 들어 있는 파일들이 복사될 위치를 설정할 수 있으나 그대로 사용하는 것이 좋다. HDD의 용량이 작을 때 윈도우의 정책은 HDD를 절약 위하여 여러 프로그램에서 사용하는 dll파일은 windows system 디렉토리에 넣어 공용으로 사용하도록 권장했으나 현재는 버전 충돌 등 여러 가지 때문에 이방식을 권장하지 않는 것으로 알고 있다.

    Include File Groups을 더블클릭 하면 다음과 같은 대화 상자가 생성된다.

    Add를 선택하여 나타난 File Group 선택 대화 상자에서 File Group을 추가한다. 여러번 Add를 실행하여 여러개의 File Group을 한 Component에 설정할 수 있다.

     

  Setup Types Tab Icon()을 선택하면 화면이 다음과 같이 변한다.

    각 Setup Type마다 설치할 Component를 설정한다.

 

    Programs(시작 메뉴에 등록) 또는 Desktop(바탕화면에 등록)를 선택하고 마우스 오른쪽 버튼을 눌러 생기는 팝업 메뉴에서 New의 부메뉴 Folder을 선택하면 폴더가 생성되어 이름을 수정하도록 한다. 다시 그 폴더에 파일 Icon을 넣으려면 팝업 메뉴 New의 부메뉴 ShortCut을 선택하면 파일 Icon이 성성되어 이름을 수정하도록한다. 다음 그림은 Programs에서 폴더 Test를 추가하고 다시 그 폴더에서 TestIcon을 추가한 후의 모양이다.

    Target을 마우스로 더블클릭하면 다음과 같은 대화 상자가 생성된다.

    Target에  <TARGETDIR>\실행파일명.exe 라고 입력한후 확인을 선택한다.

    이런 방식으로 추가하고자 하는 모든 파일 Icon을 설정할 수 있다.

 

Build 메뉴의 부메뉴 Build(Ctrl+F7)를 선택하면 컴파일이 수행된다.

 

Build 메뉴의 부메뉴 Media Build Wizard를 선택하여 생성된 대화 상자에서 순차적으로 철차를 따라가면 Setup 파일을 생성할 수 있다.

 

Setup파일은 C:\My Installations\프로젝트명\Media\Default\DiskImages\Disk1 디렉토리에 생성된다.

 

참고로 C:\My Installations\프로젝트명\Setup Files\Uncompressed Files\Language Independent\OS Independent\Setup.bmp를 그래픽 편집기에서 수정하여 Setup파일 작성을 새로하면 초기 로고 화면이 바뀐다.

     

출처:http://ttongfly.net/document/Programming/Windows_Programming/VisualC++(MFC)%B0%AD%C1%C2/VisualC/Setup.htm
Posted by duki 두기

1. Include 폴더 설정: Tools>Options>Directories 의 Include Files에 C:\DXSDK\Include 추가
2. Library 폴더 설정: Tools>Options>Directories 의 Library Files에 C:\DXSDK\Lib 추가

3. Project>Settings>
dxerr9.lib d3dx9.lib d3d9.lib d3dxof.lib dxguid.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib

'Programming > OpenGL, DirectX' 카테고리의 다른 글

ARToolKit 설치 및 실행하기  (0) 2011.03.28
[OpenGl] Viewport 분할하기  (0) 2010.10.07
Posted by duki 두기
용도 : 3DS MAX에서 DirextX에서 읽어 들일 수 있는 X-File을 만들어 준다.
사용방법 : 3DS MAX 설치 폴더의 Plugins에 첨부파일을 다운 받아 설치 하시면 됩니다.


버전이 맞지 않는 사람들을 위해 아래 링크를 걸어 둡니다.
Panda DirectX Exporter 가 버전별로 있으니 확인하시고 다운 받아 사용하세요

http://www.andytather.co.uk/Panda/directxmax_downloads.aspx

Posted by duki 두기
이전버튼 1 2 이전버튼

블로그 이미지
개인적인 잡다한 기록 공간입니다
duki 두기

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
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 31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함