opengl图像刷新问题

LBJMD 2011-07-02 03:20:26
我在DrawScene()函数里画图形。用OnLButtonUp控制给DrawScene()一个信息去控制读不同的文件,然后想重绘我新读到内存的数据的图像。但是现在当鼠标左键up的时候,原始图像依旧在视区显示。我把给原始图像分配的内存释放了啊,怎么还会在画一遍呢?请帮忙分析一下。
部分代码如下:

void COpengl616View::DrawScene()
{
//为显存分配空间
int nIndex = 0;
int m_nVertexCount = 300000;
CVert* m_pVertices = new CVert[m_nVertexCount];
CCorlor* m_pCorlors = new CCorlor[m_nVertexCount];

if(m_btnisup == false)//此时鼠标左键没有up,也就是第一次显示在视区的图像
{
//读某个文件
}

else
{
//读另一个文件
}

//用顶点缓存扩展功能去画读到内存的文件
glewInit();
glGenBuffersARB( 1, &m_nVBOVertices );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );

//创建一个颜色缓冲
glGenBuffersARB( 1, &m_nVBOTexCoords );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pCorlors, GL_STATIC_DRAW_ARB );

delete []m_pVertices;
m_pVertices = NULL;
delete []m_pCorlors;
m_pCorlors = NULL;

m_isVBOCreated = true;

if(m_isVBOCreated)
{
glEnableClientState( GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,m_nVBOVertices);
glVertexPointer(3, GL_FLOAT, 0, 0); //指定vbo顶点格式
glEnableClientState( GL_COLOR_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,m_nVBOTexCoords);
glColorPointer(3, GL_FLOAT, 0, 0); //指定vbo顶点格式
glDrawArrays( GL_POINTS, 0, m_nVertexCount);
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glDeleteBuffersARB(1,&m_nVBOVertices);
glDeleteBuffersARB(1,&m_nVBOTexCoords);
}
SwapBuffers(wglGetCurrentDC());
}

delete []m_pVertices;
m_pVertices = NULL;
delete []m_pCorlors;
m_pCorlors = NULL;
每次调用的话,我都释放了内存空间,也就是上一次的数据不存在了吧,怎么还会在屏幕上有上次数据所对应的图像呢?
知道的麻烦指点一下。
...全文
348 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LBJMD 2011-07-03
  • 打赏
  • 举报
回复
谢谢xianglitian和dizuo两位的指导,这一块问题解决了,多谢两位。
LBJMD 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dizuo 的回复:]
DrawScene函数最开始出glClearColor啊。
基础问题啊。。。
[/Quote]
哦,多谢指点,我再试试。
ryfdizuo 2011-07-02
  • 打赏
  • 举报
回复
DrawScene函数最开始出glClearColor啊。
基础问题啊。。。
LBJMD 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xianglitian 的回复:]
引用 4 楼 lbjmd 的回复:

引用 3 楼 xianglitian 的回复:
你说调用了DrawScene之后第一次的图像还有?
你怎么调用的

C/C++ code

void COpengl616View::OnLButtonUp(UINT nFlags, CPoint point)
{
m_btnisup = true;
DrawScene();
CView:……
[/Quote]
那个网址是乱码,看不了,麻烦再给个可用的吧,谢谢。
LBJMD 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dizuo 的回复:]
DrawScene中需要清理帧缓存。。。
[/Quote]
怎么个清理缓存啊,还请具体指导一下。
向立天 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lbjmd 的回复:]

引用 3 楼 xianglitian 的回复:
你说调用了DrawScene之后第一次的图像还有?
你怎么调用的

C/C++ code

