반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

폴크(FOLC)

MFC - C++ 환경에서 OpenGL 이용하기 본문

카테고리 없음

MFC - C++ 환경에서 OpenGL 이용하기

folcjin 2025. 4. 26. 11:25
728x90
반응형

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로 표시됩니다.
이후에는 카메라 이동, 마우스 회전, 컬러 넣기 같은 걸 추가할 수 있습니다.

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --