• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
KMUG 케이머그

소프트웨어

[App 개발] Nehe Lesson 12

본문

이번 강의에서는 출력 리스트를 이용하는 법을 배우겠습니다. 단순히 리스트를 만들어 빠르게 하는 것 뿐만 아니라 간단한 GL 씬을 만들어야 할 때 몇 줄로 나누어 따로 사용할 수 있습니다.

예를 들어서 각 판을 두 개의 운석으로부터 시작하는 asteroids 게임을 만든다고 합시다. 먼저 그래프지를 펼쳐서 어떻게 3D 운석을 만들지를 궁리하겠죠. 모든 준비가 끝나면 OpenGL의 사각형 혹은 다각형을 이용해서 운석을 만들기 시작할 것입니다. 만약 운석이 8각형이라고 해 봅시다. 현명하신 분들은 루프를 만들어서 한 번에 운석을 그리겠죠. 그러면 대강 18 줄 내외의 코드로 운석을 만들 수 있게 됩니다. 화면에 매번 운석을 그려내는 것은 컴퓨터를 혹사시키는 일입니다. 이런 복잡한 물체를 표현하게 될 때에 여러분은 제가 무슨 말을 하려고 하는지 알게 될 것입니다.

결론은 출력 리스트입니다. 이것을 사용하면 물체를 한 번에 그릴 수 있고, 텍스쳐를 입히거나 색상을 칠하는 등 뭐든지 할 수 있습니다. 출력 리스트에 이름을 부여해야 합니다. 운석 게임이기 때문에 ‘asteroid’라고 이름하겠습니다. 텍스쳐와 색상이 입혀진 운석을 화면에 출력할 때에는 glCallList(asteroid) 함수를 호출하기만 하면 미리 만들어진 운석이 화면에 즉시 출력될 것입니다. 이미 출력 리스트에 만들어져 메모리에 저장되어 있기 때문에 어떻게 만들어야 하는지 OpenGL이 알아야 할 필요가 없기 때문입니다. 이 방법은 프로세서의 부하를 줄이고 프로그램을 훨씬 빠르게 동작하게 해 줍니다.

준비가 되셨지요? 오늘 만들 프로그램은 Q-Bert 출력 리스트 데모입니다. 화면에 15개의 Q-Bert 같은 육면체가 출력될 것입니다. 각 육면체는 TOP과 BOX로 구성됩니다. TOP을 따로 만들어서 어두운 그림자 색상을 만들어줍니다. BOX는 뚜껑 없는 육면체입니다.

Lesson 6 에서 쓰던 코드의 거의 대부분을 새로 써 놓아서 이해하기 쉽게 하겠습니다. 다음의 코드들은 지금까지 했던 강의에서 쓰던 기본 코드입니다.


#include
#include
#include
#include
#include

HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;

bool keys[256];
bool active=TRUE;
bool fullscreen=TRUE;


이제 우리가 쓸 변수를 선언합니다. 먼저 텍스쳐 저장소를 선언합니다. 그리고 출력 리스트용으로 두 개의 변수를 선언합니다. 이것은 출력 리스트가 저장된 장소의 포인터를 저장하는 데 쓰입니다. 이것을 box와 top이라고 부르겠습니다.

그 다음 화면에서 육면체의 위치를 기록하는 xloop와 yloop를 선언하고 x축과 y축의 회전을 기록하는 xrot와 yrot를 선언하겠습니다.


GLuint texture[1];
GLuint box;
GLuint top;

GLuint xloop;
GLuint yloop;

GLfloat xrot;
GLfloat yrot;


다음에는 두 개의 색상 배열을 선언합니다. boxcol에는 밝은 색으로 빨간색, 오렌지, 노란색, 녹색, 파란색을 선언합니다. 각각의 대괄호 안의 값은 빨간색, 녹색, 파란색의 값입니다. 대괄호 한 묶음이 전체 한 색상을 뜻합니다.

두 번째 색상 배열은 어두운 색으로 빨간색, 오렌지, 노란색, 녹색, 파란색을 선언합니다. 이것은 상자의 뚜껑을 그리는 데 쓰일 색상입니다. 상자의 다른 부분보다 꼭데기를 어둡게 만들 것입니다.


