游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2837|回复: 1

关于D3D初始化和24bit bitmap的显示问题

[复制链接]

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2005-4-12 14:18:00 | 显示全部楼层 |阅读模式
初始化IDirect3DDevice9时
        d3dpp.Windowed                = TRUE;
        d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat              = d3ddm.Format;
        d3dpp.BackBufferCount        = 1;
        d3dpp.BackBufferHeight        = 600;
        d3dpp.BackBufferWidth        = 800;
        d3dpp.hDeviceWindow                = g_hWnd;
        result = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                                                        D3DDEVTYPE_HAL,
                                                                        //D3DDEVTYPE_REF,//未通过改为D3DDEVTYPE_HAL
                                                                        g_hWnd,
                                                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                        &d3dpp,
                                                                        &g_pd3dDevice ) ;

屏幕设为24位色时,初始化IDirect3DDevice9失败,难道说24色下不能玩窗口模式的DX游戏?
屏幕位16位色时,初始化成功,

初始化IDirect3DSurface9时

        g_pd3dDevice->CreateOffscreenPlainSurface(Width,
                                          Height,
                                                  Format,
                                                                //D3DPOOL_DEFAULT,//未通过
                                          D3DPOOL_SCRATCH,
                                          &surface,
                                                                NULL) ;
为何使用D3DPOOL_DEFAULT无法通过,而使用D3DPOOL_SCRATCH却通过了呢?
DEFAULT不应该时系统默认设置是通用的吗?

最后在我要显示一副24位BITMAP时,(当时是16位色模式)却无法显示出来, StretchRect返回D3DERR_INVLIADCALL
        result=g_pd3dDevice->StretchRect(g_psufBackground,
                                  NULL,
                                  backbuffer,
                                  &dest,
                                  D3DTEXF_NONE);
这是render函数主体
void render(D3DCOLOR Color)
{   
        g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,Color,1.0f,0);
        result=g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backbuffer);
        result=g_pd3dDevice->StretchRect(g_psufBackground,
                                  NULL,
                                  backbuffer,
                                  NULL,
                                  D3DTEXF_NONE);
//此处result返回D3DERR_INVLIDCALL

        result=g_pd3dDevice-&gtresent(NULL,NULL,NULL,NULL);

}

不好意思,浪费空间了,所有代码如下,因为我实在无法断定问题出现在何处
#include <d3d9.h>
#include <d3dx9.h>
//#include <dxerr9.h>
#include <windows.h>
#include <string>

HINSTANCE g_hInst;
HWND        g_hWnd;
bool g_Active;

LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pd3dDevice;
LPDIRECT3DSURFACE9 g_psufBackground;

bool initWindow(HINSTANCE hInstance,int nShowCmd);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
bool initDirect3D(void);
void render(D3DCOLOR);
void cleanUp(void);
bool D3DError(HRESULT result);
LPDIRECT3DSURFACE9 getSurfaceFromBitmap(std::string filename);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
        if(!initWindow(hInstance,nShowCmd))
                return false;
        if(!initDirect3D())
                return false;
        MSG msg;
        ZeroMemory(&msg,sizeof(msg));
        g_Active=true;

        g_psufBackground=getSurfaceFromBitmap("bg.bmp");

        while(1)
        {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        if(msg.message==WM_QUIT)
                        {
                                break;
                        }
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else if(g_Active)
                {
                        render(D3DCOLOR_XRGB(0,0,255));
                }
                else
                {
                        WaitMessage();
                }
        }

        cleanUp();
        return (int)msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
//        case WM_CLOSE:
        case WM_DESTROY:
                PostQuitMessage(0);
//                return 0;
                break;
        }
        //always return default wndproc
        return DefWindowProc(hWnd,message,wParam,lParam);
}

void render(D3DCOLOR Color)
{   HRESULT result;
        RECT src;
        RECT dest;
        src.left=0;
        src.top=0;
        src.right=800;
        src.bottom=600;
        dest.left=0;
        dest.right=800;
        dest.top=0;
        dest.bottom=600;
        LPDIRECT3DSURFACE9 backbuffer=NULL;
        if(NULL==g_pd3dDevice)
                return;
        g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,Color,1.0f,0);
        result=g_pd3dDevice->GetBackBuffer(0,
                                                                0,
                                                                D3DBACKBUFFER_TYPE_MONO,
                                                                &backbuffer);
        result=g_pd3dDevice->StretchRect(g_psufBackground,
                                  NULL,
                                  backbuffer,
                                  &dest,
                                  D3DTEXF_NONE);
