用于绘图的MFC和OpenGL事件

时间:2014-12-30 22:35:33

标签: c++ opengl mfc point-clouds

我已经构建了一个SDI MFC应用程序,其中CView子程序正在使用OpenGL绘制一个多维数据集。此立方体由以下函数绘制:

void CglSDI3View::setupScene()
{

wglMakeCurrent(m_hDC, m_hRC);

// Clear color and depth buffer bits
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Wireframe Mode
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_QUADS);
// Front Side
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

// Back Side
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);

// Top Side

(...)

glEnd();

SwapBuffers(m_hDC);


}

我没有定义Timer。现在,我的OnDraw功能如下:

void CglSDI3View::OnDraw(CDC* /*pDC*/)
{
CglSDI3Doc* pDoc = GetDocument();

wglMakeCurrent(m_hDC, m_hRC);

glLoadIdentity();

glTranslatef(0.0f, 0.0f, -m_fZoom);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);
glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f);

setupScene();

wglMakeCurrent(NULL, NULL);

ValidateRect(NULL);
}

其中m_fRotXm_fRotYm_fPosX等是缩放和翻译因素。我的问题是:我是否需要在每次setupScene()来电时致电OnDraw()?或者这可以优化吗?换句话说,是否必须在每次OnDraw()调用时重绘多维数据集,或者只有一种方法可以执行此操作,然后仅应用转换吗?

请注意,将来setupScene()功能会绘制出数百万个彩色点的巨大点云,因此需要尽可能优化。

1 个答案:

答案 0 :(得分:0)

名称" setupScene"是误导。 OpenGL没有场景。 OpenGL没有型号。 OpenGL不是场景图。

OpenGL是一个愚蠢的"绘图API。它一次绘制一个点,线和三角形。在绘制完东西之后,它已经忘记了它。

所以,是的,如果你想要在绘图中进行一些更改,你必须重绘,因为,它只是一个绘图,仅此而已。没有保留的场景OpenGL可以操作。

重命名" setupScene" to" drawScene"并使用它作为名称暗示。