void COpengl616View::OnLButtonUp(UINT nFlags, CPoint point)
{
m_btnisup = true;
DrawScene();
CView::OnLButt……
[/Quote]
你这么调用......
我通常不是这么做的
这有个例子
或许你可以参考一下
http://blog.csdn.net/xianglitian/article/details/6164103̄
ryfdizuo 2011-07-02
  • 打赏
  • 举报
回复
DrawScene中需要清理帧缓存。。。
LBJMD 2011-07-02
  • 打赏
  • 举报
回复

这个图片中左边的图片是当鼠标左键up的时候调用DrawScene();画出来的。右边那边我觉得在调用DrawScene(); 时候,根据 m_btnisup = true;
应该不调用了啊,并且我每次都delete掉分配的内存了,怎么还会在右边显示一遍呢?
LBJMD 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xianglitian 的回复:]
你说调用了DrawScene之后第一次的图像还有?
你怎么调用的
[/Quote]

void COpengl616View::OnLButtonUp(UINT nFlags, CPoint point)
{
m_btnisup = true;
DrawScene();
CView::OnLButtonUp(nFlags, point);
}


向立天 2011-07-02
  • 打赏
  • 举报
回复
你说调用了DrawScene之后第一次的图像还有?
你怎么调用的
LBJMD 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]
调试一下
先看OnLButtonUp有没有执行到
然后再看看DrawScene有没有按着预想的更新
[/Quote]
调试了,数据是没有问题的,就是显示的时候,第一次显示的图像还有。我截个图,帮忙看一下吧。
向立天 2011-07-02
  • 打赏
  • 举报
回复
调试一下
先看OnLButtonUp有没有执行到
然后再看看DrawScene有没有按着预想的更新
前言 第1章OpenGL简介 1.1什么是OpenGL? 1.2一段简单的OpenGL代码 1.3OpenGL函数的语法 1.4OpenGL是个状态机 1.5OpenGL渲染管线 1.5.1显示列表 1.5.2求值器 1.5.3基于顶点的操作 1.5.4图元装配 1.5.5像素操作 1.5.6纹理装配 1.5.7光栅化 1.5.8片断操作 1.6与OpenGL相关的函数库 1.6.1包含文件 1.6.2GLUT,OpenGL实用工具包 1.7动画 1.7.1暂停刷新 1.7.2动画=重绘+交换 第2章状态管理和绘制几何物体 2.1绘图工具箱 2.1.1清除窗口 2.1.2指定颜色 2.1.3强制完成绘图操作 2.1.4坐标系统工具箱 2.2描述点、直线和多边形 2.2.1什么是点、直线和多边形? 2.2.2指定顶点 2.2.3OpenGL几何图元 2.3基本状态管理 2.4显示点、直线和多边形 2.4.1点的细节 2.4.2直线的细节 2.4.3多边形的细节 2.5法线向量 2.6顶点数组 2.6.1步骤1:启用数组 2.6.2步骤2:指定数组的数据 2.6.3步骤3:解引用和渲染 2.7缓冲区对象 2.7.1创建缓冲区对象 2.7.2激活缓冲区对象 2.7.3用数据分配和初始化缓冲区对象 2.7.4更新缓冲区对象的数据值 2.7.5清除缓冲区对象 2.7.6使用缓冲区对象存储顶点数据数据 2.8属性组 2.9关于创建多边形表面模型的一些提示 2.9.1例子:创建一个二十面体 第3章视图 3.1简介:照相机比喻 3.2.1一个简单的例子:绘制立方体 3.1.2通用的变换函数 3.2视图和模型变换 3.2.1对变换进行思考 3.2.2模型变换 3.2.3视图变换 3.3投影变换 3.3.1透视投影 …… 第4章颜色 第5章光照 第6章混合、抗锯齿、雾和多边形偏移 第7章显示列表 第8章绘制像素、位图、字体和图像 第9章纹理贴图 第10章帧缓冲区 第11章分格化和二次方程表面 第12章求值器和NURBS 第13章选择和反馈 第14章OpenGL高级技巧 第15章OpenGL着色语言 附录A操作顺序 附录B状态变量 附录COpenGL和窗口系统 附录DGLUT(OpenGL实用工具库)基础知识 附录E计算法线向量 附录F齐次坐标和变换矩阵 附录G编程提示 附录HOpenGL的不变性规则 附录IOpenGL着色语言内置的变量和函数 术语表

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