繁体   English   中英

MFC和OpenGL事件进行绘制

[英]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_fRotXm_fRotYm_fPosX等是缩放和转换因子。 我的问题是:是否需要在每次OnDraw()调用时都调用setupScene() 还是可以优化? 换句话说,是否必须在每个OnDraw()调用上重新绘制多维数据集,还是有一种方法只能执行一次,然后仅应用转换?

请注意,将来, setupScene()函数将绘制具有数百万个彩色点的巨大点云,因此需要尽可能对其进行优化。

名称“ setupScene”具有误导性。 OpenGL没有场景。 OpenGL没有模型。 OpenGL不是场景图。

OpenGL是一个“哑”绘图API。 它一次绘制点,线和三角形。 在绘制了一些东西之后,它已经忘记了。

因此,是的,如果要在图形中进行一些更改,则必须重绘,因为,好吧,这只是一个图形,仅此而已。 没有OpenGL可以操纵的保留场景。

因此,将“ setupScene”重命名为“ drawScene”,并将其用作恰当的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM