游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2954|回复: 7

以MFC的SDI去??D3D的程式

[复制链接]

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
发表于 2007-7-17 15:35:00 | 显示全部楼层 |阅读模式
以MFC的SDI去??D3D的程式,???改?View的尺寸?r,模型也????黄鸶淖?大小,???要如何修改?

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2007-7-17 16:17:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

用Reset()函数,放在WM_SIZE.
DX不像GL,用Reset()还要停用COM对象。

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2007-7-17 19:45:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

你是指device的reset??我加了以下的Code在OnSize的函式下,但是?面?成黑白的

        D3DCAPS9 caps;
        m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

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

        // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

        //#define _USE_ADAPTER_FORMAT_

#ifdef _USE_ADAPTER_FORMAT_
        D3DDISPLAYMODE        d3ddm;
        if(FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
                return FALSE;
#endif//_USE_ADAPTER_FORMAT_

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));

        d3dpp.BackBufferWidth            = cx;
        d3dpp.BackBufferHeight           = cy;

#ifdef _USE_ADAPTER_FORMAT_
        d3dpp.BackBufferFormat           = d3ddm.Format;
#else
        d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
#endif//_USE_ADAPTER_FORMAT_

        d3dpp.BackBufferCount            = 1;
        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality         = 0;
        d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow              = m_hWnd;
        d3dpp.Windowed                   = TRUE;
        d3dpp.EnableAutoDepthStencil     = TRUE;
        //d3dpp.EnableAutoDepthStencil     = FALSE;
        d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
        d3dpp.Flags                      = 0;
        d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

        m_pD3DDevice->Reset(&d3dpp);

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2007-7-17 19:47:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

我也??改?projective matrix?viewport,但是都失?

HRESULT hr;
        hr=m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,                               D3DCOLOR_ARGB(255,0,0,0), 1.0f, 0);
       
        m_ViewClientSize.cx=cx;
        m_ViewClientSize.cy=cy;

        D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(
                &proj,
                D3DX_PI * 0.5f, // 90 - degree
                (float)m_ViewClientSize.cx / (float)m_ViewClientSize.cy,
                1.0f,
                1000.0f);
        if (m_pD3DDevice)
                m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &proj);

        D3DVIEWPORT9 ViewPort;

        m_pD3DDevice->GetViewport(&ViewPort);

        ViewPort.Width=m_ViewClientSize.cx;
        ViewPort.Height=m_ViewClientSize.cy;

        if (m_pD3DDevice)
                m_pD3DDevice->SetViewport(&ViewPort);

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2007-7-17 19:52:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

附上我CreateDevice的Code,是不是初始化?r??档???

bool CAppDrawBase::Init3D(HWND hWnd,int width, int height,D3DDEVTYPE deviceType)
{
        m_hWnd=hWnd;
        m_nWidth=width;
        m_nHeight=height;

        m_BackBufferRect.SetRect(0,0,width,height);
        //
        // Init D3D:
        //

        HRESULT hr = 0;

        // Step 1: Create the IDirect3D9 object.

        m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

        if( !m_pD3D )
        {
                ::MessageBox(0, L"Direct3DCreate9() - FAILED", 0, 0);
                return false;
        }

        // Step 2: Check for hardware vp.

        D3DCAPS9 caps;
        m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

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

        // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

        //#define _USE_ADAPTER_FORMAT_

#ifdef _USE_ADAPTER_FORMAT_
        D3DDISPLAYMODE        d3ddm;
        if(FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
                return FALSE;
#endif//_USE_ADAPTER_FORMAT_

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));

        d3dpp.BackBufferWidth            = width;
        d3dpp.BackBufferHeight           = height;

#ifdef _USE_ADAPTER_FORMAT_
        d3dpp.BackBufferFormat           = d3ddm.Format;
#else
        d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
#endif//_USE_ADAPTER_FORMAT_

        d3dpp.BackBufferCount            = 1;
        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality         = 0;
        d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow              = hWnd;
        d3dpp.Windowed                   = TRUE;
        d3dpp.EnableAutoDepthStencil     = TRUE;
        //d3dpp.EnableAutoDepthStencil     = FALSE;
        d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
        d3dpp.Flags                      = 0;
        d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

        // Step 4: Create the device.

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

        if( FAILED(hr) )
        {
                // try again using a 16-bit depth buffer
                d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

                hr = m_pD3D->CreateDevice(
                        D3DADAPTER_DEFAULT,
                        deviceType,
                        hWnd,
                        vp,
                        &d3dpp,
                        &m_pD3DDevice);

                if( FAILED(hr) )
                {
                        m_pD3D->Release(); // done with d3d9 object
                        ::MessageBox(0, L"CreateDevice() - FAILED", 0, 0);
                        return false;
                }
        }

        //m_pD3D->Release(); // done with m_pD3D object

        //#define _ALPHA_CHANNEL_
#ifdef _ALPHA_CHANNEL_
        m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
        m_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
        m_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

        m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1,D3DTA_TEXTURE );
#endif//

        InitFPSFornt();

        m_lastTime = (float)timeGetTime();

        return true;
}

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2007-7-18 09:38:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

最重要的是要停用已用的COM对象。
比如:m_pd3dfont,m_pd3dvertexbuffer,....
用完Reset之后还要恢复之。你可以看SDK里的例子.

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-7-19 02:34:00 | 显示全部楼层

Re:以MFC的SDI去??D3D的程式

投影矩阵

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-7-19 22:52:00 | 显示全部楼层

Re: Re:以MFC的SDI去??D3D的程式

踏魔狼: Re:以MFC的SDI去??D3D的程式

最重要的是要停用已用的COM对象。
比如:m_pd3dfont,m_pd3dvertexbuffer,....
用完Reset之后还要恢复之。你可以看SDK里的例子.

vertexbuffer要看你是用什么格式创建的
是MANAGE还是默认的
如果是默认的就需要在RESET前释放掉
如果是管理或者是系统内存的则完全不需要理会
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 19:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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