철이의 컴노리
  • 안녕하세요!
  • KOTLIN
  • ANDROID
    • Architecture Components
      • 프로젝트에 추가하기
      • 데이터 바인딩 라이브러리
        • 시작하기
        • 레이아웃 및 바인딩 표현식
      • 라이프 사이클 처리
      • ViewModel
    • CameraX
      • CameraX 아키텍처
      • 구성
      • 미리보기
      • 이미지 분석
      • 이미지 캡처
      • 제조 업체 확장 기능
    • View
      • 커스텀뷰의 크기 정하기
    • JNI 튜토리얼
      • 1장. 저자 소개
      • 2장. Hello JNI
      • 3장. 메서드 등록
      • 4장. int 데이터형 값 주고 받기
      • 5장. boolean 데이터형 값 주고 받기
      • 6장. double 데이터형 값 주고 받기
      • 7장. float 데이터형 값 주고 받기
      • 8장. long 데이터형 값 주고 받기
      • 9장. short 데이터형 값 주고 받기
      • 10장. char 데이터형 값 주고 받기
      • 11장. byte 데이터형 값 주고 받기
      • 12장. JNI에서 문자열 다루기 1/3
      • 13장. JNI에서 문자열 다루기 2/3
      • 14장. JNI에서 문자열 다루기 3/3
      • 15장. 레퍼런스 이해하기
      • 16장. 배열 다루기 1/4
      • 17장. 배열 다루기 2/4
      • 18장. 배열 다루기 3/4
      • 19장. 배열 다루기 4/4
      • 20장. 중간 요약
      • 21장. 자바 클래스 찾기 1/2
      • 22장. 자바 클래스 찾기 2/2
      • 23장. 정적 메서드 찾기
      • 24장. 정적필드 찾기
      • 25장. 자바 클래스 인스턴스 생성하기
      • 26장. 자바 클래스 인스턴스 메서드 찾기
      • 27장. 자바 클래스의 인스턴스 필드 찾기
      • 28장. 네이티브 쓰레드 실행하기
  • Swift
    • What' New
      • Swift 5.0
        • Result 타입
        • Raw 문자열
        • 커스텀 문자열 보간
    • Codable
      • 커스텀 타입 인코딩 및 디코딩
  • iOS
  • OpenGL
    • OpenGL Tutorial
      • 1장. 저자 소개
      • 2장. OpenGL 윈도우 프레임웍 만들기 1편
      • 3장. OpenGL 윈도우 프레임웍 만들기 2편
      • 4장. 점그리기
      • 5장. 선 그리기
      • 6장. 다각형 그리기
      • 7장. 색 표현하기
      • 8장. 3차원 폴리곤 그리기
      • 9장. 투영변환
      • 10장. 이동, 회전, 크기 변환
      • 11장. 빛, 재질 표현하기
      • 12장. 텍스춰매핑
    • OpenGL ES Tutorial for iOS
      • 1장. 저자 소개
      • 2장. 튜토리얼 소개
      • 3장. OpenGL|ES 개발 환경 만들기
      • 4장. 뷰 배경색상 변경하기
      • 5장. 투영에 대해서 1/2
      • 6장. 투영에 대해서 2/2
      • 7장. 선분 및 삼각형 그리기
      • 8장. 색상칠하기
      • 9장. 텍스춰맵핑
      • 10장. 종횡비
      • 11장. 텍스춰 UV좌표
      • 12장. 텍스춰매핑 파라미터
      • 13장. 깊이버퍼
      • 14장. 원근투영
  • ENV
    • oh-my-zsh
      • 특정 git 폴더에서 zsh 이 느려질 때
  • Ubuntu
    • UEFI USB
    • nvidia driver
    • /dev/kvm on Android Studio
    • install oracle-jdk8
  • chromium
    • javap
Powered by GitBook
On this page

Was this helpful?

  1. OpenGL
  2. OpenGL ES Tutorial for iOS

7장. 선분 및 삼각형 그리기

Previous6장. 투영에 대해서 2/2Next8장. 색상칠하기

Last updated 6 years ago

Was this helpful?