static GLfloat boxcol[5][3]=
{
// 밝은색: 빨간색, 오렌지색, 노란색, 녹색, 파란색
{1.0f,0.0f,0.0f}, {1.0f,0.5f,0.0f}, {1.0f,1.0f,0.0f}, {0.0f,1.0f,0.0f}, {0.0f,1.0f,1.0f}
};

static GLfloat topcol[5][3]=
{
// 어두운색: 빨간색, 오렌지색, 노란색, 녹색, 파란색
{.5f,0.0f,0.0f}, {0.5f,0.25f,0.0f}, {0.5f,0.5f,0.0f}, {0.0f,0.5f,0.0f}, {0.0f,0.5f,0.5f}
};


이제 진짜로 출력 리스트를 만들겠습니다. box를 만드는 코드는 첫 번째 리스트에, top을 만드는 코드는 두 번째 리스트에 있습니다. 이 부분은 상세하게 설명하겠습니다.


GLvoid BuildLists()
{


먼저 OpenGL 에게 두 개의 리스트를 만들겠다는 의미로 glGenLists(2) 함수를 호출하여 두 개의 리스트를 위한 공간을 만들고 첫 번째 공간의 포인터를 받습니다. ‘box’ 변수가 첫 번재 리스트의 장소를 가지고 있습니다. Box를 호출하게 되면 첫 번째 리스트를 그릴 수 있습니다.


box=glGenLists(2); // 두 개의 리스트를 만든다


이제 첫 번재 리스트를 만들겠습니다. 이미 두 개의 장소를 할당해 두었고 box 변수가 첫 번째 리스트의 공간을 가지고 있다는 것을 알고 있습니다. 이제 OpenGL 에게 어디서부터 리스트가 시작되는지, 그리고 어떤 종류의 리스트를 만드는지 알려주면 됩니다.

이것을 위해서 glNewList() 함수를 이용합니다. Box를 첫 번째 인수로 넘겨줘서 OpenGL에게 box가 가리키는 메모리 공간에 리스트를 저장하도록 합니다. 두 번째 인수 GL_COMPILE은 메모리에 미리 만들어 두어서 OpenGL 이 매번 화면에 그릴 때마다 어떻게 만드는지를 확인하지 않도록 합니다.

GL_COMPILE은 프로그래밍과 비슷합니다. 어떤 소스코드가 있을 때 그것을 실행하기 위해서는 매번 컴파일하여 실행하여야 하는데, 만일 이것이 이미 컴파일되어 실행파일로 만들어져 있다면 더 이상 컴파일하지 않아도 실행파일을 클릭하기만 하면 실행할 수 있게 됩니다. OpenGL이 한 번 컴파일해 둔 리스트는 더 이상 컴파일하지 않아도 실행할 준비가 되어 있습니다. 이렇게 출력 리스트를 이용하면 속도 향상을 얻을 수 있습니다.


glNewList(box,GL_COMPILE); // 새로 컴파일하는 출력 리스트 box


이제 뚜껑을 뺀 나머지 상자를 그리기 시작합니다. 그렇지만 화면에 출력되는 것은 아니고 출력 리스트에만 저장될 것입니다.

glNewList()와 glEndList()함수 사이에는 색상을 선택하고 텍스쳐를 바꾸는 등 어떤 명령을 넣어도 좋습니다. 다만 그 사이에 출력 리스트를 실행중에 바꾸는 코드는 넣을 수 없습니다. 한 번 만들어진 출력 리스트는 바꿀 수 없습니다.

저 속에 glColor3ub(rand()%255,rand()%255,rand()%255)함수를 넣으면 매번 화면에 출력될 때마다 다른 색상이 출력될 것으로 기대하시겠습니다만, 리스트는 만들어진 것이기 때문에 화면에 출력될 때 색상이 바뀌지 않고, 무작위로 처음에 만들어진 그 색상이 계속해서 남아있게 됩니다.

만약에 출력 리스트의 색상을 바꾸고 싶을 때에는 화면에 출력 리스트를 그리기 전에 바꾸어야 합니다. 이후에 좀 더 자세히 설명하겠습니다.


glBegin(GL_QUADS); // 사각형 그리기 시작
// 밑면
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 오른쪽 위
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 왼쪽 위
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 왼쪽 아래
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 오른쪽 아래
// 앞면
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 왼쪽 아래
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 오른쪽 아래
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 오른쪽 위
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 왼쪽 위
// 뒷면
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 오른쪽 아래
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 오른쪽 위
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 왼쪽 위
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 왼쪽 아래
// 오른쪽면
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 오른쪽 아래
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 오른쪽 위
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 왼쪽 위
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 왼쪽 아래
// 왼쪽면
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 왼쪽 아래
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 오른쪽 아래
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 오른쪽 위
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 왼쪽 위
glEnd(); // 사각형 그리기 끝


glEndList()함수를 호출하면 OpenGL에게 이제 리스트 만들기가 끝났음을 알려주는 것입니다. glNewList()와 glEndList()사이에 있는 어떤 것이든 모두 출력 리스트에 포함되고 밖에 있는 것은 포함되지 않습니다.


glEndList(); // box 리스트 만들기 끝


이제 두 번째 출력 리스트를 만들겠습니다. 두 번째 리스트가 메모리의 어디에 저장되었는지를 찾아내려면 이전의 출력 리스트 (box) 를 구해서 거기에 하나를 더합니다. 아래의 코드에 있는 top 변수가 두 번재 출력 리스트의 장소를 가리킵니다.


top=box+1; // top 리스트 는 box 리스트 + 1


이제 두 번째 출력 리스트가 어디에 저장되는지 알았으니 만들어 보겠습니다. 처음 것을 만들 때와 동일한 방법인데 이것을 box 대신 top 이라는 리스트에 저장하는 것 뿐입니다.


glNewList(top,GL_COMPILE); // top 출력 리스트를 새로 컴파일한다


다음의 코드가 z 표면에 그려지는 간단한 사각형으로 만들어진 상자의 뚜껑입니다.


glBegin(GL_QUADS); // 사각형 그리기 시작
// 윗면
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 왼쪽 위
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 왼쪽 아래
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 오른쪽 아래
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 오른쪽 위
glEnd(); // 사각형 그리기 끝


glEndList()함수를 호출하면 OpenGL은 두 번재 리스트를 만드는 것을 그치게 됩니다. 이제 다 되었습니다. 두 번재 출력 리스트를 무사히 만들었습니다.


glEndList(); // 뚜껑 출력 리스트를 다 만들었다
}


