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

소프트웨어

[App 개발] NeHe Lesson 20

본문

강의 20번째입니다. 비트맵 이미지 포맷은 거의 모든 컴퓨터, 모든 운영체제에서 지원합니다. 사용하기 쉽고 텍스쳐로 읽고 만들기에 간단합니다. 지금까지 우리는 텍스트나 이미지를 출력할 때 배경을 지우지 않고 물체와 섞이도록 했습니다. 효과적이긴 하지만 항상 좋은 결과를 내는 것은 아닙니다.

블렌딩된 텍스쳐는 대부분 블렌딩이 더 되었거나 덜 되었거나 합니다. 스프라이트를 이용한 게임을 만들 때 주인공 때문에 주인공 뒤의 배경이 빛나게 되는 것은 별로 원하지 않을 것입니다. 여러분은 글씨를 화면에 출력할 때 글자를 또렷하게 해서 읽기 쉽게 만들고 싶으실 것입니다.

이럴 때 마스킹이 유용합니다. 마스킹은 두 가지 단계의 작업입니다. 첫 번째, 텍스쳐의 흑백 이미지를 씬 위에 올려놓습니다. 흰색은 텍스쳐의 투명한 부분이고, 검은 색은 텍스쳐의 불투명한 부분입니다. 우리가 사용하는 블렌딩으로 인하여 화면에는 검은 색 부분만이 드러날 것입니다. 마치 쿠키 커터 효과같습니다. 이제 블렌딩 모드를 변경하고 검은 색을 도려낸 위에 텍스쳐를 입힙니다. 블렌딩 모드에 의하여 화면의 검은 색 마스크 위의 부분에 해당하는 텍스쳐만이 복사될 것입니다.

이 강의에서는 새로 추가된 부분만 게재하지 않고, 프로그램을 몽땅 소개하겠습니다. 새로운 것을 배우실 준비가 되셨습니까? 그러면 시작하죠.
  

#include <math.h>
#include <stdio.h>
#include <gl\\gl.h>
#include <gl\\glu.h>
#include <gl\\glaux.h>


우리는 일곱 개의 광역 변수를 사용할 것입니다. 변수 masking 은 논리 변수 (TRUE/FALSE) 로서 마스킹 기능이 켜졌는지 꺼졌는지를 기록합니다. 변수 mp 는 키보드 M 이 눌려져 있는지를 기록합니다. 변수 sp 는 스페이스바가 눌려있는지를 기록하고, 변수 scene 은 첫 번째 혹은 두 번째 씬에 그리고 있는지를 기록합니다.

변수 texture[5] 은 우리가 사용할 다섯 개의 텍스쳐를 저장할 공간입니다. 변수 loop 은 일반적인 카운터 변수입니다. 텍스쳐를 설정하는 등에 간간히 사용할 것입니다. 마지막으로 변수 roll 은 화면을 가로질러 텍스쳐가 돌아다니도록 해서 멋있는 효과를 만드는 데에 쓰입니다. 그리고 두 번째 신에서는 물체를 회전하는 데에도 쓰입니다.

  
bool masking=TRUE;
bool mp;
bool sp;
bool scene;

GLuint texture[5];
GLuint loop;

GLfloat roll;


비트맵 읽기 코드는 강의 6 번 이후로 변한 것이 없습니다.

다음은 다섯 개의 이미지를 읽어들일 장소를 만드는 코드입니다. 먼저 다섯 개의 이미지를 읽을 장소를 초기화하고 루프를 이용해서 각 이미지를 텍스쳐로 변환합니다. 텍스쳐는 texture[0-4]에 저장됩니다.


int LoadGLTextures()
{
    int Status=FALSE;
    AUX_RGBImageRec *TextureImage[5];
    memset(TextureImage,0,sizeof(void *)*5);

    if ((TextureImage[0]=LoadBMP("Data/logo.bmp")) &&
        (TextureImage[1]=LoadBMP("Data/mask1.bmp")) &&
        (TextureImage[2]=LoadBMP("Data/image1.bmp")) &&
        (TextureImage[3]=LoadBMP("Data/mask2.bmp")) &&
        (TextureImage[4]=LoadBMP("Data/image2.bmp")))
    {
        Status=TRUE;
        glGenTextures(5, &texture[0]);

        for (loop=0; loop<5; loop++)
        {
            glBindTexture(GL_TEXTURE_2D, texture[loop]);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,
                                0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
        }
    }
    for (loop=0; loop<5; loop++)
    {
        if (TextureImage[loop])
        {
            if (TextureImage[loop]->data)
            {
                free(TextureImage[loop]->data);
            }
            free(TextureImage[loop]);
        }
    }
    return Status;
}


ReSizeGLScene() 도 변경이 없으니 넘어가도록 하겠습니다.

초기화 코드는 완전히 기본 골격입니다. 텍스쳐를 읽고, 화면 지우는 색상 선정하고, depth testing 을 활성화하고, smooth shading 을 켜고, 텍스쳐 매핑을 활성화합니다. 간단한 프로그램에 복잡한 초기화는 필요가 없죠.
  

