游戏开发论坛

 找回密码
 立即注册
搜索
楼主: p1ayer

?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

[复制链接]

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-11-25 16:26:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

?臀铱纯丛?怎?改吧

        IDirect3D9* m_pDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION);

        if ( !m_pDirect3D9 )
        {
                return false;
        }

        D3DCAPS9 caps;
        D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
        bool windowed = true;
        m_pDirect3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

        int vp = 0;
        if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
        else
                vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;


        D3DFORMAT        Format;
        if (m_bIs565)
                Format = D3DFMT_R5G6B5;
        else
                Format = D3DFMT_X1R5G5B5;

        D3DPOOL                Pool        =        D3DPOOL_SYSTEMMEM;

        D3DPRESENT_PARAMETERS d3dpp;

        d3dpp.BackBufferWidth            = m_nDisplayWidth;  //800
        d3dpp.BackBufferHeight           = m_nDisplayHeight; //600
        d3dpp.BackBufferFormat           = Format;               
        d3dpp.BackBufferCount            = 1;
        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality         = 0;
        d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;       
d3dpp.hDeviceWindow              = m_hWnd;
        d3dpp.Windowed                   = windowed;
        d3dpp.EnableAutoDepthStencil     = true;
        d3dpp.AutoDepthStencilFormat     = D3DFMT_D16
        d3dpp.Flags                      = 0;
        d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

        int hr = m_pDirect3D9->CreateDevice(        D3DADAPTER_DEFAULT, // primary adapter
                                                                                        deviceType,                        // device type
                                                                                        m_hWnd,                                // window associated with device
                                                                                        vp,                                        // vertex processing
                                                                                        &d3dpp,                                // present parameters
                                                                                        &m_pDirect3DDevice9        // return created device
                                                                                );

        if ( FAILED(hr) )
        {
                // try again using a 16-bit depth buffer
                d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
               
                hr = m_pDirect3D9->CreateDevice(        D3DADAPTER_DEFAULT,
                                                                                        deviceType,
                                                                                        m_hWnd,
                                                                                        vp,
                                                                                        &d3dpp,
                                                                                        &m_pDirect3DDevice9
                                                                                        );

                if( FAILED(hr) )
                {
                        m_pDirect3D9->Release(); // done with d3d9 object
                        m_pDirect3D9 = NULL;
                        return false;
                }
        }

        hr =  m_pDirect3DDevice9->GetRenderTarget(  0,//        DWORD RenderTargetIndex,
                                                                                                &m_pDirect3DSurface9
                                                                                                );


//IDirectDrawSurface7* m_pSurfaceSystem (由2D先建立1份, 避免3D建立失??r, ?2D都?不出??
        if (m_pSurfaceSystem)
        {


                D3DLOCKED_RECT        D3DLockedRect;
                ZeroMemory(&D3DLockedRect, sizeof(D3DLOCKED_RECT));
                RECT                        D3DRect;
                D3DRect.left        = 0;               
                D3DRect.top                = 0;
                D3DRect.right        = m_nDisplayWidth -1;               
                D3DRect.bottom        = m_nDisplayHeight -1;

                DWORD                        dwD3DFlags        = NULL;//D3DLOCK_DISCARD;

                hr = m_pDirect3DSurface9->LockRect(&D3DLockedRect, &D3DRect, dwD3DFlags);       
               
                DDSURFACEDESC2                ddsd2;
               
                ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
                ddsd2.dwSize = sizeof(ddsd2);
                ddsd2.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_LPSURFACE |
                                    DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_CAPS;

                ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
                                           DDSCAPS_SYSTEMMEMORY;
                ddsd2.dwWidth        = m_nDisplayWidth;
                ddsd2.dwHeight        = m_nDisplayHeight;
                ddsd2.lPitch        = (LONG)D3DLockedRect.Pitch;



                void* lpSurfaceData = D3DLockedRect.pBits;
                ddsd2.lpSurface = lpSurfaceData;

                ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);

                if (m_bIs565)
                {
                        ddsd2.ddpfPixelFormat.dwFlags                = DDPF_RGB;
                        ddsd2.ddpfPixelFormat.dwRGBBitCount = 16;
                        ddsd2.ddpfPixelFormat.dwRBitMask    = 0x0000F800;
                        ddsd2.ddpfPixelFormat.dwGBitMask    = 0x000007E0;
                        ddsd2.ddpfPixelFormat.dwBBitMask    = 0x0000001F;
                }
                else
                {
                        ddsd2.ddpfPixelFormat.dwFlags                = DDPF_RGB;
                        ddsd2.ddpfPixelFormat.dwRGBBitCount = 16;
                        ddsd2.ddpfPixelFormat.dwRBitMask    = 0x00007C00;
                        ddsd2.ddpfPixelFormat.dwGBitMask    = 0x000003E0;
                        ddsd2.ddpfPixelFormat.dwBBitMask    = 0x0000001F;
                }


                LPDIRECTDRAWSURFACE7 pIDirectSurface7 = NULL;
                hr = m_pDDraw->CreateSurface(&ddsd2, &pIDirectSurface7, NULL);
                if (hr != DD_OK)
                {
                        return false;
                }
                m_pSurfaceSystem->Release();
                m_pSurfaceSystem = pIDirectSurface7;
        }

        return true;

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-11-29 11:09:00 | 显示全部楼层

Re: Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

hr = m_pDirect3DSurface9->LockRect(&D3DLockedRect, &D3DRect, dwD3DFlags);       
?]?住
那改用抓HDC呢

HDC m_hdc3d;
hr = m_pDirect3DSurface9->GetDC(&m_hdc3d);

一?邮?

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2004-11-29 11:12:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

你重写一段写过的代码可能会发现你以前写过的代码很难看
好象某某大师说过与此类似的话

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-11-29 19:05:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

重??? 怎???啊? 我是有想?是否能全部都?到D3D9上,
可是考?]到DirectShow?放在GDI+?的?D....所以?不?去

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2004-11-29 21:56:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

D3DPRESENT_PARAMETERS d3dpp;
d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
???ack才能lock哦
??值是不能lock的

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-11-30 11:15:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

3q....but....???品的FPS由70 down到 1.5 了....可能原因3D建出?淼?urface放到VRAM?, 而非我原本要的System Ram?....目前?在找?怎?改

------------------
?Q定?奚?D效能, 改用
D3DDEVTYPE deviceType = D3DDEVTYPE_REF;

2D的效能回?砹

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-30 11:47:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

啊!!!!!!!!!!!!!!!!!!!!!!!!

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2004-11-30 23:04:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

用d3d去做2d效果fps 都是2xx~4xx 左右
?下何必?猿肿约核

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-12-1 09:48:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

D3D的硬?加速
受限於VRAM的Size啊
而且D3D的RenderTarget??D
必?也都放在VRAM?
所以如果遇到VRAM只有16MB的?EVGA卡的?
你???迫使用者先升?他??的硬?只?榱?D-Game??
---
可?
3D要?的?|西?著切?Q(?窗/全?幕)?r
被3D?置扔掉了
要重新Load?重建

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2004-12-1 13:02:00 | 显示全部楼层

Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用

完了

IDirect3DSurface9:ockRect

?住中, 抓不到hdc了
IDirect3DSurface9::GetDC
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 16:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表