비트맵/텍스쳐 만드는 코드는 지난 강의에서 이용한 것과 동일한 코드입니다. 육면체 모든 면에 대입할 수 있는 텍스쳐를 이용합니다. 저는 여기서 mipmapping을 이용해서 텍스쳐를 아주 부드럽게 만들어 보려고 합니다. 픽셀을 보는 것이 싫거든요. :) 여기서 불러들일 텍스쳐의 이름은 ‘cube.bmp’이고 data 디렉토리에 저장되어 있습니다. LoadBMP()함수를 찾아서 이름을 다음과 같이 고쳐 주십시오.


if (TextureImage[0]=LoadBMP("Data/Cube.bmp"))


크기 조정 함수는 tutorial 6 의 것과 동일합니다.

초기화 함수에 몇 가지 변동이 있습니다. BuildList()함수를 추가하여 출력 리스트를 만드는 루틴을 호출합니다. BuildList()함수는 LoadGLTextures()함수 뒤에 호출을 하는 순서가 중요합니다. 먼저 텍스쳐를 만든 다음 출력 리스트를 만들어야 육면체에 대입할 텍스쳐가 정확히 만들어집니다.


int InitGL(GLvoid)
{
if (!LoadGLTextures())
{
return FALSE;
}
BuildLists(); // 출력 리스트를 만드는 코드로 점프
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);


