DirectX 8.0开始,DirectDraw和Direct3D合并了,但如何使用DirectDraw呢?
DirectX sdk的文档里面已经没有DirectDraw了.
我还想和以前一样,现创建DirectDraw接口,然后QueryInterface出Direct3D接口,但是现在好像不行啊。我想达到的效果是:在memDC中创建DirectDraw,然后获得Direct3D接口,然后绘制三维图形,再把图形从memDC中选择出来,bitblt到DC上。这样就可以做一个可以绘制三维图形的画图程序了。不知道哪位知道如何实现。例子,方法,实现都可以。我下面还有一个帖子是讨论相同的问题,在OpenGL下面如何实现的。分数不是问题,要多少都可以。关键是我觉得这个技术非常有用,大家讨论一下如何阿?

解决方案 »

  1.   

    DirectDraw最高到7.0,以后不会再有了。
    你的问题,用窗口模式的DX8不就解决了?都什么年代了,还用DC拷来拷去。
      

  2.   

    Analyst() 
    窗口模式下不使用memDC,会擦除窗口内所有内容。
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnopen/html/msdn_gl6.asp
    这里有一篇介绍OpenGL下使用memDC的文章,我在调试中。
      

  3.   

    参看DX8SDK开发包后面的例子。
      

  4.   

    我看过dx8sdk directdraw+direct3d目录中的全部例子。看过dx8sdk的帮助文档关于direct3d的全部内容,里面只提到directdraw和direct3d合并了。但没说合并后如何使用directdraw.
    其实我的问题也很简单。directdraw使用的是双缓存,后台缓存上画好后,贴到前台缓存就显示在显示器上了。我需要在后台缓存-〉前台缓存之间作处理,比如指定某种颜色透明。昨天调通了OpenGL下的。OpenGL和DirectDraw的创建方法比较类似,都可以从HDC创建,这样我就可以自己做一个memDC然后建立位图让他们来画。但是Direct3D8的创建方法不需要使用HDC,所以我不知道如何使后台缓存的数据发送到我指定的缓存。
    jx
      

  5.   

    可以用ddutil.cpp和ddutil.h等文件里面的类封装.很简单,也很好用。
      

  6.   

    “我想达到的效果是:在memDC中创建DirectDraw,然后获得Direct3D接口,然后绘制三维图形,再把图形从memDC中选择出来,bitblt到DC上。这样就可以做一个可以绘制三维图形的画图程序了。”这个技术的关键问题是 render to surface 和 copy surface to DC,render to surface 比较简单:
    通过 IDirect3DDevice8.CreateRenderTarget 创建一个 Surface(IDirect3DSurface8),Lockable = TRUE, 使用 IDirect3DDevice8.SetRenderTarget 选取该 Surface 为 render 对象(pNewZStencil = IDirect3DDevice8.GetDepthStencilSurface(),
    可能需要另外的 Depth-Stencil Surface ,因为有人说不是所有的显卡驱动都可以在尺寸不同的 RenderTarget 和 DepthStencil 下工作),然后按照正常的方式 Render(BeginScene + ... + EndScene)。至于传递 copy surface to DC,由于 D3D8 不支持DDraw, 只能以下面的方式实现:调用 IDirect3DSurface8.LockRect(&lr, NULL, D3DLOCK_READONLY) 取得 lpBits, 然后通过 SetDIBits 将 lpBits 数据传给一个位图,A8R8B8G8/X8R8B8G8 的 BITMAPINFOHEADER 大概是这样的:BITMAPINFOHEADER bih;
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biWidth = desc.Width;
    bih.biHeight = desc.Height;
    bih.biPlanes = 1;
    bih.biBitCount = 32;
    bih.biCompression = BI_RGB;我比较怀疑这种方法的效率,设置 RenderTarget 为 Lockable 将增加额外开销,LockRect 和 SetDIBits 也不够快,而且是在 vedio memory 和 system memory 之间传递数据。可能把 3D 绘图程序直接建立在 IDirect3DDevice8 的窗口模式下会比较快。如果使用 Direct3D7 应该要方便一些,至少 IDirectDrawSurface7 可以直接 GetDC。
      

  7.   

    写错了“A8R8G8B8/X8R8G8B8”,抱歉
      

  8.   

    效率的确有些问题,但是在比较小的绘图工作量的情况下,可以使用。
    绘制三维图形对一般程序员来说,过于繁杂了一些,让DirectX/OpenGL和GDI协同工作可以减轻许多算法研究上的时间。