【发布时间】:2013-08-28 15:38:57
【问题描述】:
按照我的another question,我提供了绘制矩形的代码,如下所示:
void COpenGLControl::DrawRectangleOnTopOfTexture()
{
wglMakeCurrent(hdc, hrc);
glPushAttrib(GL_ENABLE_BIT|GL_CURRENT_BIT);
glDisable(target);
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_LINE_LOOP);
glVertex2f(RectangleToDraw.at(0),RectangleToDraw.at(1));
glVertex2f(RectangleToDraw.at(0),RectangleToDraw.at(3));
glVertex2f(RectangleToDraw.at(2),RectangleToDraw.at(3));
glVertex2f(RectangleToDraw.at(2),RectangleToDraw.at(1));
glEnd();
glPopAttrib();
SwapBuffers(hdc);
wglMakeCurrent(NULL, NULL);
}
void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glScalef(m_fZoom,m_fZoom,1.0);
setViewRectangle();
if (WantToDrawRectangle)
DrawRectangleOnTopOfTexture();
wglMakeCurrent(NULL, NULL);
}
这里的问题是:OnDraw 返回后,红色矩形消失。我的意思是,例如,当您通过按下对话框上的按钮执行fixed zoom in 或fixed zoom out 时,红色矩形会闪烁然后立即消失。
或者,当您使 OnDraw 持续运行时(例如,您以高速平移),您会得到如下结果:
肯定红色矩形会在短时间内被删除(消失),但是这条红色矩形的轨迹会显示很短的时间?
如何使当前的红色矩形在纹理上呈现,直到下一次调用 OnDraw?
另外如何使当前的红色矩形被删除为下一次调用OnDraw 时立即?
如果第二个问题很难回答,没问题请至少回答第一个问题。显然,如果用户以正常速度进行平移,则不会显示此矩形轨迹。
【问题讨论】:
-
正如 Ramya Maithreyi 指出的那样,您的缓冲区交换逻辑是非正统的。如果出现地图纹理未覆盖整个屏幕的情况,您可能需要清除颜色缓冲区。从您的另一个问题来看,部分问题是您仅使用计时器事件绘制底层纹理四边形,而每次必须重新绘制窗口时都会绘制红色方块。
-
AAndon M.Coleman 在 wgl API 中有一种方法可以不使用双缓冲。因为当我使用 glFlush 而不是 swapBuffers(hdc,hrc) 我失去了一切。
-
我的意思是我什至失去了我的 ogl 窗口。
-
您可以使用单缓冲创建上下文,但在 Windows Vista 或更高版本中无法正确绘制。
-
那我该怎么办? @Andon M.Coleman
标签: opengl dynamic drawing textures drawrect