다음의 세 줄은 간편하게 광원을 만드는 방법입니다. Light0은 대부분의 비디오 카드에 이미 설정되어 있고, 우리가 따로 광원을 만들어주는 수고를 덜게 됩니다. light0을 초기화하고 나면 광원을 사용할 수 있습니다. 만약에 여러분 비디오 카드에서 light0이 작동하지 않으면 그냥 광원 설정을 지워 주십시오.

마지막 줄의 GL_COLOR_MATERIAL 은 텍스쳐 맵에 색상을 첨가할 수 있도록 합니다. 만약 material coloring 을 활성화하지 않으면 텍스쳐는 원래 색상에서 변하지 않게 되어 glColor3f(r,g,b) 함수의 효과가 없게 됩니다. 반드시 활성화해 주어야 합니다.


glEnable(GL_LIGHT0); // 간편한 광원 설정
glEnable(GL_LIGHTING); // 빛을 활성화
glEnable(GL_COLOR_MATERIAL); // Material Coloring 활성화


마지막으로 시도법을 선택하여 화면을 보기 좋게 하고 TRUE를 리턴하여 모든 초기화 과정이 올바르게 끝났음을 알립니다.


glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 끝내주는 투시도법
return TRUE; // 초기화가 다 잘 되었다


이제 그림을 그리는 코드입니다. 저는 약간 산수에 미쳐 있습니다. 삼각함수는 아니지만 약간 이상할 것입니다. 먼저 화면과 depth buffer를 초기화하는 것으로 시작합니다.

그 다음 텍스쳐를 육면체에 대입합니다. 이 과정을 출력 리스트 내에서 할 수도 있었지만 이것을 밖에서 해 줌으로써 텍스쳐를 마음대로 바꿀 수 있습니다 만일 glBindTexture(GL_TEXTURE_2D,texture[0])함수를 출력 리스트 코드 안에 첨가했다면 출력 리스트는 영원히 선택한 텍스쳐로 입혀지게 됩니다.


int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture[0]);


이제 재미있는 부분입니다. yloop라는 루프가 있는데 이것은 육면체의 y축 (위아래) 위치를 결정하는데 쓰입니다. 위아래로 다섯 줄을 만들 것이기 때문에 루프는 1부터 6까지 (다섯 번)을 돌립니다.


