我已经构建了一个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);
}
我没有定义计时器。现在,我的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
等是缩放和转换因子。我的问题是:我需要在每次OnDraw()
调用时调用setupScene()
吗?或者,这可以优化吗?换句话说,是否必须在每次OnDraw()
调用时重新绘制多维数据集,或者是否有一种方法只需这样做一次,然后只应用转换?
请注意,在未来,setupScene()
函数将绘制具有数百万个彩色点的巨大点云,因此需要尽可能优化这一点。
发布于 2014-12-31 18:21:40
"setupScene“这个名字有误导性。OpenGL没有场景。OpenGL没有模型。OpenGL不是场景图。
OpenGL是一个“哑巴”绘图应用编程接口。它绘制点、线和三角形,一次绘制一个。在画了一些东西之后,它已经忘记了。
所以,是的,如果你想在绘图中发生一些变化,你必须重新绘制,因为,好吧,这只是一个绘图,仅此而已。没有OpenGL可以操纵的保留的场景。
因此,将"setupScene“重命名为"drawScene”,并按照恰当的名称使用它。
https://stackoverflow.com/questions/27713561
复制相似问题