철이의 컴노리
  • 안녕하세요!
  • 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 Tutorial

6장. 다각형 그리기

https://github.com/skyfe79/OpenGLTutorial

Previous5장. 선 그리기Next7장. 색 표현하기

Last updated 6 years ago

Was this helpful?

  • GL_POLYGON

  • GL_TRIANGLES

  • GL_QUADS

점의 집합이 선을 이루고 선의 집합이 다각형을 이루며 다각형의 집합은 다면체를 이룬다. 오늘은 2D 의 다각형을 그려보자. 다각형은 3개 이상의 정점으로 구성된다. 2개의 정점은 선을 이루고 3개의 정점은 삼각형을 이루며 4개의 정점은 사각형을 이룬다. 이 처럼 정점이 늘어나면 늘어날 수록 다각형이 그려지게 된다. OpenGL 에서는 다각형의 종류를 3 가지로 분류해 놓는다. 삼각형, 사각형, 다각형. 사각형까지만 있고 5각형 6각형 등이 없는 이유는 삼각형을 조합하면 얼마든지 우리가 원하는 다각형을 그릴 수 있기 때문이다. OpenGL 에서 삼각형을 그리려면 GL_TRIANGLES 를 사용해야하고 사각형은 GL_QUADS 그리고 다각형은 GL_POLYGON 을 사용하면 된다.

위의 그림은 삼각형을 그린 것이며 아래는 소스 코드다. 코드가 간단하므로 코드 모음은 올리지 않겠다.

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glBegin( GL_TRIANGLES );
        glVertex3f( -1.0f, -1.0f, 0.0f );
        glVertex3f(  1.0f, -1.0f, 0.0f );
        glVertex3f(  0.0f,  1.0f, 0.0f );
    glEnd();
}

연결된 삼각형을 그리려 할 때 어떻게 해야할까? 물론 6 개의 정점으로 만들 수도 있겠지만 4 개의 정점만으로도 연결된 삼각형을 만들 수 있다. 그렇게 그리는 것이 GL_TRIANGLE_STRIP 이며 아래는 이를 이용한 예제의 그림이다.

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glBegin( GL_TRIANGLE_STRIP );
        glVertex3f( -1.0f, -1.0f, 0.0f );
        glVertex3f(  1.0f, -1.0f, 0.0f );
        glVertex3f(  0.0f,  1.0f, 0.0f );
        glVertex3f(  1.0f,  0.5f, 0.0f ); // 하나의 점을 추가했다.
    glEnd();
}

GL_TRIANGLE_STRIP 처럼 연결된 삼각형을 그리지만 하나의 점을 중심으로 그려나가려면 GL_TRIANGLE_FAN 을 사용하면 된다. 아래의 그림은 이를 이용하여 그린 것이다. 위의 그림과 비교해보자.

아래의 이 예제의 소스 코드다.

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glBegin( GL_TRIANGLE_FAN );
        glVertex3f( -1.0f, -1.0f, 0.0f );
        glVertex3f(  1.0f, -1.0f, 0.0f );
        glVertex3f(  0.0f,  1.0f, 0.0f );
        glVertex3f(  1.0f,  0.5f, 0.0f ); // 하나의 점을 추가했다.
    glEnd();
}

이제 사각형을 그려보자. 사각형을 그리려면 GL_QUADS 를 사용하고 정점을 4 개 설정하면 된다.

아래는 위 예제의 소스코드다.

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glBegin( GL_QUADS );
        glVertex3f( -1.0f, -1.0f, 0.0f ); //사각형을 그리기 위해 4개의 정점을 설정한다.
        glVertex3f(  1.0f, -1.0f, 0.0f );
        glVertex3f(  1.0f,  1.0f, 0.0f );
        glVertex3f( -1.0f,  1.0f, 0.0f );
    glEnd();
}

4각형 이상의 다각형을 그리려면 GL_POLYGON 을 이용하면 된다. 다각형에는 유효한 다각형과 유효하지 않은 다각형이 있는데 선이 서로 겹쳐져서 그려지는 다각형이나 다각형내에 다각형이 들어있는 다각형은 유효하지 않은 다각형이다. GL_LINE_LOOP 와 GL_POLYGON 이 서로 비슷하게 느껴지지만 차이점이 있다. 그것은 내부가 채워지느냐 그렇지 않느냐이며 GL_LINE_LOOP 는 내부를 채우지 않고 GL_POLYGON 은 내부를 채우게 된다. 아래의 예제 실행 예는 이 차이를 보여준다.

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -6.0f);

    glBegin( GL_LINE_LOOP );
        for(int i=0; i<360; ++i)
        {
            glVertex3f( 1.0f*cos(i*(3.14152/180)), 1.0f*sin(i*(3.14152/180)), 0.0f );
        }
    glEnd();
}

void eglSubWindow::RenderGLScene(void)
{
    eglWindow::RenderGLScene();

    glTranslatef(0.0f, 0.0f, -6.0f);

    glBegin( GL_POLYGON );
        for(int i=0; i<360; ++i)
        {
            glVertex3f( 1.0f*cos(i*(3.14152/180)), 1.0f*sin(i*(3.14152/180)), 0.0f );
        }
    glEnd();
}

GL_POLYGON 으로 그려진 그림이 항상 내부가 채워지는 것은 아니다. 이는 glPolyginMode() 함수로 설정할 수가 있다.

glPolygonMode( GL_FRONT, GL_FILL ); // 앞 면을 채운다.
glPolygonMode( GL_BACK, GL_LINE); // 뒷면은 선으로 이어진 다각형을 그린다.

이 함수의 적용은 직접 실행해 보길 바란다.