for (yloop=1;yloop<6;yloop++) // y 평면으로 루프
{


xloop라는 루프는 육면체의 x축 (왼쪽부터 오른쪽) 위치를 지정합니다. 왼쪽부터 오른쪽으로 그려지는 육면체의 갯수는 몇 번째 줄을 그리느냐에 따라 달라집니다. 만약에 맨 윗줄을 그린다면 xloop는 0부터 1까지 (육면체 한 개) 돌게 되고, 다음 줄은 0부터 2까지 (육면체 두 개), 이렇게 돌게 됩니다.


for (xloop=0;xloop {


glLoadIdentity()함수로 뷰를 초기화합니다.


glLoadIdentity(); // 뷰를 초기화


다음 줄에서는 화면의 특정 위치로 이동합니다. 복잡하게 보이지만 사실 그렇지 않습니다. X 축 상에서는 다음의 일들이 일어납니다.

오른쪽으로 1.4유닛 이동하여 피라밋이 화면 중간에 위치하도록 합니다. 그 다음 xloop에 2.8을 곱하고 1.4를 더합니다. 2.8을 곱함으로써 육면체가 서로 엇갈리게 배치합니다. 2.8은 육면체를 45도 각도로 기울였을 때 대략 넓이가 됩니다. 마지막으로 yloop * 1.4 를 뺍니다. 이렇게 하면 육면체가 몇 번째 줄에 있느냐에 따라서 왼쪽으로 이동하게 됩니다. 왼쪽으로 움직여주지 않으면 피라밋은 왼쪽으로 배열될 것이고, 피라밋이 피라밋처럼 보이지 않게 됩니다.

Y 축에서는 6에서 yloop 을 뺍니다. 그렇지 않으면 피라밋이 뒤집어집니다. 그 다음 2.4를 곱하여 육면체들이 y 축에서 엇갈리게 배치되도록 합니다. 2.4는 대략 육면체의 높이입니다. 그 다음 7을 빼서 피라밋이 밑에서부터 위로 지어져 올라가게 합니다.

마지막으로 Z 축으로는 화면 안쪽으로 20유닛 이동시킵니다. 그렇게 하면 화면 크기와 피라밋이 잘 맞게 됩니다.


// 화면에서 육면체의 위치
glTranslatef(1.4f+(float(xloop)*2.8f)-(float(yloop)*1.4f),((6.0f-float(yloop))*2.4f)-7.0f,-20.0f);


이제 x 축으로 회전시킵니다. 우리는 육면체를 카메라 쪽으로 45 도에서 yloop에 2를 곱한 값을 뺀 만큼 기울일 것입니다. 투시도법은 육면체를 자동적으로 기울이게 되므로 기울어진 만큼 보상할 수 있도록 값을 빼 줍니다. 별로 좋은 방법은 아니지만 효과는 있습니다. :)

마지막으로 xrot를 더합니다. 이것은 키보드 입력으로 각도를 조절할 수 있게끔 합니다. 갖고 놀기 재밌겠죠.

x축으로 회전한 다음 y축으로 45도 회전시키고 yrot를 더하여 y축에 키보드 입력을 구현합니다.


glRotatef(45.0f-(2.0f*yloop)+xrot,1.0f,0.0f,0.0f); // 육면체를 위아래로 기울인다
glRotatef(45.0f+yrot,0.0f,1.0f,0.0f); // 육면체를 좌우로 회전시킨다


다음에는 box를 육면체 위치에 그리기 전에 색상(밝은색)을 선택합니다. 우리는 glColor3fv()함수를 쓰고 있습니다. 이것은 색상값을 대괄호 안에 있는 값으로 한 번에 읽어들입니다. 3fv는 3개의 값, 부동 소숫점, 배열의 포인터라는 뜻입니다. 선택하는 색상은 yloop-1이기 때문에 각 줄의 육면체는 각각 다른 색상을 갖게 됩니다. 만약에 xloop-1을 넣으면 우리는 위아래 한 줄씩 다른 색상을 보게 될 것입니다.


glColor3fv(boxcol[yloop-1]); // box의 색상을 지정한다


이제 색상은 선택되었고, box를 그릴 차례입니다. Box를 그리는 코드를 써 주는 대신에 만들어 둔 출력 리스트를 호출합니다. glCallList(box)함수입니다. OpenGL에게 그려야 할 출력 리스트 box를 알려줍니다. 출력 리스트 box는 뚜껑 없는 육면체입니다.

이제 앞에서 이동한 지점에 glColor3fv()함수로 선택한 색상에 따라 box가 그려질 것입니다.


glCallList(box); // box를 그린다


이제 상자의 뚜껑을 그리기 전에 색상(어두운색)을 선택합니다. 정말로 Q-Bert 게임을 만들고 싶으시면 Q-Bert가 점프한 상자의 색상을 바꾸어 주어야 합니다. 색상은 yloop-1 값에 따라 달라집니다.


glColor3fv(topcol[yloop-1]); // 뚜껑의 색상 선택


마지막으로 출력 리스트 top을 그리는 일만 남았습니다. 이것은 상자의 어두운색 뚜껑을 더해줄 것입니다. 다 되었습니다. 쉽죠?


glCallList(top); // top을 그린다
}
}
return TRUE;
}


남은것은 WinMain()함수를 변경하는 일입니다. SwapBuffer(hDC) 줄 바로 밑에 추가하시면 됩니다. 이 코드는 키보드의 왼쪽, 오른쪽, 위, 아래 화살표가 눌렸는지를 확인하고 그 방향에 따라 육면체를 움직이는 역할을 합니다.


SwapBuffers(hDC);
if (keys[VK_LEFT])
{
yrot-=0.2f;
}
if (keys[VK_RIGHT])
{
yrot+=0.2f;
}
if (keys[VK_UP])
{
xrot-=0.2f;
}
if (keys[VK_DOWN])
{
xrot+=0.2f;
}
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 1