int InitGL(GLvoid)
{
    if (!LoadGLTextures())
    {
        return FALSE;
    }

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_TEXTURE_2D);
    return TRUE;
}


이제 재미있는 그리기 코드입니다. 항상 하던 것으로 시작합니다. 먼저 배경색으로 화면을 지우고 depth buffer 를 초기화합니다. 그다음 모델뷰 매트릭스를 리셋하고 화면 안쪽으로 2유닛 이동하여 씬을 볼 수 있게끔 합니다.

  
int DrawGLScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-2.0f);


다음은 로고 텍스쳐를 선택합니다. 여기서는 화면에 사각형으로 텍스쳐를 입힙니다. 네 텍스쳐 좌표를 네 꼭지점에 대응시킵니다.

Jonathan Roy 가 다시 설명합니다. OpenGL 은 꼭지점 기반 시스템입니다. 대부분의 인수들은 특정한 꼭지점의 특성으로 기록됩니다. 텍스쳐 좌표는 그러한 특성 중의 하나입니다. 여러분이 다각형의 꼭지점에 대하여 적절한 텍스쳐 좌표를 설정하게 되면 OpenGL은 interpolation 이라는 기법을 이용해서 꼭지점 사이의 평면에 텍스쳐를 자동적으로 입히게 됩니다. Interpolation 이란 OpenGL 이 꼭지점들이 갖고 있는 값을 통해서 꼭지점 사이의 변수 값이 어떻게 변화하는지를 알도록 하는 기본적인 기하학적인 기법입니다.

지난 강의들과 마찬가지로 사각형을 바라보는 입장에서 텍스쳐 좌표를 다음과 같이 (0.0, 0.0)과 왼쪽 아래, (0.0, 1.0)과 오른쪽 위, (1.0, 0.0) 과 오른쪽 아래, (1.0, 1.0)과 오른쪽 위로 부여합니다. 이러한 설정에서, 사각형의 중앙은 텍스쳐 좌표로 어떻게 될까요? 맞습니다. (0.5, 0.5) 입니다. 그러나 코드 어떤 부분에서도 그것을 지정해 준 일은 없습니다. 사각형을 그릴 때 OpenGL이 자동으로 부여합니다. 어떤 위치, 크기, 기준의 다각형이라도 처리할 수 있습니다.

이번 강의에서 우리는 텍스쳐 좌표를 0.0과 1.0으로 주지 않고 약간 변화를 줄 것입니다. 텍스쳐 좌표는 정규화되어 있습니다. 0.0은 텍스쳐의 끝부분이고, 1.0은 반대편 끝부분에 해당하여, 텍스쳐 이미지의 픽셀 크기와는 상관 없이 텍스쳐 이미지의 전체 넓이와 높이가 한 유닛 크기에 펼쳐져 있습니다. (따라서 우리는 텍스쳐 이미지의 크기를 신경쓰지 않아도 되고, 프로그램을 쉽게 짤 수 있습니다) 1.0보다 큰 값은 텍스쳐의 반대편 모서리로 덮인 것처럼 되어 텍스쳐가 반복됩니다. 다시 말해서 텍스쳐 좌표 (0.3, 0.5)를 예로 들면, (1.3, 0.5) 나 (12.3, -2.5)는 모두 텍스쳐 이미지의 동일한 픽셀로 매핑됩니다. 이 강의에서는 1.0 대신 3.0 을 대입하여 사각형 표면 위에 텍스쳐를 아홉 번 (3x3 타일) 반복하는 타일링 효과를 얻을 것입니다.

더불어서, 변수 roll 을 이용하여 사각형 표면 위에서 텍스쳐를 이동 (슬라이딩) 시킬 것입니다. 수직 텍스쳐 좌표에 변수 roll 값 0.0 이면 사각형 밑면의 텍스쳐 매핑이 텍스쳐 이미지의 밑면으로부터 시작된다는 것을 뜻합니다. 변수 roll 이 0.5가 되면 사각형 밑의 매핑이 이미지의 중간부터 시작됩니다. 이동하는 텍스쳐는 움직이는 구름이나 물체에 움직이는 글자를 만드는 등 좋은 효과를 만들 때 쓰일 수 있습니다.
  

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, -roll+0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
        glTexCoord2f(3.0f, -roll+0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
        glTexCoord2f(3.0f, -roll+3.0f); glVertex3f( 1.1f,  1.1f,  0.0f);
        glTexCoord2f(0.0f, -roll+3.0f); glVertex3f(-1.1f,  1.1f,  0.0f);
    glEnd();


어쨌든, 현실로 돌아와서, 이제 블렌딩을 활성화합니다. 이 효과가 동작하게끔 하기 위해서는 depth testing 을 꺼야 합니다. 이렇게 하는 것이 매우 중요합니다. Depth testing 을 끄지 않으면 전체 이미지는 사라지고 여러분은 아무것도 볼 수 없을 것입니다.
  

    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);


