游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1646|回复: 3

深度检测工作不正常,能帮我看看哪里有问题吗?谢谢!

[复制链接]

8

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2004-7-22 02:44:00 | 显示全部楼层 |阅读模式
图象在附件里,源程如下(VC6 DX9sdk 通过)

#include<Windows.h>
#include<d3d9.h>
#include<d3dx9.h>

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

struct CUSTOMVERTEX
{
                D3DXVECTOR3 position;
                D3DXVECTOR3 normal;
};

LPDIRECT3D9        g_pD3D = NULL;
LPDIRECT3DDEVICE9        g_pD3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9        g_pVB = NULL;


HRESULT InitD3D(HWND hWnd)
{
                g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);

                D3DDISPLAYMODE d3ddm;
                g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);

                D3DPRESENT_PARAMETERS stPresentParam;
                ZeroMemory(&stPresentParam,sizeof(stPresentParam));
                stPresentParam.Windowed=TRUE;
                stPresentParam.SwapEffect=D3DSWAPEFFECT_DISCARD;
                stPresentParam.BackBufferFormat=d3ddm.Format;

                stPresentParam.EnableAutoDepthStencil=FALSE;  // 就是这行,如果打开(TRUE)就不正常了



                stPresentParam.AutoDepthStencilFormat=D3DFMT_D16;
                g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
                                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                &stPresentParam,&g_pD3DDevice);

                g_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
                g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,TRUE);

                return S_OK;

}



HRESULT InitVB()
{
                g_pD3DDevice->CreateVertexBuffer(36*sizeof(CUSTOMVERTEX),
                                0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL);

                CUSTOMVERTEX *pVertices;

                g_pVB->Lock(0,0,(void**)&pVertices,0);
                pVertices[0].position = D3DXVECTOR3(-1.0f,1.0f,-1.0f);
                pVertices[0].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
                pVertices[1].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
                pVertices[1].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
                pVertices[2].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f);
                pVertices[2].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
                pVertices[3].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
                pVertices[3].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
                pVertices[4].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f);
                pVertices[4].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
                pVertices[5].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f);
                pVertices[5].normal   = D3DXVECTOR3(0.0f,0.0f,-1.0f);
       
                pVertices[6].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
                pVertices[6].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
                pVertices[7].position = D3DXVECTOR3( 1.0f,-1.0f,1.0f);
                pVertices[7].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
                pVertices[8].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f);
                pVertices[8].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
       
                pVertices[9].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
                pVertices[9].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
                pVertices[10].position = D3DXVECTOR3( 1.0f,1.0f,1.0f);
                pVertices[10].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
                pVertices[11].position = D3DXVECTOR3( 1.0f,-1.0f,1.0f);
                pVertices[11].normal   = D3DXVECTOR3(1.0f,0.0f,0.0f);
       
                g_pVB->Unlock();

                return S_OK;
}


void SetupMatrices()
{
                D3DXMATRIXA16 matWorld;
                D3DXMatrixIdentity(&matWorld);
                g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);

                D3DXVECTOR3 vE(5.0f,3.0f,-5.0f);
                D3DXVECTOR3 vL(0.0f,0.0f,0.0f);
                D3DXVECTOR3 vU(0.0f,1.0f,0.0f);
                D3DXMATRIXA16 matView;
                D3DXMatrixLookAtLH(&matView,&vE,&vL,&vU);
                g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);

                D3DXMATRIXA16 matProject;
                D3DXMatrixPerspectiveFovLH(&matProject,D3DX_PI/4,1.0f,1.0f,100.0f);
                g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProject);
}


