프로그래밍/컴퓨터그래픽스

OpenGL 기본 출력 객체 속성 정리

studylida 2025. 4. 4. 21:57

🎯 점(Point)의 속성

✅ 속성: 색상, 크기

🔧 관련 함수

  • glColor*() → 색상 지정 (RGB 또는 RGBA)
  • glPointSize(float size) → 점 크기 지정

🎨 glColor*() 함수 형식

OpenGL에서는 다양한 형태의 glColor 함수가 제공되며, 아래와 같이 구조를 가지고 있습니다:

glColor[3/4][i/s/f/d][v]()
  • [3/4]: RGB 또는 RGBA (3요소 or 4요소)
  • [i/s/f/d]: 데이터 타입 (정수, short, float, double)
  • [v]: 벡터 형태로 배열을 전달할 경우 붙임 (예: glColor3fv)

예시:

  • glColor3f(1.0f, 0.0f, 0.0f) → RGB 색상 직접 지정
  • glColor4f(0.0f, 1.0f, 0.0f, 0.5f) → RGBA (반투명 초록)
  • glColor3fv(array)float array[3] = {1.0f, 1.0f, 0.0f}; 같은 배열 전달

🧩 예제 코드

		// Set point attributes
		glColor3f(1.0f, 0.0f, 0.0f);
		glPointSize(15.0f);

		// Draw points
		glBegin(GL_POINTS);
		glVertex2i(150, 200);
		glVertex2i(350, 200);
		glVertex2i(250, 350);
		glEnd();

		// Set point attributes
		glColor3f(0.0, 1.0, 0.0);
		glPointSize(30.0f);

		// Draw points
		glBegin(GL_POINTS);
		glVertex2i(150, 300);
		glVertex2i(250, 150);
		glVertex2i(350, 300);
		glEnd();


🌈 정점 색상 보간 (Color Interpolation)

OpenGL에서는 도형의 꼭짓점마다 서로 다른 색상을 지정하면, 그 사이 영역의 색이 자동으로 부드럽게 섞여 출력됩니다. 이 현상을 색상 보간(Color Interpolation) 또는 Gouraud Shading이라고 합니다.

이 기능을 활용하면 삼각형이나 사각형 안에 그래디언트(Gradient) 효과를 줄 수 있습니다.

🧩 예제 코드

void drawGradientTriangle(float x1, float y1, float x2, float y2, float x3, float y3) {
    glBegin(GL_TRIANGLES);

    glColor3f(1.0f, 0.0f, 0.0f); // 왼쪽 꼭짓점 (진한 빨간색)
    glVertex2f(x1, y1);

    glColor3f(1.0f, 0.5f, 0.5f); // 오른쪽 꼭짓점 (연한 빨간색)
    glVertex2f(x2, y2);

    glColor3f(1.0f, 0.8f, 0.8f); // 위쪽 꼭짓점 (더 연한 빨간색)
    glVertex2f(x3, y3);

    glEnd();
}

 

💡 결과

  • 세 꼭짓점에 각각 다른 빨간 계열 색상을 주었기 때문에, 삼각형 내부는 자동으로 색이 부드럽게 섞여 그래디언트 효과를 갖게 됩니다.

✅ 정리

  • 각 정점마다 색상을 다르게 설정하면 OpenGL이 내부에서 선형 보간(linear interpolation)을 수행하여 자연스러운 색상 변화를 만들어냅니다.
  • 복잡한 셰이더 없이도 시각적으로 풍부한 표현이 가능합니다.

📏 선(Line)의 속성

✅ 속성: 색상, 두께, 스타일(패턴)

🔧 관련 함수

  • glColor*() → 선 색상
  • glLineWidth(float width) → 선 두께 지정
  • glEnable(GL_LINE_STIPPLE) / glDisable(GL_LINE_STIPPLE)
  • glLineStipple(repeat, pattern) → 선 패턴 설정

💡 설명

선은 일반 실선뿐만 아니라, 점선, 대시선 등 다양한 스타일로 표현할 수 있습니다. glLineStipple() 함수는 16비트 패턴을 반복하여 선의 스타일을 설정합니다.

  • pattern: 16비트의 on/off 비트 마스크 (예: 0xF0F0 → 1111000011110000)
  • repeat: 각 비트를 몇 픽셀 단위로 반복할지 지정
    • repeat 값을 늘리면 패턴이 늘어나서 점선/대시의 길이가 길어집니다.