선분, 삼각형, 사각형 등 여러 폴리곤을 그려보겠습니다. 우선 선분을 그려보겠습니다. OpenGL|ES 에서 선분을 그리는 방법은 총 3가지가 있습니다. GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP 로 아래는 각 방법을 그림으로 표현한 것입니다.

GL_LINES 는 개개의 선분을 그리는 방법으로 각 선분마다 두 개의 정점이 필요합니다.

GL_LINE_LOOP 는 연결된 선분을 그리는 방법으로 선분의 끝점이 다음 선분의 시작점이 되고 마지막 점이 제일 처음 선분의 시작점과 연결됩니다.

GL_LINE_STRIP 도 연결된 선분을 그리는 방법으로 선분의 끝점이 다음 선분의 시작점이 되지만 마지막 점이 제일 처음 선분의 시작점과 연결되지는 않습니다.

그럼 위의 세 가지 방법에 따라 선분을 그려보겠습니다. 우선 정점을 아래와 같이 정의합니다.

GLfloat pointsForGL_LINES[] = {  
    0.2, 0.2, 0.0,  
    0.8, 0.2, 0.0,  
    0.2, 0.8, 0.0,  
    0.8, 0.8, 0.0,  
};

그리고 renderView 메서드를 아래와 같이 수정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_LINES);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 여러 선분을 그린다. 처리할 정점의 개수는 4개  
        glDrawArrays(GL_LINES, 0, 4);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드하고 실행하면 아래와 같이 두 개의 선분이 그려진 화면을 볼 수 있습니다.

GLfloat pointsForGL_LINE_LOOP[] = {  
    0.2, 0.2, 0.0,   //v1  
    0.8, 0.2, 0.0,   //v2  
    0.8, 0.8, 0.0,   //v3  
    0.2, 0.8, 0.0,   //v4  
};

그리고 renderView를 아래와 같이 수정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_LINE_LOOP);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 사각형을 그린다. 처리할 정점의 개수는 4개  
        glDrawArrays(GL_LINE_LOOP, 0, 4);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드하고 실행하면 아래와 같이 사각형이 그려진 화면을 볼 수 있습니다. 결과 화면을 보면 v4와 v1이 연결된 것을 확인할 수 있습니다.

이제 GL_LINE_STRIP을 이용해 역Z자를 그려보겠습니다. 아래와 같이 정점을 설정합니다.

GLfloat pointsForGL_LINE_STRIP[] = {  
    0.2, 0.2, 0.0,  //v1  
    0.8, 0.2, 0.0,  //v2  
    0.2, 0.8, 0.0,  //v3  
    0.8, 0.8, 0.0,  //v4  
};

그리고 renderView를 아래와 같이 수정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_LINE_STRIP);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 역Z를 그린다. 처리할 정점의 개수는 4개  
        glDrawArrays(GL_LINE_STRIP, 0, 4);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드하고 실행하면 아래와 같이 역Z자가 그려진 화면을 볼 수 있습니다.

GL_LINE_LOOP와 GL_LINE_STRIP의 차이점이 궁금하신 분은 renderView를 아래와 같이 설정하고 실행해 보세요.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_LINE_LOOP);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 역ㄷ자를 그린다 처리할 정점의 개수는 4개  
        glDrawArrays(GL_LINE_STRIP, 0, 4);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

선분은 모두 그려 보았으니 이제 삼각형을 그려보겠습니다. 삼각형을 그리는 방법에는 GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN 이 있습니다. 아래는 각 방법을 그림으로 표현한 것입니다.

GL_TRIANGLES 는 한 삼각형을 그릴 때마다 3개의 정점이 필요합니다. 따라서 2개의 삼각형을 그리면 6개의 정점이 필요합니다.

GL_TRIANGLE_STRIP은 첫 삼각형을 그릴 때는 3개의 정점이 필요하지만 다음 삼각형을 그릴 때에는 한 개의 정점만 필요합니다. 이전 삼각형의 마지막 정점 두 개를 재 사용하기 때문입니다. 예를 들어 v1, v2, v3 로 삼각형을 그린 후 새로운 정점 v4를 추가하면 v2, v3, v4 로 삼각형이 그려집니다.