블렌딩과 depth testing 다음에 해야 할 첫 번째 일은 이제 이미지 마스킹을 할 것인지 옛날 식으로 블렌딩을 할 것인지 확인하는 것입니다. 다음은 masking 이 TRUE 인지 확인해서, 그렇다면 블렌딩을 설정해서 우리 마스크가 화면에 제대로 그려질 수 있도록 하는 코드입니다.

  
    if (masking)
    {


만약 masking 이 TRUE 라면 다음 코드에서 마스크를 위한 블렌딩을 설정합니다. 마스크는 화면에 그리고자 하는 흑백 텍스쳐에 불과합니다. 마스크의 흰 색 부분은 투명한 부분이 되고, 검은 색 부분은 불투명한 부분이 됩니다.

다음의 블렌딩 명령은 다음과 같은 일을 합니다. 만일 입혀지는 마스크의 색상이 검은 색이라면 목적 색상 (화면색) 을 검은 색으로 만듭니다. 다시 말해서 마스크의 검은 색에 해당하는 화면 영역은 검은 색이 됩니다. 마스크 밑에 있는 화면의 어떤 것이라도 검은 색으로 지워집니다. 흰 색 마스크로 덮여지는 화면의 영역은 변함이 없습니다.

  
        glBlendFunc(GL_DST_COLOR,GL_ZERO);
    }


이제 어떤 씬이 그려지는지 검사합니다. 만일 scene 이 TRUE 라면 두 번째 씬을 그리는 것이고, 만일 FALSE 라면 첫 번째 씬을 그리는 것입니다.

  
    if (scene)
    {


물체가 너무 큰 것을 원하지 않기 때문에 화면 안쪽으로 한 유닛 더 이동하겠습니다. 이렇게 하면 물체의 크기가 줄어듭니다.

화면 안쪽으로 이동한 다음 roll 값에 따라서 0-360도 회전합니다. 만약 roll 이 0.0 이라면 0도 회전하고, 1.0 이라면 360도 회전합니다. 약간 회전이 빠른 듯 합니다만, 단지 화면 중앙에서 이미지를 회전하기 위해서 또 다른 변수를 만들 필요는 없을 것 같군요.

  
        glTranslatef(0.0f,0.0f,-1.0f);
        glRotatef(roll*360,0.0f,0.0f,1.0f);


우리는 이미 화면에 움직이는 로고를 만들었고, 씬을 Z 축을 중심으로 회전하게 해서 그려지는 어떤 물체라도 반시계방향으로 회전하게 되었습니다. 이제 masking 이 켜져 있는지를 확인합니다. 만일 켜져 있으면 마스크를 그리고 물체를 그리게 되고, 꺼져 있으면 단지 물체만 그리게 됩니다.


        if (masking)
        {


만일 masking 이 TRUE 라면 화면에 마스크를 그립니다. 우리는 마스크를 입히면서 이미 한 번 블렌딩을 설정했기 때문에 블렌딩 모드는 확실히 설정되어 있을 것입니다. 이제 화면에 마스크를 그립니다. 두 번재 씬이기 때문에 마스크 2 를 선택합니다. 마스크 텍스쳐를 선택하 다음 사각형에 텍스쳐를 매핑합니다. 사각형은 왼쪽 오른쪽으로 1.1 유닛으로 설정하여 화면을 조금 더 덮습니다. 텍스쳐 하나만 출력할 것이기 때문에 택스쳐 좌표는 0.0부터 1.0까지입니다.

화면에 마스크를 그리고 나면 텍스쳐의 검은 색 모습이 화면에 남게 됩니다. 최종 결과물은 마치 누군가가 뽑기 틀을 가지고 화면에서 마지막 텍스쳐의 모습같이 잘라낸 듯 검은 공간을 남겨놓게 됩니다.


            glBindTexture(GL_TEXTURE_2D, texture[3]);
            glBegin(GL_QUADS);
                glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
                glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
                glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f,  1.1f,  0.0f);
                glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f,  1.1f,  0.0f);
            glEnd();
        }


이제 마스크를 화면에 그리는 일이 끝났고 블렌딩 모드를 바꿀 차례입니다. 이번에는 OpenGL 에게 화면에 텍스쳐의 검은 색을 제외한 나머지 부분을 복사하게 합니다. 마지막 텍스쳐는 마스크와 동일한 모양에 색상을 가지고 있어서, 텍스쳐에서 화면으로 그려지는 부분은 마스크의 검은 색 위에 있던 화면 영역이 됩니다. 마스크가 검은 색이었기 때문에 화면에서 텍스쳐를 통과해서 드러나는 부분이 없어지게 됩니다. 이렇게 하면 화면 위를 움직이는 아주 두툼한 느낌의 텍스쳐를 만들게 됩니다.

마지막 블렌딩 모드를 선택한 다음에 다음 이미지를 선택한 것을 잘 보십시오. 이렇게 해서 두 번째 마스크에 기초한 색상 이미지를 선택하게 됩니다. 그리고, 동일한 텍스쳐 좌표와 동일한 꼭지점을 사용해서, 마스크의 바로 위에 이미지를 그리게 됩니다.

