游戏开发论坛

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

帮忙看一下,谢谢了

[复制链接]

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2007-3-27 11:51:00 | 显示全部楼层 |阅读模式
我想使用光照,可是运行程序的时候三棱锥总是黑色的,请问各位高手,怎么回事?谢谢


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

//声明全局变量
LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9  g_pD3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;
   

//顶点结构
struct CUSTOMVERTEX
{
        FLOAT x,y,z;
        FLOAT nx,ny,nz;
};



//标志定点FVF
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)





//初始化D3D
HRESULT InitD3D(HWND hwnd)
{
  g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);

  D3DPRESENT_PARAMETERS d3dpp;

  ZeroMemory(&d3dpp,sizeof(d3dpp));

  d3dpp.Windowed=true;
  d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
   g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
                     D3DDEVTYPE_HAL,hwnd,
                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                   &d3dpp,&g_pD3DDevice);
     g_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
  g_pD3DDevice->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE);



  return S_OK;
}


void SetLight()
{
    D3DXVECTOR3 vecDir;
       //  创建一个平行光
      D3DLIGHT9 light;
     ZeroMemory(  & light,  sizeof (D3DLIGHT9) );
     light.Type        =  D3DLIGHT_DIRECTIONAL;     //  平行光
      light.Diffuse.r   =   0.0f ;
     light.Diffuse.g   =   1.0f ;     //  红色
      light.Diffuse.b   =   0.0f ;
     vecDir  =  D3DXVECTOR3( 10 , 10 , - 10 );     //  方向是从0,0,0指向10,10,-10
  
       D3DXVec3Normalize( (D3DXVECTOR3 * ) & light.Direction,  & vecDir );
      //  设置0号光照为此灯光参数
      g_pD3DDevice -> SetLight(  0 ,  & light );
     
      //  开启0号光照
      g_pD3DDevice -> LightEnable(  0 , TRUE );
      //  开启光照系统
      g_pD3DDevice -> SetRenderState( D3DRS_LIGHTING, TRUE );
  

}

void SetMaterial()
{
  D3DMATERIAL9 mtrl;
  ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
  mtrl.Diffuse.r=mtrl.Ambient.r=1.0f;
  mtrl.Diffuse.g=mtrl.Ambient.g=1.5f;
  mtrl.Diffuse.b=mtrl.Ambient.b=0.0f;
  mtrl.Diffuse.a=mtrl.Ambient.a=1.0f;
  mtrl.Power=0;
  g_pD3DDevice->SetMaterial(&mtrl);

}

//初始化绘图

HRESULT InitDraw()
{
        g_pD3DDevice->CreateVertexBuffer(
                12*sizeof(CUSTOMVERTEX),
                D3DUSAGE_WRITEONLY,
                D3DFVF_CUSTOMVERTEX,
                D3DPOOL_MANAGED,
                &g_pVB,NULL
                );

        CUSTOMVERTEX vertertex[]=
        {
        { 0.0f,1.0f,0.0f },      // 0
        {  1.0f, -1.0f,-0.577f },      // 2
        { -1.0f, -1.0f,-0.577f },      // 1
        { 0.0f,1.0f,0.0f },      // 0
            {  0.0f,-1.0f,1.155f  } ,      // 3
        {  1.0f, -1.0f,-0.577f },      // 2
        { 0.0f,1.0f,0.0f },      // 0
        { -1.0f, -1.0f,-0.577f },      // 1
                {  0.0f,-1.0f,1.155f  } ,      // 3
        { -1.0f, -1.0f,-0.577f },      // 1
        {  1.0f, -1.0f,-0.577f },      // 2
                {  0.0f,-1.0f,1.155f  } ,      // 3
        };
        VOID *pVertices;
        g_pVB->Lock(0,sizeof(vertertex),(void**)&pVertices,0);
        memcpy(pVertices,vertertex,sizeof(vertertex));
        g_pVB->Unlock();



        return S_OK;

}

//设置变换矩阵
void SetupMatrices()
{
    D3DXMATRIX WorldMatrix;
   D3DXMatrixRotationY(&WorldMatrix,timeGetTime()/500.0f );
   g_pD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);

   D3DXVECTOR3 position(5.0f,3.0f,-10.0f);
   D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
   D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);
   D3DXMATRIX view;
   D3DXMatrixLookAtLH(&view,&position,&targetPoint,&worldUp);
   g_pD3DDevice->SetTransform(D3DTS_VIEW,&view);

   D3DXMATRIX proj;

   D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI/4,1024/768,1.0f,100.0f);
   g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&proj);
}