void SetLights()
{
                D3DMATERIAL9 mtrl;
                ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));

                mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
                mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
                mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
                mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
       
                g_pD3DDevice->SetMaterial(&mtrl);


                D3DXVECTOR3 vecDir;

                D3DLIGHT9 light;
                ZeroMemory( &light, sizeof(D3DLIGHT9) );
                light.Type       = D3DLIGHT_DIRECTIONAL;
                light.Diffuse.r  = 0.0f;
                light.Diffuse.g  = 0.4f;
                light.Diffuse.b  = 0.0f;
                vecDir = D3DXVECTOR3(-10,0,5);
   
                D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
                light.Range       = 1000.0f;
                g_pD3DDevice->SetLight( 0, &light );
                g_pD3DDevice->LightEnable( 0, TRUE );
                g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

                D3DXVECTOR3 vecPos;
                D3DLIGHT9 light2;
                ZeroMemory(&light2,sizeof(D3DLIGHT9));
                light2.Type = D3DLIGHT_POINT;
                light2.Diffuse.r = 0.9f;
                light2.Diffuse.g = 0.0f;
                light2.Diffuse.b = 0.0f;
                light2.Position = D3DXVECTOR3(5.0f,2.0f,-3.0f);
                vecDir = D3DXVECTOR3(-10,0,10);
                D3DXVec3Normalize( (D3DXVECTOR3*)&light2.Direction, &vecDir );
                light2.Falloff = 1.0f;
                light2.Range = 100.0f;
                light2.Attenuation0 = 1.0f;
                light2.Theta = 2*D3DX_PI*5/360;
                light2.Phi = 2*D3DX_PI*50/360;

                g_pD3DDevice->SetLight(1,&light2);
                g_pD3DDevice->LightEnable(1,TRUE);
                g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);

                g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0x00202020);

}

void Render()
{
       
                g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_ARGB(0,0,0,100),1.0f,0);

                if (SUCCEEDED(g_pD3DDevice->BeginScene()))
                {

                      SetLights();
       
                      SetupMatrices();

                      g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
                      g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
                      g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);

                      g_pD3DDevice->EndScene();
                }
                g_pD3DDevice-&gtresent(NULL,NULL,NULL,NULL);
}

LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{   
                switch(msg)
                {
                case WM_DESTROY:
                                PostQuitMessage(0);
                                return 0;
                case WM_PAINT:
                                ValidateRect(hWnd,NULL);
                                return 0;
                }

                return DefWindowProc(hWnd,msg,wParam,lParam);
}


INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
                WNDCLASS MyWindow={CS_SAVEBITS,MsgProc,0L,0L,hInst,NULL,NULL,NULL,NULL,"MW"};
                RegisterClass(&MyWindow);
                HWND hWnd=CreateWindow("MW","Milk's Window",
                                WS_SIZEBOX | WS_MINIMIZEBOX | WS_OVERLAPPEDWINDOW & WS_SYSMENU,
                                100,100,400,400,GetDesktopWindow(),NULL,MyWindow.hInstance,NULL);

                InitD3D(hWnd);
                InitVB();

                ShowWindow(hWnd,SW_SHOWDEFAULT);
                UpdateWindow(hWnd);

                MSG msg;
                while (GetMessage(&msg,NULL,0,0))
                {
                                Render();               
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                }

                g_pVB->Release();
                g_pD3DDevice->Release();
                g_pD3D->Release();
       
                UnregisterClass("MW",MyWindow.hInstance );
                return 0;
}

[em24]  [em24]
sf_200472224433.jpg

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2004-7-22 03:11:00 | 显示全部楼层

Re: 深度检测工作不正常,能帮我看看哪里有问题吗?谢谢

我也不是很清楚原因,
不过你可以用这句话替换你的那句
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGETD3DCOLOR_ARGB(0,0,0,100),1.0f,0);

g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,100),1.0f,0);

看看行不行

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2004-7-22 03:16:00 | 显示全部楼层

Re: 深度检测工作不正常,能帮我看看哪里有问题吗?谢谢

晕倒,两句话,写反掉了。

8

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2004-7-22 20:59:00 | 显示全部楼层

Re:深度检测工作不正常,能帮我看看哪里有问题吗?谢谢!

多谢,原来是忘了清ZBuffer,现在可以了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 00:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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