일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- compare
- digitalRead
- SERIAL
- file access
- c++
- Read
- memory
- public
- aduino
- UNO
- mfc
- APP
- Class
- Unity
- parameter
- preprocessing
- atmega328
- sensor
- inheritance
- Contour
- Encapusulation
- flutter
- Android
- Pointer
- stream
- wpf
- java
- 3D
- Barcode
- length
- Today
- Total
폴크(FOLC)
MFC - C++ 환경에서 OpenGL 이용하기 본문
MFC (Microsoft Foundation Classes) C++ 기반 프로젝트에서, OpenGL을 이용해 x, y, z 형태의 이미지 데이터를 화면에 표시하는 방법
1. 기본 개념 정리
MFC는 CView나 CWnd 기반으로 OpenGL 컨텍스트를 초기화해서 사용해야 합니다.
OpenGL은 glVertex3f(x, y, z) 같은 걸 써서 3D 좌표를 직접 화면에 그립니다.
당신이 가진 데이터가 (x, y, z) 형태라면 메쉬화해서 그릴 수도 있어요.
2. 전반적 작업 순서
MFC 프로젝트에 OpenGL 초기화
OpenGL 렌더링 컨텍스트 생성
데이터 (x, y, z 배열) 준비
OpenGL의 렌더링 함수 (OnDraw 등) 안에서 데이터 출력
윈도우 리사이즈 및 OpenGL 뷰포트 관리
3. 간단 예제
3.1. 멤버 변수 추가 (헤더 파일)
// MyOpenGLView.h
#include <gl/GL.h>
#include <gl/GLU.h>
class CMyOpenGLView : public CView
{
protected:
HGLRC m_hRC; // Rendering Context
CDC* m_pDC; // Device Context
std::vector<CPoint3D> m_points; // x,y,z 구조체 벡터
DECLARE_DYNCREATE(CMyOpenGLView)
public:
virtual void OnDraw(CDC* pDC);
virtual void OnInitialUpdate();
virtual void OnDestroy();
afx_msg void OnSize(UINT nType, int cx, int cy);
};
3.2. 초기화
cpp
void CMyOpenGLView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_pDC = GetDC();
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, // 더블버퍼
PFD_TYPE_RGBA,
24, // 24비트 색상
0, 0, 0, 0, 0, 0,
0, 0,
0, 0, 0, 0, 0,
32, // 깊이 버퍼
0, 0,
PFD_MAIN_PLANE,
0, 0, 0, 0
};
int nPixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
SetPixelFormat(m_pDC->GetSafeHdc(), nPixelFormat, &pfd);
m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
// 여기서 데이터를 채울 수 있음
m_points.push_back({0.0f, 0.0f, 0.0f});
m_points.push_back({1.0f, 0.0f, 0.0f});
m_points.push_back({1.0f, 1.0f, 0.0f});
m_points.push_back({0.0f, 1.0f, 0.0f});
// (여기서 x,y,z 데이터를 m_points에 넣으면 됨)
}
3.3. 그리기
cpp
void CMyOpenGLView::OnDraw(CDC* pDC)
{
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); // 카메라 설정
glBegin(GL_POINTS); // 점으로 그리기
for (const auto& pt : m_points)
{
glVertex3f(pt.x, pt.y, pt.z);
}
glEnd();
SwapBuffers(m_pDC->GetSafeHdc());
}
3.4. 사이즈 변경 처리
cpp
void CMyOpenGLView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (0 >= cx || 0 >= cy) return;
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
glViewport(0, 0, cx, cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
}
3.5. 소멸자 처리
cpp
void CMyOpenGLView::OnDestroy()
{
CView::OnDestroy();
if (wglGetCurrentContext() != NULL) wglMakeCurrent(NULL, NULL);
if (m_hRC != NULL) {
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
if (m_pDC != NULL) {
ReleaseDC(m_pDC);
m_pDC = NULL;
}
}
4. 추가로 참고할 점
glBegin(GL_LINES)로 하면 선,
glBegin(GL_TRIANGLES)로 하면 삼각형 면을 그릴 수 있습니다.
gluPerspective를 사용하면 3D 원근 효과를 줄 수 있어요.
만약 더 복잡한 구조 (예를 들면 메쉬나 Surface)를 그리려면
GL_TRIANGLE_STRIP, GL_QUAD_STRIP 같은 것도 고려할 수 있습니다.
요약
MFC + OpenGL 초기화가 제일 첫걸음입니다.
(x, y, z) 데이터를 glVertex3f로 찍어주면 화면에 3D로 표시됩니다.
이후에는 카메라 이동, 마우스 회전, 컬러 넣기 같은 걸 추가할 수 있습니다.