만약 마스크 위에 정확히 덮지 않으면 이미지가 화면에 복사되긴 하지만 화면에 있던 픽셀과 섞이게 됩니다.

  
        glBlendFunc(GL_ONE, GL_ONE);
        glBindTexture(GL_TEXTURE_2D, texture[4]);
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
            glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
            glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f,  1.1f,  0.0f);
            glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f,  1.1f,  0.0f);
        glEnd();
    }


만약 scene 이 FALSE 였다면 첫 번째 씬을 그립니다.

  
    else
    {


이제 masking 이 TRUE 인지 FALSE 인지 확인하는 코드입니다.
  

        if (masking)
        {


만약 masking 이 TRUE 라면 첫 번째 마스크 (첫 번째 씬의 마스크) 를 화면에 출력합니다. 텍스쳐가 오른쪽에서 왼쪽으로 (roll 변수가 수평 텍스쳐 좌표에 더해지므로) 움직입니다. 이 텍스쳐를 전체 화면에 출력할 것이므로 화면 안쪽으로 이동하지 않을 것입니다.

  
            glBindTexture(GL_TEXTURE_2D, texture[1]);
            glBegin(GL_QUADS);
                glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
                glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
                glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f,  1.1f,  0.0f);
                glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f,  1.1f,  0.0f);
            glEnd();
        }


다시 블렌딩을 활성화하고 첫 번째 씬을 위한 텍스쳐를 선택합니다. 마스크 위에 텍스쳐를 입히게 됩니다. 이 텍스쳐도 역시 움직이게 해야 합니다. 그렇지 않으면 마스크와 최종 이미지가 맞아 떨어지지 않게 됩니다.

  
        glBlendFunc(GL_ONE, GL_ONE);
        glBindTexture(GL_TEXTURE_2D, texture[2]);
        glBegin(GL_QUADS);
            glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
            glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
            glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f,  1.1f,  0.0f);
            glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f,  1.1f,  0.0f);
        glEnd();
    }


이제 depth testing 을 켜고 블렌딩을 끕니다. 이렇게 해서 이후의 프로그램에 의해서 이상한 일들이 발생하지 않게 합니다.
  

    glEnable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);


마지막으로 남은 일은 변수 roll 을 증가시키는 일입니다. 만약 roll 이 1.0 보다 크면 1.0 을 빼서 roll 값이 한게를 넘는 일을 방지합니다.

  
    roll+=0.002f;
    if (roll>1.0f)
    {
        roll-=1.0f;
    }

    return TRUE;
}


KillGLWindow(), CreateGLWindow() 는 변함이 없으니 넘어갑니다.


이제 키보드 처리 코드입니다. 먼저 스페이스바가 눌렸는지 검사해서 눌렸으면 변수 sp 를 TRUE 로 놓습니다. 만일 sp 가 TRUE 라면 다음 코드는 두 번째부터는 스페이스바가 떨어지기 전까지 실행되지 않습니다. 이렇게 하면 씬이 빨리 뒤바뀌는 것을 방지할 수 있습니다. 변수 sp 를 TRUE 로 놓은 다음에는 scene 의 상태를 바꿉니다. 예전에 TRUE 였다면 이제 FALSE가 되고, 예전에 FALSE 였다면 이제 TRUE 가 됩니다. 위에 있는 그리기 코드에서 scene 이 FALSE 라면 첫 번째 씬이 그려지고, TRUE 라면 두 번째 씬이 그려집니다.
  

                if (keys[' '] && !sp)
                {
                     sp=TRUE;
                     scene=!scene;
                }


다음은 스페이스바가 떨어졌는지를 검사해서 떨어졌으면 sp 를 FALSE 로 놓아서 스페이스바가 계속 눌려있지 않다는 것을 프로그램이 알게 합니다. 변수 sp 가 FALSE 가 되면 위의 코드에서 다시 스페이스바가 눌렸는지를 검사하게 되고, 눌렸으면 위의 작업이 반복됩니다.

  
                if (!keys[' '])
                {
                    sp=FALSE;
                }


다음은 키보드 M 이 눌렸는지를 검사해서, 눌렸으면 mp 를 TRUE 로 놓아서 키보드가 떨어지기 전까지 다시 검사하지 않도록 하고, 변수 masking 을 TRUE 에서 FALSE로, FALSE 에서 TRUE 로 변경합니다. 만약 masking 이 TRUE 라면 마스크를 그리게 되고, FALSE 라면 마스크를 그리지 않습니다. 만약 마스크를 그리지 않으면 우리가 지금까지 사용한 옛날 방식의 블렌딩 방식이 사용되고 화면과 물체가 서로 섞이게 됩니다.

  
                if (keys['M'] && !mp)
                {
                    mp=TRUE;
                    masking=!masking;
                }