김영환님의 댓글

리스트가 정말 유용하네요...

전체 529 건 - 11 페이지
2004.01
18

[App 개발] Cocoa Design Patterns (3)

평일은 바쁘니까 아무래도 주말에 열심히 진도를 나가는 것이 좋겠지요 번역이 많이 서툴러서 읽으시기에 불편하실지 모르겠습니다. 죄송합니다. ***** Class Clusters 클래스 클러스터는 복잡한 상속 구조를 숨기는 방법입니다. 기본적…

2004.01
18

[App 개발] NeHe Lesson 13

바로 뒤에 이어지는 두 개의 폰트 강의는 그냥 건너뛰려고 합니다. 윈도우 전용 코드 설명에 많은 부분이 할애되는 것도 그렇고, agl 함수 래퍼런스도 저에게 부족해서 (그리고 제 실력도 부족해서... 하하...) 일단은 이정도 선에서 폰트는 접도록 하…

2004.01
17

[App 개발] Cocoa Design Patterns (2)

Model-View-Controller 모델-뷰-컨트롤러, 줄여서 MVC 패턴은 패턴 이상의 구조물이라고 간주됩니다. 왜냐하면 이것은 응용 프로그램을 정리하는 기본적인 방법이며 모든 패턴들을 아우르는 상위의 구조적인 요소이기 때문입니다. 왜냐하면…

2004.01
17

[App 개발] Cocoa Design Patterns (1)

코코아를 배울 때, 코코아가 사용하는 용어 때문에 어려움을 겪으시는 분이 많으실 것입니다. 그 중에서도 코코아 설계에 응용된 디자인 패턴의 개념이 익숙하지 않아서 더 힘들게 느껴지시는 분들이 계실 줄 압니다. 제가 갖고 있는 책 Cocoa Progra…

2004.01
15

열람중 [App 개발] Nehe Lesson 12

이번 강의에서는 출력 리스트를 이용하는 법을 배우겠습니다. 단순히 리스트를 만들어 빠르게 하는 것 뿐만 아니라 간단한 GL 씬을 만들어야 할 때 몇 줄로 나누어 따로 사용할 수 있습니다. 예를 들어서 각 판을 두 개의 운석으로부터 시작하는 ast…

2004.01
13

[App 개발] 성급한 질문 몇가지 드립니다.

cocoa에서 2D와3D가 합성된...,에를들면, 배경은 3D로 캐릭은 2D로 만들경우(캐릭이 3D 배경이 2D 이거나), OpenGL을 사용하면 되는지요 SDL

2004.01
13

[App 개발] 아래 11번 잘 안되네요.

소스코드랑 그림이랑 받아서 그대로 해 봤는데 이상하게 나옵니다. -_-; 에러는 없이 부드러운 움직임은 보이는데 그림이 깨지네요.

2004.01
13

[App 개발] NeHe Lesson 11

대충 소스를 돌아가게끔만 만들어서 캡춰해서 게재를 하다보니 혹시라도 소스코드상에 오류나 옛날 루틴의 찌꺼기등이 많이 끼어있을지도 모릅니다. ^^; 너그럽게 봐 주시고, 어쨌든 빨랑빨랑 진도를 나가는 방향으로 해 보겠습니다. 목표는 3D 게임 엔진 …

2004.01
10

[App 개발] 투명처리 어떻게 하나요?

