我主要需要2D方面的,如果有3D的也可以,谢谢啦!

解决方案 »

  1.   

    没人理?我自己顶!UPUPUPUPUPUPUPUPUP……
      

  2.   

    OpenGL最不怕的就是重绘,因为它有显示列表机制
      

  3.   

    如果是写游戏建议用DirectX。如果是用写2D程序我建议用纹理的方法实现要快得多。
      

  4.   

    不好意思,以前看到过在vc中控制部分重绘的,具体用法忘了,好像是从《vc技术内幕》或者《vc从入门到精通看到的》。
    向大家推荐:《vc从入门到精通》中的MiniDraw非常不错,适合各种做图形开发软件环境的朋友参考。
      

  5.   

    OPENGL处理数据时是逐顶点处理的,因此,使用OPENGL绘图的快慢主要取决于顶点的个数,而不是重不重绘的问题
    所以,你可以看到3D游戏中为什么都是很简单的地形,棱角突出的人物,就是因为过多的顶点极大的影响了游戏的速度
      

  6.   

    就象动态LOD技术就是把那些描述细节的顶点合并,从而达到快速绘制的目的
      

  7.   

    学习OPENGL或者D3D明白什么是"逐顶点",什么是"逐象素",是很重要的
      

  8.   

    如果在一个窗口中,用OpenGL画了很多物体的话,比如有球、圆柱、或者更复杂拥有很多定点的物体,那么在此前提下,移动一个非常简单的物体比如圆,此圆移动时所涉及到的所有像素都要重绘,而一般情况下,通过OnDraw()函数简单的通过重绘整个窗口来实现,那么重绘一个复杂拥有很多定点的物体将会占用很多时间(而此物体根本没有发生变化),因此控制局部的重绘显得非常重要。所以说重绘是一个独立的概念,跟全局界面的显示相关的。而不是涉及某个图形的问题。
      

  9.   

    stonecsdn(东东) 好像看到大鱼了:),能再详细一点么?
      

  10.   

    使用(具体参考msdn)
    CWnd::InvalidateRect
    void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );ParameterslpRectPoints to a CRect object or a RECT structure that contains the rectangle (in client coordinates) to be added to the update region. If lpRect is NULL, the entire client area is added to the region.bEraseSpecifies whether the background within the update region is to be erased.ResInvalidates the client area within the given rectangle by adding that rectangle to the CWnd update region. The invalidated rectangle, along with all other areas in the update region, is ed for painting when the next WM_PAINT message is sent. The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT call occurs, or until the region is validated by the ValidateRect or ValidateRgn member function.The bErase parameter specifies whether the background within the update area is to be erased when the update region is processed. If bErase is TRUE, the background is erased when the BeginPaint member function is called; if bErase is FALSE, the background remains unchanged. If bErase is TRUE for any part of the update region, the background in the entire region is erased, not just in the given part. Windows sends a WM_PAINT message whenever the CWnd update region is not empty and there are no other messages in the application queue for that window.CWnd Overview |  Class Members |  Hierarchy ChartSee Also   CWnd::BeginPaint, CWnd::ValidateRect, CWnd::ValidateRgn,::InvalidateRect
    我没用过,你试试吧。
      

  11.   

    不好意思,以前看到过在vc中控制部分重绘的,具体用法忘了,好像是从《vc技术内幕》或者《vc从入门到精通看到的》。你可以查查。
      

  12.   

    呵呵,搂主要问的是opengl还是gdi,楼上的说的是gdi中的东西,并不适用于opengl
    opengl是基于双缓冲的,一般不能只绘制部分,前后缓冲一交换,以前画的东西就统统消灭光了(如果你上一次画了一个茶壶,而这一次不画,茶壶就没了,不象gdi,只要不在茶壶上画新的东西,茶壶就一直存在),哪里还容你只重绘一部分,部分重绘只有你的显卡支持才可以(通过扩展机制支持),常规的opengl都是一刷新就统统刷新了
    opengl中要想快速绘制,首先是要避免实时运算,还有就是尽量减少要绘制的顶点的个数,尽量采用显示列表
      

  13.   

    1。在算法上首先要注重效率。
    2。在OpenGL很耗时的是渲染,建议把同类的东西一起绘出后在描绘另外一类的东西,例如空间中有许多红球和蓝球,最好是把他们分类绘制,这样虽然分类化了时间和精力,但对于速度的提高还是非常值得的。
    3。对于在视见空间中的对象要进行位置判断,界外的东西不要进行任何绘制操作,对于比较远的东西,可以用降低精度或者直接用点代替。
    4。如果有可能,自己写函数代替标准函数来进行基本图元的绘制,标准函数为了结果的正确而牺牲了速度,自己写的函数却可以缩小适用范围而提高速度。
    5。用贴图来代替大面积渲染的颜色块。
    6。适当使用显示列表。
    7。为了提高速度,牺牲程序的封装性也在所不惜,因为没有任何一个慢速的三维程序是好程序。好了,就写这么多,自己多研究一下程序结构和算法吧。
      

  14.   

    不好意思,给你个提示吧(以下是我的毕业设计的一部分):
    如果需要重绘的话,你肯定有许多OpenGL图形,将这些图形按照object组织起来,如下:CTypedPtrArray<CObArray,CGLModel*> m_GLModelArray;
    m_GLModelArray的定义是本课题设计中的核心之一,它解决了所有动态生成的原子模型的组织问题,同时也解决了原子模型的重画问题、存储问题。m_GLModelArray管理一组CGLModel(原子模型基类)派生的对象,而CGLModel和它所派生的对象都有自己的Serialize成员函数,系统通过调用读写m_GLModelArray的Add()方法存放所有的原子模型对象。原子模型父对象示例:
    class CGLModel:public CObject
    {
    public:
    float m_Color[3]; //模型颜色
    float m_RotateX; //X方向旋转参数
    float m_RotateY; //Y方向旋转参数
    float m_RotateZ; //Z方向旋转参数
    float m_ScaleX; //X方向缩放参数
    float m_ScaleY; //Y方向缩放参数
    float m_ScaleZ; //Z方向缩放参数
    UINT name; //模型的类名
    CGLMaterial Material;//模型材质参数
         CGLModel ():Material()//缺省构造函数,同时缺省构造Material成员对象
    {
    m_RotateX=0;//初始不旋转
    m_RotateY=0;
    m_RotateZ=0;
    m_ScaleX=1;//初始不缩放
    m_ScaleY=1;
    m_ScaleZ=1;
    }
    DECLARE_SERIAL(CGLModel)
    public:
    virtual void SetColor(float r,float g,float b)//设置模型颜色
    {
    ...}
    virtual void Draw(){} //对没有被选中的模型进行
    };
    原子模型对象示例:
    //*****球*****//
    class CGLSphere:public CGLModel
    {
    protected:
    float m_X,m_Y,m_Z; //球心
    float m_Radius; //半径
    CGLSphere () {}           //构造
    DECLARE_SERIAL(CGLSphere)
    public:
    CGLSphere(CGLSphere *pGLModel);
    CGLSphere(float x,float y,float z,float radius);
    virtual void Draw();
    virtual void SelectedDraw();
    void TextureDraw();
    virtual void Move(float distanceX,float distanceY,float distanceZ);
    virtual void Rotate(float Rx,float Ry,float Rz);
    virtual void Serialize(CArchive &ar);
    void Init();
    };添加新的模型到m_GLModelArray:
    CGLModel *pCGLModel;
    pCGLModel=new CGLSphere((float)m_PointOrigin.x,(float)m_PointOrigin.y,0.0f,radius);
    m_GLModelArray.Add(pGLModel);
    如果上面清楚,那么在CGLSphere中加一函数boolean IsInRect(CRect rect)判断CGLSphere是否在需要重绘的区域内(使用CRect只判断二维平面),若在区域内则重绘.具体使用如下:
       使用循环调用m_GLModelArray中每个模型的IsInRect,为true则调用其draw()重绘.CRect rect的可根据鼠标作图时的一个最大范围取得.
    因为没有时间编程,楼主试试吧!
      

  15.   

    呵呵,真不好意思,麻烦stonecsdn(东东) 老兄来up。说实在的,OpenGL和D3D绘图仅在我发贴那个月学习了两周左右,了解了一些基本原理,也就是说刚入门吧。然后就一直比较忙,这方面就暂时放下了。stonecsdn(东东) 提到的内容在我看还是说的GDI绘图(自己包含绘图函数Draw)。不过道理上也是对的,和junglesong(在黑暗中举起探索的火炬)提到的“对于在视见空间中的对象要进行位置判断,界外的东西不要进行任何绘制操作,对于比较远的东西,可以用降低精度或者直接用点代替”意思差不多,只不过OpenGl绘图中物件自我封装Draw函数,我是办不到的了。但愿新的一年里我能多空出些闲暇来,还好钻研一下3D制图技术。和大家共勉!