예: glLineStipple(1, 0xF0F0) → 짧은 점선, glLineStipple(5, 0xF0F0) → 더 긴 점선

🧩 예제 코드

		// Set line attributes
		glColor3f(1.0f, 1.0f, 1.0f);
		glLineWidth(5.0f);

		// Draw a triangle with solid line.
		glBegin(GL_LINE_LOOP);
		glVertex2i(150, 200);
		glVertex2i(350, 200);
		glVertex2i(250, 350);
		glEnd();

		glEnable(GL_LINE_STIPPLE);
		glLineStipple(5, 0xf0f0);
		//// Draw a triangle with dot-line.
		glBegin(GL_LINE_LOOP);
		glVertex2i(150, 300);
		glVertex2i(250, 150);
		glVertex2i(350, 300);
		glEnd();
		glDisable(GL_LINE_STIPPLE);


🔺 다각형(Polygon)의 속성

✅ 속성: 색상, 채우기 스타일, 채우기 패턴

🔧 관련 함수

  • glColor*() → 도형 색상
  • glPolygonMode(face, style) → 면의 채우기 방식 지정
  • glEnable(GL_POLYGON_STIPPLE) / glDisable(GL_POLYGON_STIPPLE)
  • glPolygonStipple(pattern) → 채우기 패턴 설정 (32x32 비트맵)

💡 설명

glPolygonMode(face, style)

  • face: 적용할 면의 종류 (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK)
  • style: 채우기 방식
    • GL_POINT: 꼭짓점만 그림
    • GL_LINE: 외곽선만 그림
    • GL_FILL: 내부를 채움 (기본값)

glPolygonStipple()

  • 32x32 크기의 비트맵 배열을 사용해 패턴 채우기 설정
  • glEnable(GL_POLYGON_STIPPLE)로 기능 활성화 필요

🧩 예제 코드

		glColor3f(1.0f, 0.0f, 0.0f);
		glPolygonMode(GL_FRONT, GL_FILL);
		glPolygonMode(GL_BACK, GL_LINE);

		// Draw a triangle
		glBegin(GL_TRIANGLES);
		glVertex2i(150, 200);
		glVertex2i(350, 200);
		glVertex2i(250, 350);
		glEnd();

		// Draw a triangle
		glBegin(GL_TRIANGLES);
		glVertex2i(150, 300);
		glVertex2i(350, 300);
		glVertex2i(250, 150);
		glEnd();

		glColor3f(1.0f, 1.0f, 1.0f);
		glEnable(GL_POLYGON_STIPPLE);
		GLubyte fly[] = {
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60,
			0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20,
			0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,
			0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22,
			0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
			0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
			0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
			0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC,
			0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,
			0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0,
			0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0,
			0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,
			0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08,
			0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08,
			0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08 };

		glPolygonStipple(fly);
		// Draw a triangle with dot-line.
		glBegin(GL_TRIANGLES);
		glVertex2i(150, 300);
		glVertex2i(250, 150);
		glVertex2i(350, 300);
		glEnd();
		glDisable(GL_POLYGON_STIPPLE);


🧩 기타 OpenGL 상태 변수

OpenGL에서 객체 속성 외에도 다양한 상태 변수(state variable)를 사용합니다. 이 값들은 명시적으로 설정하지 않으면 디폴트 상태로 유지됩니다.

  • 모델뷰 행렬 (ModelView Matrix): 객체의 위치, 회전, 스케일을 담당
  • 투영 행렬 (Projection Matrix): 카메라의 시야(Orthographic / Perspective)
  • 현재 선택된 행렬 모드: glMatrixMode(GL_MODELVIEW / GL_PROJECTION)
  • 색상 버퍼: 현재 렌더링 대상 버퍼
  • 조명(Lighting) 파라미터: 광원의 색상, 위치, 강도 등 (예: glLightfv())

예시:

// 투영 설정
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(0.0, Width, 0.0, Height);

// 모델뷰 설정
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

🌈 색상과 블렌딩(반투명)

✅ 속성: RGBA, 알파 블렌딩

