[OpenGL] glBegin ( )

심주흔·2024년 4월 13일
0

컴퓨터그래픽스

목록 보기
6/7
post-thumbnail

다양한 방법으로 정점을 잇는 도형을 그려봅시다.

🫔 glBegin(mode);

glVertex{234}{~~}[v] (정점 위치 정보);

🫔 소스코드

//
//  도형그리기.cpp
//  OpenGlTest
//
//  Created by 심주흔 on 2024/03/26.
//


// 맥 환경에서 실행가능합니다.
#define GL_SILENCE_DEPRECATION      //버전 오류 해결

#include <iostream>
#include <OpenGL/gl.h>
#include <OpenGl/glu.h>
#include <GLUT/glut.h>

//점들의 정점 위치를 먼저 설정해줌.
float v1[3] = {75.0, 400.0, 0.0};
float v2[3] = {150.0,100.0,0.0};
float v3[3] = {255.0, 400.0,0.0};
float v4[3] = { 300.0, 100.0,0.0 };
float v5[3] = {375.0,400.0,0.0};
float v6[3] = {450.0,100.0,0.0};



void init(void) {
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 500.0, 0.0, 500.0);
}


// 점을 그리는 코드
void draw_points() {
    glColor3f(1.0, 0.0, 0.0);

    glPointSize(4);
    glBegin(GL_POINTS);		//glBegin 과 함께 도형 그리는 설정
    glVertex3fv(v1);
    glVertex3fv(v2);
    glVertex3fv(v3);
    glVertex3fv(v4);
    glVertex3fv(v5);
    glVertex3fv(v6);

    glEnd();
}

// 선을 그리는 코드
void draw_lines() {
    glColor3f(0.0, 1.0, 0.0);
    glLineWidth(1);
    glBegin(GL_LINES);
    glVertex3fv(v1);
    glVertex3fv(v2);
    glVertex3fv(v3);
    glVertex3fv(v4);
    glVertex3fv(v5);
    glVertex3fv(v6);

    glEnd();
}


// 삼각형 fan 을 그리는 코드
void draw_trianle_fan() {
    glColor3f(0.0, 1.0, 0.0);

    glBegin(GL_TRIANGLE_FAN);
    glVertex3fv(v1);
    glVertex3fv(v2);

    glVertex3fv(v3);
    glVertex3fv(v4);
    glVertex3fv(v5);
    glVertex3fv(v6);

    glEnd();
}

// 사각형을 그리는 코드
void draw_quads() {
    glColor3f(0.0, 1.0, 0.0);

    glBegin(GL_QUADS);
    glVertex3fv(v1);
    glVertex3fv(v2);
    glVertex3fv(v4);
    glVertex3fv(v3);

    glEnd();
}

//사각형 strip 을 그리는 코드
void draw_quad_strip() {
    glColor3f(0.0, 1.0, 0.0);

    glBegin(GL_QUAD_STRIP);
    glVertex3fv(v1);
    glVertex3fv(v2);
    glVertex3fv(v3);
    glVertex3fv(v4);
    glVertex3fv(v5);
    glVertex3fv(v6);

    glEnd();
}

// 다각형을 그리는 코드
void draw_polygon() {
    glColor3f(0.0, 1.0, 0.0);

    glBegin(GL_POLYGON);
    glVertex3fv(v1);
    glVertex3fv(v2);

    glVertex3fv(v4);
    glVertex3fv(v5);
    glVertex3fv(v3);

    glEnd();
}


void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    draw_points();
    //draw_lines();
    //draw_points();
    //draw_quad_strip();
    //draw_trianle_fan();
    //draw_quads();
    //draw_quad_strip();
    //draw_polygon();
    glFlush();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(300, 300);

    
    glutCreateWindow("My First GL program");
    init();
    glutDisplayFunc(display);
    
    glutMainLoop();

    return 0;
}

🫔 헷갈리는 함수 설명

🌯 GL_TRIANGLE_FAN

연속 된 정점들을 시작점을 기준으로 연결하여 삼각형들을 그려나감. v0, v1, v2, v3, v4 로 구성 된 정점들에 대해서 v0을 기준으로 두개의 정점으로 구성 된 도형을 그림.

🌯 GL_QUAD_STRIP

연속 된 정점들을 연결하여 사각형들을 그려나감 v0, v1, v2, v3, v4 ,v5, v6, v7 로 구성된 정점들에 대해서 아래의 그림과 같은 도형을 그림.

🌯 GL_POLYGON

연속 된 정점들을 시작점을 기준으로 순서적으로 연결하여 다각형을 그림
OpenGL의 polygon 의 edge 들은 서로 교차 불가하여 Polygon 들은 convex 이어야 함.
Convex : 어떤 두 정점들이 polygon 의 안에 있으면 두 정점을 잇는 직선 역시 polygon 의 안에 있어야 함.

profile
이봐... 해보기는 했어?

0개의 댓글