//此处result返回D3DERR_INVLIDCALL

        result=g_pd3dDevice->Present(NULL,NULL,NULL,NULL);

}


bool initDirect3D(void)
{
        g_pD3D=NULL;
        g_pd3dDevice=NULL;
       
        //Create Direct3D Device
        if(NULL==(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION) ) )
                return false;
        D3DDISPLAYMODE d3ddm;
        if( D3DError( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
                return false;


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

        d3dpp.Windowed                        = TRUE;
        d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat              = d3ddm.Format;
        d3dpp.BackBufferCount        = 1;
        d3dpp.BackBufferHeight        = 600;
        d3dpp.BackBufferWidth        = 800;
        d3dpp.hDeviceWindow                = g_hWnd;
       
        HRESULT result;
        result = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                                                        D3DDEVTYPE_HAL,
                                                                        //D3DDEVTYPE_REF,
                                                                        g_hWnd,
                                                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                        &d3dpp,
                                                                        &g_pd3dDevice ) ;

        //24位800x600模式下CreateDevice返回D3DERR_INVALIDCALL
        //16位1024*768模式下通过
        if(D3DError(result))                                                               
        {
                return false;
        }
        return true;
}

bool initWindow(HINSTANCE hInstance,int nShowCmd)
{
        WNDCLASSEX wcex;
        wcex.cbSize                        = sizeof(WNDCLASSEX);
        wcex.lpfnWndProc        = WNDPROC(WndProc);
        wcex.style                        = CS_HREDRAW|CS_VREDRAW;
        wcex.hInstance                = hInstance;
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszClassName        = "D3DShow";
        wcex.hCursor                = LoadCursor(NULL,IDC_ARROW);
        wcex.lpszMenuName        = NULL;
        wcex.hIcon                        = LoadIcon(hInstance, NULL);
        wcex.hIconSm                = LoadIcon(hInstance, NULL);
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;

        RegisterClassEx(&wcex);

        g_hWnd=CreateWindow(
                                                "D3DShow",
                                                "D3DShow",
                                                WS_OVERLAPPEDWINDOW,
                                                CW_USEDEFAULT,
                                                CW_USEDEFAULT,
                                                800,
                                                600,
                                                NULL,
                                                NULL,
                                                hInstance,
                                                NULL
                                                );

        if(!g_hWnd)
                return false;

        ShowWindow(g_hWnd,nShowCmd/*SW_SHOW*/);
        UpdateWindow(g_hWnd);
        return true;
}

LPDIRECT3DSURFACE9 getSurfaceFromBitmap(std::string filename)
{
        HRESULT result;
        LPDIRECT3DSURFACE9 surface=NULL;
        D3DXIMAGE_INFO imageinfo;
        result=D3DXGetImageInfoFromFile(filename.c_str(),&imageinfo);
        if (D3DError(result))
                return NULL;
        result= g_pd3dDevice->CreateOffscreenPlainSurface(imageinfo.Width,
                                          imageinfo.Height,
                                                  imageinfo.Format,
                                          //D3DFMT_X8R8G8B8,
                                                       //D3DPOOL_DEFAULT,//未通过
                                          D3DPOOL_SCRATCH,
                                          &surface,
                                                                NULL) ;
        if (D3DError(result))
                return NULL;
        result = D3DXLoadSurfaceFromFile(surface,NULL, NULL, filename.c_str(), NULL, D3DX_DEFAULT, 0, NULL);
        if (D3DError(result))
                return NULL;
        return surface;
                                                                                  
}

void cleanUp(void)
{
        if(g_pd3dDevice!=NULL)
                g_pd3dDevice->Release();
        if(g_pD3D!=NULL)
                g_pD3D->Release();
}

bool D3DError(HRESULT result)
{
        if(D3D_OK==result) return false;
        LPCTSTR str;
//        LPCTSTR str=DXGetErrorString9(result);
        switch(result)
        {
        case D3DERR_INVALIDCALL:
                str="One of the given parameters is invalid";
                break;
        case D3DERR_NOTAVAILABLE:
                str="the Device doesn't support this call";
                break;
        case D3DERR_OUTOFVIDEOMEMORY:
                str="The Video Memory haven't enough space to finish this call";
                break;
        default:
                str="Direct3D Error";
        }

        MessageBox(g_hWnd,str,"DxError",MB_OK);
        return true;
}

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-4-13 12:27:00 | 显示全部楼层

Re:关于D3D初始化和24bit bitmap的显示问题

24位时,确定桌面颜色一致都是24位,如果不行,就是你显卡问题了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-25 06:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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