发布
社区首页 >问答首页 >用于绘制的MFC和OpenGL事件

用于绘制的MFC和OpenGL事件
EN

Stack Overflow用户
提问于 2014-12-31 06:35:33
回答 1查看 448关注 0票数 0

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

代码语言:javascript
代码运行次数:0
复制
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函数如下所示:

代码语言:javascript
代码运行次数:0
复制
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()函数将绘制具有数百万个彩色点的巨大点云,因此需要尽可能优化这一点。

EN

回答 1

Stack Overflow用户

发布于 2014-12-31 18:21:40

"setupScene“这个名字有误导性。OpenGL没有场景。OpenGL没有模型。OpenGL不是场景图。

OpenGL是一个“哑巴”绘图应用编程接口。它绘制点、线和三角形,一次绘制一个。在画了一些东西之后,它已经忘记了。

所以,是的,如果你想在绘图中发生一些变化,你必须重新绘制,因为,好吧,这只是一个绘图,仅此而已。没有OpenGL可以操纵的保留的场景。

因此,将"setupScene“重命名为"drawScene”,并按照恰当的名称使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27713561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档