🔧 관련 함수

  • glColor4f(r, g, b, a) → 알파값 포함 색상 지정
  • glEnable(GL_BLEND) / glDisable(GL_BLEND)
  • glBlendFunc(srcFactor, dstFactor) → 블렌딩 방식 설정

💡 설명

알파(α) 값은 픽셀의 투명도를 나타냅니다. 0은 완전 투명, 1은 완전 불투명입니다.
블렌딩을 활성화하고 glBlendFunc()을 설정하면, 픽셀의 색상이 배경과 섞여 부드러운 시각 효과를 줄 수 있습니다.

📘 알파 블렌딩 매커니즘

OpenGL의 기본 알파 블렌딩 공식은 다음과 같습니다:

C = C_dest × (1 - α_src) + C_src × α_src
  • C_src: 그릴 전경 색상
  • α_src: 그릴 전경의 투명도
  • C_dest: 배경 색상

예를 들어 초록색 삼각형의 α_src가 0.5라면, 배경색과 1:1로 섞여 반투명 효과를 냅니다.

🧩 예제 코드

		// Draw a triangle with red color.
		glColor3f(1.0f, 0.0f, 0.0f);
		glBegin(GL_TRIANGLES);
		glVertex2i(150, 200);
		glVertex2i(350, 200);
		glVertex2i(250, 350);
		glEnd();

		glEnable(GL_BLEND);
		{
			//glBlendFunc(GL_ONE, GL_ZERO);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

			// Draw a triangle with green color.
			glColor4f(0.0, 1.0, 0.0, 0.7);
			glBegin(GL_TRIANGLES);
			glVertex2i(150, 300);
			glVertex2i(250, 150);
			glVertex2i(350, 300);
			glEnd();
		}
		glDisable(GL_BLEND);


🧼 안티앨리어싱 (Anti-Aliasing)

✅ 속성: 선, 점, 다각형의 부드러운 표현

🔧 관련 함수

  • glEnable(GL_LINE_SMOOTH), GL_POINT_SMOOTH, GL_POLYGON_SMOOTH
  • glEnable(GL_BLEND) 함께 사용
  • glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

💡 설명

안티앨리어싱은 도형의 계단 현상(aliasing)을 줄여 더욱 부드러운 선, 곡선, 도형을 출력할 수 있게 해줍니다. 부드러운 표현을 위해 반드시 블렌딩을 함께 활성화해야 합니다.

🧩 예제 코드

		glColor3f(1.0f, 1.0f, 1.0f);
		glLineWidth(5.0);

		glBegin(GL_LINES);
		for (double theta = 0.0; theta <= 180.0; theta += 10.0)
		{
			double x = 300 + 300 * cos(theta * 3.141592 / 180);
			double y = 300 + 300 * sin(theta * 3.141592 / 180);
			glVertex3f(300, 300.0, 0.0);
			glVertex3f(x, y, 0.0);
		}
		glEnd();

		glEnable(GL_BLEND);
		glEnable(GL_LINE_SMOOTH);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		glBegin(GL_LINES);
		for (double theta = 180.0; theta <= 360.0; theta += 10.0)
		{
			double x = 300 + 300 * cos(theta * 3.141592 / 180);
			double y = 300 + 300 * sin(theta * 3.141592 / 180);
			glVertex3f(300, 300.0, 0.0);
			glVertex3f(x, y, 0.0);
		}
		glEnd();

		glDisable(GL_LINE_SMOOTH);
		glDisable(GL_BLEND);


🧾 요약 정리

객체 속성 함수
색상, 크기 glColor*(), glPointSize()
색상, 두께, 패턴 glColor*(), glLineWidth(), glLineStipple()
다각형 색상, 채우기 스타일/패턴 glColor*(), glPolygonMode(), glPolygonStipple()
색상 버퍼 초기화 glClearColor(), glClear()
블렌딩 알파값 설정 glColor4f(), glBlendFunc(), glEnable(GL_BLEND)
안티앨리어싱 부드럽게 그리기 glEnable(GL_*_SMOOTH), glBlendFunc()
행렬 상태 모델뷰 / 투영 설정 glMatrixMode(), glLoadIdentity(), gluOrtho2D()
조명 상태 광원 속성 glLightfv(), glEnable(GL_LIGHTING)