GL_TRIANGLE_FAN은 GL_TRIANGLE_STRIP과 비슷하지만 이전 삼각형의 두 점을 재 사용하는 것이 아니라 항상 첫 삼각형의 시작 정점 한 개와 이전 삼각형의 마지막 정점을 재사용합니다. 예를 들어 v1, v2, v3 로 삼각형을 그린 후 새로운 정점 v4를 추가하면 v1, v3, v4로 삼각형이 그려집니다. 여기에 다시 v5를 추가하면 v1, v4, v5로 삼각형이 그려집니다.

우선 GL_TRIANGLES로 두 개의 삼각형을 그려보겠습니다. 두 개를 그리는 것이므로 6개의 정점이 필요합니다. 아래와 같이 정점을 선언합니다.

GLfloat pointsForGL_TRIANGLES[] = {  
    0.2, 0.2, 0.0,  //v1  
    0.8, 0.2, 0.0,  //v2  
    0.8, 0.8, 0.0,  //v3  

    0.2, 0.3, 0.0,  //v4  
    0.8, 0.9, 0.0,  //v5  
    0.2, 0.9, 0.0,  //v6  
};

그리고 renderView를 아래와 같이 수정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_TRIANGLES);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 삼각형 두개를 그린다. 처리할 정점의 개수는 6개  
        glDrawArrays(GL_TRIANGLES, 0, 6);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드 후 실행하면 아래와 같은 화면을 볼 수 있습니다.

이제 GL_TRIANGLE_STRIP으로 두개의 삼각형을 그려보겠습니다. 우선 정점을 설정합니다.

GLfloat pointsForGL_TRIANGLE_STRIP[] = {  
    0.2, 0.8, 0.0,  //v1  
    0.2, 0.2, 0.0,  //v2  
    0.8, 0.8, 0.0,  //v3  
    0.8, 0.2, 0.0,  //v4  
};

그리고 renderView를 아래와 같이 설정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_TRIANGLE_STRIP);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 삼각형 두개를 그린다. 처리할 정점의 개수는 4개  
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드 후 실행하면 아래와 같은 화면을 볼 수 있습니다. 결과는 사각형이지만 삼각형 두 개가 모여 사각형으로 표현된 것입니다.

이제 GL_TRIANGLE_FAN으로 여러 삼각형을 그려보겠습니다. 아래와 같이 정점을 설정합니다.

GLfloat pointsForGL_TRIANGLE_FAN[] = {  
    0.2, 0.8, 0.0,  //v1  
    0.2, 0.2, 0.0,  //v2  
    0.8, 0.2, 0.0,  //v3  
    0.8, 0.8, 0.0,  //v4  
    0.8, 1.0, 0.0,  //v5  
};

그리고 renderView를 아래와 같이 수정합니다.

-(void)renderView  
{  
    //: 배경을 검은색으로 지운다  
    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  

    //: 행렬 모드는 모델뷰 행렬로 변경한다  
    glMatrixMode(GL_MODELVIEW);  
    //: 모델뷰 행렬을 초기화한다  
    glLoadIdentity();  

    //: 정점배열을 설정한다  
    glVertexPointer(3, GL_FLOAT, 0, pointsForGL_TRIANGLE_FAN);  
    glEnableClientState(GL_VERTEX_ARRAY);  
    {  
        //: 색상을 설정한다  
        glColor4f(1.0, 1.0, 1.0, 1.0);  
        //: 삼각형 3개를 그린다. 처리할 정점의 개수는 5개  
        glDrawArrays(GL_TRIANGLE_FAN, 0, 5);  
    }  
    glDisableClientState(GL_VERTEX_ARRAY);  
}

빌드 후 실행하면 아래와 같은 화면을 볼 수 있습니다.

OpenGL에는 사각형을 그리는 GL_QUADS 및 GL_QUAD_STRIP 모드가 있지만 OpenGL|ES에는 없습니다. 따라서 사각형을 그리려면 GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN을 사용해야 합니다. 위에서 살펴 보았듯이 삼각형을 이용해 사각형을 그리는 것은 어려운 일이 아닙니다. 이번 튜토리얼은 여기서 마치겠습니다. ^^

소스코드