마지막으로 키보드 M 이 그만 눌렸는지를 검사해서 그렇다면 mp 를 FALSE 로 놓아서 키보드 M 이 더 이상 눌려있지 않음을 프로그램이 알게 합니다. 키보드 M 이 떨어지면 마스킹 모드를 다시 켜거나 끌 수 있게 됩니다.
  

                if (!keys['M'])
                {
                    mp=FALSE;
                }
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 0

등록된 댓글이 없습니다.
전체 529 건 - 10 페이지
2005.03
07

[App 개발] oracle 10g를 페더에 설치가 가능한가요??

이번 학기에 데이터 베이스 수업과.. JAVA수업을 듣게 되었는데.. JAVA는 아이북에서 설치가 가능하다고 하신거 같은데.. oracle 10g는 맥 서버용으로 나온건 알고 있습니다.. 그런데 그걸 그냥 일반 페더에도 깔수가 있…

2005.02
18

[App 개발] 한글 파일이름 open 이 원래 안되나요?

python 에서 한글 파일 이름으로 write 하려고 open 했는데 에러가 나는군요. 다른 프로그램으로 open 해도 화일이름이 한글이면 에러가 나는 것 같습니다. 한글이름이면 open 시스템콜이 안되나 봅니다 예) >>> f = ope…

2005.02
12

[App 개발] gnu c library

mac os x 에 설치된 c library 는 gnu c library 가 아니군요. BSD 계열이니 당연한 것이겠지만서도..... 수치계산할 때 complex 형 변수를 선언할 수 없어 불편하군요. 그런데 c library를 손…

2005.02
10

[App 개발] hdf5설치 성공하신 분 있나요?

라이브러리 설치 문제가 계속 걸려서 fink 를 이용해 봤습니다만, 안되는군요. :-( libpng, libjpeg 등을 모두 설치해도 h5utils 를 configure 하는 도중에 이 라이브러리들이 없다고 하는군요. hdf5 역…

2005.02
01

[App 개발] hdf5 라이브러리는 어디에...

리눅스에서 제가 작성했던 코드를 가져와서 컴파일 하려 하니 hdf5 라이브러리가 없다며 실패하는군요. hdf5 를 포트에서 설치하면 될 줄 알았는데 그게 아니었나 봅니다. h5cc 등의 툴만 있지 실제적으로 C 코드에서 호출해서 …

2005.01
28

[App 개발] [질문] 개발자에게 있어서 맥이란 플랫폼이란...?

안녕하세요. 컴퓨터 전공하는 학생입니다. 4년전에 대학교 입학할 때 컴퓨터를 장만하면서 맥도 고려했었습니다. 큐브가 어찌나 이뻐 보이던지 ^^; 하지만 PC에 비해 너무 고가의 장비였고... 무엇보다 맥으로 코딩 작업이 …

2005.01
06

[App 개발] apple developer 사이트에서 샘플 긁어오기 스크립트

본격적으로 osx 공부를 해볼까해서 apple developer 사이트를 보면서 샘플을 하나하나 다운로드하니 노가다성이 심하다 생각되서 파이손 스크립트 하나 만들었습니다. :) 페이지에 있는 *.sit 파일들만 쭉 다 다운로드 해줍니다. 저는 터…

2005.01
02

[App 개발] 프로그래밍 공부하는 방법

-------------------------------------------------------------------------------- 그냥 나름대로 정리해봄.. ----------------------------------------…

2004.12
28

[App 개발] MPC 7448 그리고 MPC 8641

프리스케일 웹사이트에 드디어 MPC 7448 과 MPC 8641 이 정식으로 명명되어 대략 설명이 올라왔습니다. 정말 내년 초 파워북 G4 의 업그레이드가 헛소문만은 아닌가봅니다. MPC7448 은 200MHz 의 MPX 버스를 가지게 되었습니다…

2004.12
18

[App 개발] GUI 인터페이스의 vim

새로 iMac 을 장만하고, 프로그래밍을 해 보겠다는 꿈을 품고 Xcode 를 무작정 실행해 보니 확실히 잘 모를것들이 많더군요. 앞으로 어찌 공부해야 할지, 갈길이 멀군요. 일단 고지식하게 Vim 을 찾았습니다. 터미널에 vi 는 있었지만, …

2004.12
06

[App 개발] 유용한 MacOS X external commands

요즘 타 맥관련 사이트에서도 열심히 글타래를 정독하면서 OS X의 근본적인 unix나 이래저래 공부를 하고 있습니다. 그중에서 unix 커맨드중에서 유용한 것들에 대한 설명이 되어있는 글을 보고 이렇게 올려드려요~ 공부하시는 분들에겐 도…

2004.11
29

[App 개발] MOD Player 를 만들어보자 2

지난 4월이었던가요 유닉스용 소스에 퀵타임 루틴을 첨가하여 간단하게 MOD 플레이어를 만들어본 적이 있는 것을 기억하실 것입니다. 그 때에는 첫 번째 시도이기도 하고, 괜찮은 소스를 입수하는 것도 여의치 않아서, 오리지날 4채널 MOD 포맷만을 지원했…

2004.11
17

[App 개발] MACOSX용 BBS WebStation 1.0 공개합니다.

