游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2156|回复: 4

D3D Z缓冲区初始化的错误

[复制链接]

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2005-3-7 12:39:00 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////初始化//////////////////////////////////////////

        /*创建directdraw*/
                DirectDrawCreateEx(NULL,(PVOID*)&pane,IID_IDirectDraw7,NULL);
                pane->SetCooperativeLevel(GetSafeHwnd(),DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);//设置协作方式
                pane->SetDisplayMode(640,480,16,0,0);//设置显示方式               
                DDSURFACEDESC2 des;
                memset(&des,0,sizeof(des));
                des.dwSize=sizeof(des);
                des.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
                des.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_3DDEVICE;
                des.dwBackBufferCount=1;
                pane->CreateSurface(&des,&front,NULL);//创建显示表面
                des.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
                bool ret=front->GetAttachedSurface(&des.ddsCaps,&back)==D3D_OK;//取得缓冲表面


        /*初始化d3d7*/
                if(FAILED(pane->QueryInterface(IID_IDirect3D7,(LPVOID*)&d3d)))
                        return FALSE;

       
        /*Z缓冲*/
                               
        //        D3DDEVICEDESC7 ddDesc;
        //        device->GetCaps(&ddDesc);
        //        if(!(ddDesc.dpcTriCaps.dwRasterCaps&D3DPRASTERCAPS_ZBUFFERLESSHSR)){//无硬件Z缓冲区
                        lpz_buf=NULL;
                        /*创建Z缓冲区*/
                                DDSURFACEDESC2 ddsd;
                                memset(&ddsd,0,sizeof(ddsd));
                                ddsd.dwSize=sizeof(ddsd);
                                back->GetSurfaceDesc(&ddsd);
       
                                /*选择Z缓冲区像素模式*/
                                        d3d->EnumZBufferFormats(IID_IDirect3DTnLHalDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试tnl
                                        if(!zBufFind){
                                                d3d->EnumZBufferFormats(IID_IDirect3DHALDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试hal
                                                if(!zBufFind){
                                                        d3d->EnumZBufferFormats(IID_IDirect3DMMXDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试mmx
                                                        if(!zBufFind){
                                                                d3d->EnumZBufferFormats(IID_IDirect3DRGBDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试软件
                                                                if(!zBufFind){
                                                                        return FALSE;
                                                                }
                                                                else
                                                                        zbuf_format=4;}
                                                        else
                                                                zbuf_format=3;}
                                                else
                                                        zbuf_format=2;}
                                        else
                                                zbuf_format=1;                       
                               
                                        if(ddsd.ddpfPixelFormat.dwRGBBitCount!=16)
                                                return FALSE;
                                ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
                                if(zbuf_format<3)
                                        ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER|DDSCAPS_VIDEOMEMORY;
                                else
                                        ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY;

                                if(!FAILED(pane->CreateSurface(&ddsd,&lpz_buf,NULL)))
                                        if(back->AddAttachedSurface(lpz_buf)!=DD_OK){
                                                return FALSE;
                                        }
                                else{
                                        Beep(2000,2000);
                                        return FALSE;
                                }

                        /**/
        //        }
               
        /*创建D3D渲染设备*/
                if(d3d->CreateDevice(IID_IDirect3DTnLHalDevice,back,&device)!=D3D_OK)
                        if(d3d->CreateDevice(IID_IDirect3DHALDevice,back,&device)!=D3D_OK)
                                if(d3d->CreateDevice(IID_IDirect3DMMXDevice,back,&device)!=D3D_OK){
                                        d3d->CreateDevice(IID_IDirect3DRGBDevice,back,&device);
                        //                Beep(2000,2000);
                }
       
        /*设置显示屏幕*/
                D3DVIEWPORT7 view;
                view.dwX=0;
                view.dwY=0;
                view.dwWidth=640;
                view.dwHeight=480;
                view.dvMinZ=0.0f;
                view.dvMaxZ=1.0f;
                if(device->SetViewport(&view)!=D3D_OK)
                        return FALSE;

////////////////////////////////////////////////////初始化完成///////////////////////////////////////////////////


小弟我刚学D3D,由于新手想看看整个流程,所以一开始不打算用D3DFrameWork,自己先熟悉,这段代码再CDialog::OnInitxxxxx的过程中,初始化整个流程,不过在

if(!FAILED(pane->CreateSurface(&ddsd,&lpz_buf,NULL)))

这段出现错误,!FAILED检测成立了,现在Z缓冲怎么也见不起来,不知道什么与原因。

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2005-3-7 12:41:00 | 显示全部楼层

Re:D3D Z缓冲区初始化的错误

失败以后就直接进入

Beep(2000,2000);
return FALSE;

那里了

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2005-3-7 13:05:00 | 显示全部楼层

Re:D3D Z缓冲区初始化的错误

像素枚举回调代码

HRESULT WINAPI EnumZBufferFormatsCallback(DDPIXELFORMAT *pddpf,VOID *pddpfDesired){
        if(pddpf==NULL||pddpfDesired==NULL)
                return D3DENUMRET_CANCEL;


        if(pddpf->dwRGBBitCount ==((DDPIXELFORMAT*)pddpfDesired)->dwRGBBitCount ){
                memcpy(pddpfDesired,pddpf,sizeof(DDPIXELFORMAT));
                zBufFind=true;
                return D3DENUMRET_CANCEL;
        }


        return D3DENUMRET_OK;
}

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-3-7 23:18:00 | 显示全部楼层

Re:D3D Z缓冲区初始化的错误

为什么还要用d3d7?

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2005-3-8 01:42:00 | 显示全部楼层

Re: D3D Z缓冲区初始化的错误

手头上就找到以前买得d7的,反正也是玩玩,以后如果要用8,9的话,基础还是一样的把。

现在Z缓冲创建成功了,不过显示不了东西了,如果关掉z缓冲就有方块出来,不关掉就只有clear的那个填充色了,不知道是什么问题,代码还是一样 [em4]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 17:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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