🎯 점(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) 등 |
'프로그래밍 > 컴퓨터그래픽스' 카테고리의 다른 글
합성 변환과 해석 (0) | 2025.04.05 |
---|---|
어파인 변환의 해석 (0) | 2025.04.05 |
동차 좌표, 어파인 공간, 어파인 변환: 이동, 회전, 스케일, 밀림 변환 (0) | 2025.04.04 |
점, 선, 다각형을 이용한 다양한 도형 그리기 (0) | 2025.04.04 |
Hello OpenGL 예제 분석: Freeglut 기반 기초 코드 설명 (0) | 2025.04.04 |