MACOS용 BBS WebStation 1.0 공개합니다. 패키지로 구성된 파일을 실행하시면 자신의 MACOSX에서 BBS를 운영하실 수 있습니다. Perl 기반으로 작성되어있으며 FileDB를 사용하므로 별다른 작업없이 커뮤니티 구성이 가능합…

2004.11
11

[App 개발] 슈퍼컴퓨터 컨퍼런스 2004

제가 살고있는 피츠버그에서 슈퍼컴퓨터 컨퍼런스가 열리고 있습니다. 저는 오늘 하루 전시회 입장권만 구입해서 잠시 구경을 했습니다. 원래는 차기에 구매할 number crunching 기계 중에서 물망에 오르고 있는 4-way Opteron 제품을 직접…

2004.11
07

[App 개발] eclipse 사용해보시지 않으실래요..

안녕하세요.. 일본머그지기 시니입니다.. 저도.. 오픈소스를 넘 좋아해서리.. ㅋㅋㅋ 그나저나.. 개발하시는분들중엔 사용하고 계실지 모르지만.. 전 자바를 좋아해서리..ㅋㅋㅋ 새로나온.. 머 좀 지났지만 이클립스 3.0.1 함 사용해보세요.…

2004.11
03

[App 개발] 신형 아이북, 파워맥 벤치마크 결과

아이북, 파워맥 1.8GHz 벤치마크 느린 버스속도가 싱글 파워맥 성능저하의 요인 By James Galbraith 최근 애플에서 신형 아이북과 저가형 파워맥 G5가 발표되었습니다. 전체 리뷰를 진행하면서 동시에 Speedmark 테스트 …

2004.10
31

[App 개발] 게임엔진 NeoEngine 의 컴파일

SourceForge.net 에서 제일 인기있는 공개 소스 버젼 게임엔진 NeoEngine 이 있습니다. 모질라 라이센스를 따르고 있어서 소스의 변경 수정이 자유롭다는 특징이 있고, 공개 버젼 중에서는 가장 완성도가 높은 라이브러리가 아닌가 생각됩니다…

2004.10
18

[App 개발] [ 급질문 ] 맥용 웹하드 정도 만들어 볼려면..

음... 맥용 웹하드 정도 만들어 볼려면 어느정도 지식이 필요 할까요 아직 맥을 구경도 못해봤습니다..-_-;;; 맥이 어떻게 켜지는지도 모르고.... 맥에 관심이 어느날 부터 가기 시작하던데... 그런데 너무 맥에 관한 자료가 없더군요.. fi…

2004.10
13

[App 개발] X Code에서 include 포함 파일이나 라이브러리 파일의 경로는 어떻게 지정하나요 ?

안녕하세요.. 비주얼 스튜디오 같은 곳에서는 포함 파일이나 라이브러리 파일을 옵션에서 설정해 줄 수 있었습니다. X Code 에서는 이를 어떻게 설정해 주어야 하나요 예를 들어 /Volumes/Data/SDKLib 라는 곳에…

2004.09
10

[App 개발] 아이맥 G5 의 특이한 점 - 개발자 문서에서 살펴본 결과

아이맥 G5 의 개발자 문서가 드뎌 공개되었군요. 메모리 버스가 어떻게 구성되어 있는지 상세히 밝혀져 있습니다. 구형 파워맥 G5 의 구성과 비교해 보겠습니다. 신형 파워맥 G5 에서는 변경된 사항이 있을지도 모르겠습니다. 1. …

2004.08
31

[App 개발] 아이맥 G5 의 특이한 점???

개발실에 쓸 글은 아닙니다만... 딱히 좋은 장소가 없어서 여기에 글을 올립니다. 일단 오늘(8월 31일) 발표된 새 아이맥은 날씬하고 보기 좋고, 게다가 가격도 무척 저렴해서 크게 인기를 끌 수 있는 가능성이 풍부한 제품이라고 생각합니다. …

2004.07
05

[App 개발] 질문하나 있습니다.

아.. 소스를 카피해온다는 것이 못해왔네요. 다름이 아니라, Xcode에서 Interface Builder로 Custom View를 하나 만들었고, 이 클래스로 파일을 생성(.h, .m파일)하여 Xcode에서 .m파일에 이 Custom View에…

2004.05
24

[App 개발] 여기 아무두 안오세용? 도와주세요.

이제 막 코코아 개발을 시작하려고 하는 초보입니다. C에 대해선 어렴풋이나마 알고 있고 잘 알지 못하는 중에 코코아로 바로 뛰어들었는데요. 많이 부족함을 느낍니다. 천천히 하고있는데... 열심히 하고 싶지만 시간이 없네요. 지금 OR…

2004.05
15

[App 개발] 맥에서 Qt 사용 어떤가요?

사운드신세시스 프로그래밍을 공부하는데요 아무래도 GUI 가 필요해서 GUI 프로그래밍을 보려하는데, 리눅스환경에서 만들고 있어서 Qt 를 사용해서 GUI 를 만들어보려고요. 그런데 Qt 소개를 자세히 보니까 멀티플랫폼 API 이어…

