我已经构建了一个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_fRotX
,m_fRotY
,m_fPosX
等是缩放和翻译因素。我的问题是:我是否需要在每次setupScene()
来电时致电OnDraw()
?或者这可以优化吗?换句话说,是否必须在每次OnDraw()
调用时重绘多维数据集,或者只有一种方法可以执行此操作,然后仅应用转换吗?
请注意,将来setupScene()
功能会绘制出数百万个彩色点的巨大点云,因此需要尽可能优化。
答案 0 :(得分:0)
名称" setupScene"是误导。 OpenGL没有场景。 OpenGL没有型号。 OpenGL不是场景图。
OpenGL是一个愚蠢的"绘图API。它一次绘制一个点,线和三角形。在绘制完东西之后,它已经忘记了它。
所以,是的,如果你想要在绘图中进行一些更改,你必须重绘,因为,它只是一个绘图,仅此而已。没有保留的场景OpenGL可以操作。
重命名" setupScene" to" drawScene"并使用它作为名称暗示。