//渲染

void Render()
{
   g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
   g_pD3DDevice->BeginScene();
   SetupMatrices();
   SetLight();
   SetMaterial();
   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);

}






//清除
void CleanUp()
{   

                if(NULL!=g_pVB)
   {
           g_pVB->Release();
        }

        if(NULL!=g_pD3DDevice)
   {
           g_pD3DDevice->Release();
        }

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

}







//窗口回调函数

LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
   switch(uMsg)
   {
   case WM_DESTROY:
           PostQuitMessage(0);
           break;
   }

   return DefWindowProc(hwnd,uMsg,wParam,lParam);
}












//主函数

int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,      // pointer to command line
  int nCmdShow          // show state of window
)
{
        WNDCLASS window;
        window.cbClsExtra=0;
        window.cbWndExtra=0;
        window.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
        window.hCursor=LoadCursor(NULL,IDC_ARROW);
        window.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        window.hInstance=hInstance;
        window.lpfnWndProc=WindowProc;
        window.lpszClassName="newclass";
        window.lpszMenuName=NULL;
        window.style=CS_HREDRAW|CS_VREDRAW;

        RegisterClass(&window);//注册窗口

        //创建窗口

        HWND hwnd;
        hwnd=CreateWindow("newclass",
                              "window",
                                          WS_OVERLAPPEDWINDOW,
                                          CW_USEDEFAULT,
                                          CW_USEDEFAULT,
                      CW_USEDEFAULT,
                                          CW_USEDEFAULT,
                                          NULL,
                                          NULL,
                                          hInstance,
                                          NULL);
   
             InitD3D(hwnd);
                 InitDraw();
        //SHOWWINDOW
        ShowWindow(hwnd,SW_SHOWNORMAL);
        UpdateWindow(hwnd);
        //消息循环
        MSG msg;
    while(msg.message!=WM_QUIT)
        {
                if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        Render();
                }
        }
           CleanUp();

        return msg.wParam;
}

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-3-27 14:12:00 | 显示全部楼层

Re:帮忙看一下,谢谢了

InitDraw()
{
    ......
    CUSTOMVERTEX vertertex[]=
    {
        { 0.0f,1.0f,0.0f , 0.0f , 1.0f , 0.0f,},      // 0
        {  1.0f, -1.0f,-0.577f ,1.0f, -1.0f,-0.577f ,},      // 2
        { -1.0f, -1.0f,-0.577f ,-1.0f, -1.0f,-0.577f ,},      // 1
        { 0.0f,1.0f,0.0f ,0.0f,1.0f,0.0f,},      // 0
        {  0.0f,-1.0f,1.155f ,0.0f,-1.0f,1.155f, } ,      // 3
        {  1.0f, -1.0f,-0.577f ,1.0f, -1.0f,-0.577f,},      // 2
        { 0.0f,1.0f,0.0f,0.0f,1.0f,0.0f, },      // 0
        { -1.0f, -1.0f,-0.577f,-1.0f, -1.0f,-0.577f, },      // 1
        {  0.0f,-1.0f,1.155f ,0.0f,-1.0f,1.155f, } ,      // 3
        { -1.0f, -1.0f,-0.577f ,-1.0f, -1.0f,-0.577f ,},      // 1
        {  1.0f, -1.0f,-0.577f ,1.0f, -1.0f,-0.577f,},      // 2
      {  0.0f,-1.0f,1.155f  ,0.0f,-1.0f,1.155f,} ,      // 3
      };
      ......

}

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2007-3-27 14:27:00 | 显示全部楼层

Re:帮忙看一下,谢谢了

这位大哥,为什么要对顶点赋两次一样的值?{ 0.0f,1.0f,0.0f , 0.0f , 1.0f , 0.0f,},
后面的是顶点法向量么,怎么和坐标值一样的

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-3-28 13:59:00 | 显示全部楼层

Re:帮忙看一下,谢谢了

你的金字塔中心在原点,你的法线正好可以用顶点坐标表示,我懒得给你算法线,就给你复制了一下,后面的事给法线赋值,跟踪调试就知道了。你的三角形顶点次序也不对,看一下画面很别扭。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-13 00:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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