2004.04
21

[App 개발] NeHe Lesson 23

무척 오랫만입니다... ㅎㅎㅎ 먹고 사는 것이 바쁘다보니... 일단 샘플 코드의 구현은 흥미로운 것 위주로 하도록 하고, 나머지는 텍스트를 익히는 것에 중점을 두려고 합니다. (제가 게을러졌다는 것을 우회적으로 표현하는 것입니다. ㅡㅡ;;;) …

2004.04
02

[App 개발] 국제컴퓨터, 소프트웨어, 통신전시회에 참석 하고자 분들 (리플부탁)

- 컴퓨터:휴대형단말기, PC(Desktop, Notebook, Laptop,Palmtop, Etc), 매킨토시, 네트웍컴퓨터, 서버, 워크스테이션, 메인프레임, 프리젠테이션장비, 기타 - 소프트웨어:WINDOWS/NT/UNIX기반 시스템ɨ…

2004.03
11

[App 개발] ModPlayer 를 만들어보자

MOD 는 Amiga 의 음악 파일 포맷입니다. 사실 아미가에서 쓰였기 때문에 유명해졌다기보다는 많은 도스 게임들이 MOD 배경음악을 지원하면서 탄탄한 지원군을 많이 얻음으로 인하여 공개 소스들이 많이 돌아다니게 되고, 유저의 손에서 더욱 더 확장되고…

2004.03
10

[App 개발] 맥마메 분석 - 5 사운드 출력

맥마메 분석 – 5 사운드 출력 개인적으로 가장 관심있는 부분으로 접어들었습니다. 오랫동안 피씨 프로그래밍만 해오다 보니 매킨토시의 사운드 출력이 어떻게 이루어지는지를 궁금해 해 왔습니다. 최근에는 맥과 피씨가 유사한 칩셋들을 많이 공…

2004.03
09

[App 개발] 맥마메 분석 - 4 HID 루틴

맥마메 분석 – 4 조이스틱 입력 네 번째 시간이 되었습니다. 솔직히 저는 조이스틱 지원에 대해서는 별로 관심은 없습니다. (집에 조이스틱이 없거든요. 하하…) 애플 II 에서는 조이스틱이 없으면 완전 바보였지만, 이제는 입력장치로 마…

2004.03
06

[App 개발] 맥마메 분석 - 3 마우스 입력

맥마메 분석 – 3 마우스 입력 마우스 입력도 키보드 입력과 거의 비슷한 방식으로 구현되어 있습니다. 메인 윈도우 이벤트 핸들러로 마우스 입력 핸들러를 등록하는 것, 그리고 이벤트 핸들러에서 입력된 값을 마우스 상태 배열에 …

2004.03
05

[App 개발] 맥마메 분석 - 2 키보드 입력

맥마메 분석 사실 마메의 진짜 핵심은 프로세서 에뮬레이션, 비디오 프로세서, 사운드 프로세서 에뮬레이션 루틴이죠. 한 번 마메 소스를 열어보신 분들이라면 실로 방대한 에뮬레이션 루틴들을 보면서 놀라셨을 것입니다. 그런데, 에뮬레이터를 제…

2004.03
04

[App 개발] 수박 겉핥기 MacMAME 분석 - 1. 디스플레이

수박 겉핥기 MacMAME 분석 Multiple Arcade Machine Emulator 의 약자인 MAME 는 게임 센터의 PCB 게임들의 에뮬레이터로서 고전 게임 매니아들에게 사랑받는 프로그램입니다. 대부분 기종에 이식되어 있고, 매킨토시에…

2004.02
18

[App 개발] NeHe Lesson 22

22번은 작문도 상당히 엉터리고, 그래서 번역도 엉터리고, 소스도 엉터리고... 이것을 붙잡고 계속 늘어지고 있는 것보다는 어서 앞으로 나아가야겠다는 생각에 예제도 만들지 못하고 건너뛰게 되었습니다. 대단히 송구스럽습니다. 별로 도움 안 되는 22번이…

2004.02
10

[App 개발] 10 bytes extended 형 데이터 처리.

안녕하세요 계속해서 Aiff 파일을 공부하고 있는데요. 헤더에 들어가있는 short, long, char 등의 데이터형의 데이터는 쉽게 읽고 쓸수가 있는데, Wave 화일과는 달리 Aiff 파일은 Sample Rate 를 기록하는 데이…

2004.02
08

[App 개발] NeHe Lesson 21

늦었습니다. ^^ 이번에는 내용도 많고, 간단하긴 하지만 그래도 게임 제작이고, 원래가 윈도우용으로 제작된 소스를 이식해야 하는 것이라 빼먹은 부분도 많고, 그래도 대충 돌아가게끔 맞춰놓긴 했습니다만... 어쨌든 즐겨 주십시오. ^^ ------…

2004.02
03

열람중 [App 개발] NeHe Lesson 20