분명 투명하게 처리해서 tiff포멧 한건데요, 흰 바탕이 그대로 나와버리네요. - (void)drawRect : (NSRect)rect { NSImage *imgFile = [NSImage imageNamed:@"JinPict"]; …

2004.01
10

[App 개발] NeHe Lesson 10

이 예제는 Lionel Brits가 만들었습니다. 여기서는 코드의 어떤 부분이 추가되었는지만 설명하고 있기 때문에 이 글에서 소개하는 코드만 가지고는 프로그램이 동작하지 않을 것입니다. 만약에 어떤 부분에 어떻게 코드가 첨가되었는지 알고 싶으시면 소스…

2004.01
09

[App 개발] NeHe Lesson 9

9번 강좌까지 오신 여러분 수고가 많습니다. 본 코스는… 쿨럭~ ㅡㅡ; 지금까지의 공부를 통해서 OpenGL윈도우를 여는 것부터 시작해서 광원과 투명처리를 한 텍스쳐 물체를 회전시키는 것까지, OpenGL에 대하여 많은 이해가 있으셨을 것입니다. 이번…

2004.01
08

[App 개발] NeHe Lesson 8

투명 OpenGL의 많은 특수 효과들은 블렌딩 기능을 이용합니다. 블렌딩이란 기존에 그려져 있는 픽셀과 새로 그리는 픽셀의 색상을 섞는 일입니다. 어떻게 색상을 섞는가는 색상의 alpha값과 블렌딩 함수에 따라 달라집니다. alpha값이란 색상을…

2004.01
07

[App 개발] NeHe Lesson 7

원문이 윈도우 소스를 기준으로 서술되어 있어서 많은 부분이 바뀌어 있습니다. 특히 키보드 입력 부분은 제가 따로 첨부하는 소스를 참조하시는 것이 더 나을 것입니다. (사실 소스를 잘 만들진 못했습니다. 대충 돌아가게만... ^^;;;) 그래도 없는 것…

2004.01
07

[App 개발] 왕초보 자바 질문요~

자바기초를 공부하려구 하는데요... 일단 윈도에서 도스모드로 컴파일 하는 기초적인 것들은 알구 있구요... xcode에서 컴파일하는 방법을 모르겠어요...--; xcode에서 새화일 선택해서 코딩한다음 빌드를 하고픈데 메뉴들이 전부 비활성화 …

2004.01
06

[App 개발] Carbon과 Cocoa중에서 어떤 것을 선택할까?

저는 C/C++ 프로그래머입니다. 옛날 터보씨 시절부터 C를 썼기 때문에 사실 이것을 고치기가 쉽지 않습니다. 자바 프로그래밍은 밥먹고 사는 문제 때문에 프로젝트를 하면서 배우게 되었습니다. 처음에는 C++의 개념을 갖고 접근하는 바람에 많이 헤매었는…

2004.01
05

[App 개발] NeHe Lesson 6

텍스쳐 매핑을 배우면 여러가지 잇점이 있습니다. 만약 화면을 가로질러 날아가는 미사일을 표현한다고 합시다. 지금까지 배운 것을 토대로 하자면 미사일 전체를 형형색색의 다각형을 모아서 만들어야만 합니다. 텍스쳐 매핑을 사용한다면 진짜 미사일 사진 한 장…

2004.01
04

[App 개발] NeHe Lesson 5

오늘은 지난 시간의 프로그램을 확장하여 3차원 공간에 2차원 물체 대신 3차원 물체를 만들어 보도록 하겠습니다. 삼각형 의 왼쪽, 오른쪽, 뒤쪽 면을 덧붙이고, 사각형에는 왼쪽, 오른쪽, 뒷면, 밑면을 덧붙일 것입니다. 그리고 나면 삼각형은 피라밋 모…

2003.12
30

[App 개발] 코코아에서 Color QuickDraw 의 CopyBits에 해당되는게 먼가요?

왕초보 질문있슴다! 코코아에서 캐릭터가 키보드 이벤트에 따라 걷는걸 맹글어 볼랍니다. 예전엔 Color QuickDraw 의 CopyBits를 이용해서 했던거 같은데, 코코아에서는 어떻게 해야 되는지 좀 갈챠주세요. 캐릭 움직…

2003.12
30

[App 개발] NeHe Lesson 4

지난시간에는 삼각형과 사각형에 색상을 입히는 것을 배웠습니다. 오늘은 이 도형들을 축을 기준으로 회전하도록 만들겠습니다. 지난 시간에 썼던 코드에 몇 가지만 추가하면 됩니다. 밑에는 전체 코드를 기록할 것이기 때문에 어떤 부분이 추가되었고 어떤 부분…

2003.12
29

[App 개발] 오디오 어플리케이션을 개발하고 싶습니다.

아직 맥을 가지고 있지는 않지만, 매킨토시 기반으로 오디오 프로그램을 개발하고 싶습니다. 혹시 맥으로 소프트 신서나 브이에스티 플러그인등을 개발하는것에 관심이 있으신분이 계신가요 제가 아직 초보라서 모르는것이 너무 많습니다…

2003.12
28

[App 개발] NeHe Lesson 3

지난 시간에는 삼각형과 사각형을 화면에 출력하는 것을 배웠습니다. 오늘은 도형에 색상을 입하는 두 가지 방법에 대해서 배울 것입니다. Flat Coloring으로 사각형을 단색으로 칠할 것이고, Smooth Coloring으로 삼각형의 꼭지점에 각각 …

2003.12
27

[App 개발] NeHe Lesson 2

원래는 Lesson 1부터 해야 하는데, 이미 살펴보신 분은 아시겠습니다만, 윈도우 여는 방법 설명이 반 이상입니다. MUG 게시판에 디바이스 컨텍스트가 어쩌고 저쩌고 설명하고 있으면 짜증나시겠죠 ^^; 빠진 부분은 나중에 다루어질 것으로 믿고, Le…

2003.12
26

[App 개발] NeHe Tutorial 따라가기 (0)

OpenGL 사이트 중에서 꽤 명성이 있는 NeHe 프로젝트의 튜토리얼을 따라가 보려고 합니다. 저는 지금까지 Win32와 DirectX 프로그래밍을 주로 해 왔고, 따라서 매킨토시의 Xcode도 처음이고, OpenGL도 처음입니다. 저 혼자 공부하는…

2003.12
23

[App 개발] xcode에서요...

그저께 파워북 구입한 쌩초보입니다... 제가 소프트웨어공학과 제학중이라 C++하고 JAVA를 공부해야하는데요... Xcode라는게 프로그래밍툴 맞져 살때 같이 딸려나온 씨디에 보면 여러가지 패키지가 많은데요 어떤거 설치해야하나요 …

2003.12
12

[App 개발] 맥용 간단한 자바 IDE 슈가 입니다.

장점은 1. 용량이 작다. 2. 쉬운 인터페이스 담점은 1. 한글지원이 조금 아쉽다.. (글자 깨짐) 2. 지원하는 옵션이 적다. 제가 Xcode와 더불어 사용하는 툴입니다. 기존에 아범에서 에디트 플러스나 메모장으로 짜시…

2003.12
07

[App 개발] 초보, 인사드립니다.!

아범으론 몇가지 어플 개발했던 경험이 있지만, 맥은 초보자입니다. 지금은 웹프로그램개발(별로 실력은 없음)을 하고 있고요. 개인적으로 맥에서 돌아갈 (OS9) 회원관리 프로그램을 개발해야 할 일이 생겼는데, 자료 구하기가 만만치 않군요. 컴…

2003.12
07

[App 개발] 코코아는 아니고.. 자바 개발툴..

이번에 알북 12인치를 구입하고, 자바 툴을 찾던중.. 제 구미를 당긴 것이 3가지정도 있었는데.. 1. J 빌더 2. BBedit 3. Xcode 4. sugar 이정도입니다. 모두 돌려봤는데.. 제가 하는 작업이 JSP보다…

2003.11
28

[App 개발] 코코아?? 카본??

안녕하세요. 저는 자바 프로그래머입니다. C언어도 할줄은 아는데.. 포인터땜시.. 자바로 바로 스위칭한 넘입니다. 맥으로 앞으로 작업하려고하는데.. 코코아나.. 리얼 베이직이란 것도 배워보려고 하는데.. 고수님들의 많은 조언 부탁드립니다~ …

2003.11
27

[App 개발] 개발자들이 많은 케이머그가 되면 좋겠습니다..

엑스에는 개발툴이 있으니까.. 많은 개발자들이 모이면 좋겠습니다.. 많이 공부도 좀하고.. 많이 많이 개발하게요.. 하하하..그럼 즐 개발..