openGL显示列表调用的问题,谢谢帮忙!!

kyanitelj 2003-08-20 02:19:35
在场景中绘制一组三维房屋,因为纹理渲染,数据库传输的问题,个人觉得当场景中房屋数目较多的时候等待时间有点让人不可忍受。

程序编写的时候是为每一个房屋创建一个显示列表,希望在每一个显示列表创建好之后不刷新现有的场景将该房屋添加到原有场景中,应该怎么做啊?

我现在用的是每创建好一个房屋就Invalidate 一次,可是还是不能一个一个的显示出来,只在所有房屋都创建完之后一次刷新全部显示出来。

请大虾指点一下,多谢!!!
...全文
98 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyanitelj 2003-09-08
  • 打赏
  • 举报
回复
谢谢各位了
bluebohe 2003-09-06
  • 打赏
  • 举报
回复
在这里假设所有的房屋都有相同的空间形状
假设你有了一个房屋的显示列表m_iRoom;
以下代码生成一个所有房屋的显示列表,之后你只要调用这个显示列表就可以了

m_iDisplayListName = glGenLists( 1 );
if( m_iDisplayListName )
glNewList( m_iDisplayListName, GL_COMPILE);
//画1000个房屋
for(i=0;i<1000;i++)//循环
{
//以下代码按照房屋的摆放对房屋进行变换
glPushMatrix();
//平移到合适位置
glTranslated(pGlyph->p.x,pGlyph->p.y,0);
//旋转到合适角度
glRotated(dRotate,0,0,1);
//将倾斜合适角度
glMultMatrixd(m);
glCallList(m_iRoom);
glPopMatrix();
}

if( m_iDisplayListName ) //生成成功
glEndList();

bluebohe 2003-09-02
  • 打赏
  • 举报
回复
我觉得你应该建立一个房屋的显示列表,然后嵌套多次调用这个显示列表完成房屋的渲染,包括缩放、平移等等
这样为所有房屋建立的显示列表只有两个(一个嵌套另一个),很方便就可以显示了
SlayerCarrier 2003-09-02
  • 打赏
  • 举报
回复
在建立一个List以后,立即调用CallList就可以绘出来了啊.不必在到OnDraw去.Invalidate又不会立即调用OnDraw(),它只会把WM_PAINT消息放到消息队列去啊,要你的函数返回才会去处理这个消息的.
kyanitelj 2003-09-01
  • 打赏
  • 举报
回复
可是我是在ondraw里面calllist啊,如果不Invalidate如何在建立好一个显示列表以后就添加房屋呢?
SlayerCarrier 2003-08-31
  • 打赏
  • 举报
回复
在建立一个List以后,立即调用CallList而且不要调用Invalidate!
MooseWOler 2003-08-27
  • 打赏
  • 举报
回复
list就象是个procedure或者说是routine
alphapaopao 2003-08-25
  • 打赏
  • 举报
回复
前期的准备造成的等待是合理的。当然你可以给出一个进度条,告诉用户耐心等待。
绘制速度太慢,需要考虑更好的方法。比如 kyanitelj 说的 LOD。

另外,我感觉 list 并不能有多大的好处。
kyanitelj 2003-08-25
  • 打赏
  • 举报
回复
另外有没有大虾做过LOD方面的工作,又可以参考的代码?谢谢了!!!
kyanitelj 2003-08-25
  • 打赏
  • 举报
回复
我就是用循环一个一个的CALLLIST啊,根本就不行,只在所有的现实列表都生成了以后才刷新一次,全部出来。glNewList(n,GL_COMPILE_AND_EXECUTE )也有用过,不行的。
kyanitelj 2003-08-25
  • 打赏
  • 举报
回复
就是因为在显示前准备好所有的现实列表等待时间太长了,感觉不能容忍阿,如果一个一个得出来,虽然场景完全刷新等待的时间还是比较长,但是在感觉上会是可容忍的
doall4u 2003-08-20
  • 打赏
  • 举报
回复
关注!!!
xuguilin 2003-08-20
  • 打赏
  • 举报
回复
应该是可以的,你可以从下面几个方面来找出错误:
1)每次Invalidate是否是调用了OnDraw,也就是是否有效了
2)每次绘制时你的坐标是否变化了,别老是在一块绘制
alphapaopao 2003-08-20
  • 打赏
  • 举报
回复
我觉得既然你使用了显示列表,那么就没有必要追求一个一个显示出来的效果。
你可以在显示之前准备好所有的显示列表,在现实的时候调用这些显示列表。
yyfzy 2003-08-20
  • 打赏
  • 举报
回复
我对显示列表也不大清楚
来听听
SlayerCarrier 2003-08-20
  • 打赏
  • 举报
回复
CallList不行吗?或者glNewList(n,GL_COMPILE_AND_EXECUTE )?
tinydrop 2003-08-20
  • 打赏
  • 举报
回复
简单用SendMessage(hWnd,WM_PAINT,0,0).

19,468

社区成员

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

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