강의 20번째입니다. 비트맵 이미지 포맷은 거의 모든 컴퓨터, 모든 운영체제에서 지원합니다. 사용하기 쉽고 텍스쳐로 읽고 만들기에 간단합니다. 지금까지 우리는 텍스트나 이미지를 출력할 때 배경을 지우지 않고 물체와 섞이도록 했습니다. 효과적이긴 하지만…

2004.02
01

[App 개발] Cocoa Design Patterns (7) 마지막

Facades 클래스 클러스터와 프록시를 설명할 때 이미 소개했습니다만, Facade(겉면 - 여기서는 포장지(Wrapper Facade)로 번역하겠습니다)는 복잡한 객체 집단을 간단히 단일화하여 보여주는 객체입니다. 포장지 패턴은 코코아에서 다른 …

2004.02
01

[App 개발] c++ file io 에서 기초적인 질문입니다.

Aiff 화일 헤더분석하는 프로그램을 만들어보려고 하는데요, 그냥 콘솔형으로 하려고, gcc 를 사용해서 하고 있습니다. 파일 입출력을 위해 ifstream 을 사용하는데요, aiff 화일로 부터 1바이트 char 형 데이터를 읽기위해…

2004.01
31

[App 개발] NeHe Lesson 19

강의 19번째입니다. 지금까지 여러 가지를 배워 오셨는데, 이제부터는 갖고 놀고 싶으실 겁니다. 저는 이번 강의에서 새로운 명령을 하나 소개하려고 합니다. 삼각 막대입니다. 아주 간단하고, 많은 수의 삼각형을 그리는 프로그램을 빠르게 만드는데 도움이 …

2004.01
30

[App 개발] Cocoa Design Patterns (6)

Notifications 코코아는 통지(notifications)기능을 이용해서 응용프로그램 내의 객체간에 중요한 일들이 발생했음을 알립니다. 어떤 통지 메세지들은 수신자가 여러 개일수도 있습니다. 물론 여러 개의 객체가 한 메세지를 보내거나 공시할…

2004.01
29

[App 개발] java2 network (chat server/client)

-- TCP기반의 에코서버/클라이언트 //EchoClientTest.java   import java.io.*; import java.net.*; public class &nbs…

2004.01
29

[App 개발] 진짜 간단한 AWT 계산기입니다..

import java.awt.*; import java.awt.event.*; public class Calcurator_ex extends Frame implements ActionListener{ // 인스턴스 변수 선언 Butt…

2004.01
29

[App 개발] AWT java text 에디터입니다.

import java.awt.*; import java.awt.event.*; import java.io.*; class EditorDemo extends Frame implements ActionListener{ TextAr…

2004.01
29

[App 개발] NeHe Lesson 18

Quadrics Quadrics는 for 루프와 삼각함수를 이용하여 복잡한 물체를 그리는 방법을 뜻합니다. 강의 7 에서 사용한 코드를 이용할 것입니다. 일곱 개의 변수를 추가하고 텍스쳐를 바꾸어서 변화를 주었습니다. bool sp;…

2004.01
28

[App 개발] NeHe Lesson 17

이번 강의는 NeHe와 Giuseppe D’Agata에 의해 만들어졌습니다. 폰트때문에 힘드신 것 다 압니다. 지금까지 제가 만든 강의에서는 단순히 글자를 출력하는 것뿐만 아니라 3D 글자, 텍스쳐 매핑된 글자를 출력할 수 있고, 변수를 처리할 …

2004.01
25

[App 개발] CoreGraphics의 풀스크린 화면 만들기

박진철님께서 올리셨던 질문 중에 코코아에서 퀵드로우의 CopyBits대신 사용할 수 있는 방법으로서 아시는 분들은 다 아실만한 CGDirectDisplay 를 이용한 방법을 한 번 시도해 보았습니다. 프로그램은 심히 완성도가 떨어지는 관계로 감히…

2004.01
23

[App 개발] Cocoa Design Patterns (5)

Commands GOF의 패턴에 익숙하신 분들은 아마 타겟/액션이 마치 커맨드 패턴의 구현이라고 생각될 것입니다. 그러나 커맨드 패턴같은 것이 타겟/액션과 같은 구현이 이용된다 하더라도 Objective-C에서는 그것이 필요가 없습니다. 커맨드 패턴…

2004.01
22

[App 개발] Cocoa Design Patterns (4)

Enumeration 코코아의 모든 콜랙션 클래스는 계수기를 제공합니다. 이 패턴은 GOF의 반복기 패턴과 비슷합니다. 계수기는 객체의 집합을 훑어내고 각 객체에 어떤 일을 수행하는 방법을 제공합니다. 특정한 집합에 대하여 특수한 루프를 짜 주는 대…

2004.01
22

[App 개발] NeHe Lesson 16

이번 강의는 Chris Aliotta가 제작하였습니다. 당신의 OpenGL 프로그램에 안개를 넣고 싶으십니까 이번 강의에서 바로 그 방법을 보여드리려고 합니다. 저는 강의를 쓰는 것은 처음이고, OpenGL/C++ 프로그래밍은 근래에 시작한 것이…