[英]MFC and OpenGL events for drawing
我构建了一个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()
函数将绘制具有数百万个彩色点的巨大点云,因此需要尽可能对其进行优化。
名称“ setupScene”具有误导性。 OpenGL没有场景。 OpenGL没有模型。 OpenGL不是场景图。
OpenGL是一个“哑”绘图API。 它一次绘制点,线和三角形。 在绘制了一些东西之后,它已经忘记了。
因此,是的,如果要在图形中进行一些更改,则必须重绘,因为,好吧,这只是一个图形,仅此而已。 没有OpenGL可以操纵的保留场景。
因此,将“ setupScene”重命名为“ drawScene”,并将其用作恰当的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.