【问题标题】:A red rectangle drawn on 2D texture disappears right after being drawn在 2D 纹理上绘制的红色矩形在绘制后立即消失
【发布时间】: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 infixed 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


【解决方案1】:

我猜你的问题与双缓冲有关。

有些设备在交换后台缓冲区时不会删除它的内容。我的建议是在开始渲染到新缓冲区之前明确清除屏幕(glClear)。这应该可以解决与多个红色矩形相关的问题。

其次,我不确定您的代码中是否发生了超出必要的缓冲区交换。请检查是否存在对交换缓冲区的其他显式或隐式调用,这可能导致显示错误的缓冲区。 (显示的最终缓冲区可能不是您在其中绘制矩形的缓冲区)。

【讨论】:

  • +1:哇,我完全错过了。缓冲区交换位于DrawRectangleOnTopOfTexture (...) 而不是OnDraw (...)。你是绝对正确的——这是否是整个绘制序列无关紧要,但如果 DrawRectangleOnTopOfTexture (...) 在多个位置被调用,那真的会搞砸了。
  • @Ramya Maithrey AAndon M.Coleman 在 wgl API 中有一种方法可以不使用双缓冲。因为当我使用 glFlush 而不是 swapBuffers(hdc,hrc) 我失去了一切。我的意思是我什至失去了我的 ogl 窗口
猜你喜欢
  • 2018-08-19
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多