游戏开发论坛

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

用D3D纹理映射不成功,屏幕一片白,什么原因?

[复制链接]

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-4-9 13:34:00 | 显示全部楼层 |阅读模式
搞不懂啊搞不懂


我运行他给的例子就行

但是复制到我工程里就不行了

  1. 头文件
  2. #pragma once

  3. #include "resource.h"
  4. template<class T>void Release(T t)
  5. {
  6.     if(t)
  7.     {
  8.         t->Release();
  9.     }
  10. }

  11. CPP
  12. #include "stdafx.h"
  13. #include "DX3.h"
  14. #include <d3dx9.h>
  15. #include "mmsystem.h"
  16. #pragma comment(lib, "d3d9.lib")
  17. #pragma comment(lib, "d3dx9.lib")
  18. #pragma comment(lib, "dxguid.lib")
  19. #pragma   comment(lib,"winmm.lib")   

  20. IDirect3DDevice9 *Device = 0;

  21. D3DXMATRIX w;

  22. IDirect3DVertexBuffer9* VB = 0;
  23. IDirect3DTexture9* Tex = 0;

  24. struct Vertex
  25. {
  26.    
  27.     Vertex(){};
  28.     Vertex(float x,float y,float z,float a,float b,float t,float u,float v)
  29.     {
  30.         _x =x;
  31.         _y=y;
  32.         _z=z;

  33.         _a=a;
  34.         _b=b;
  35.         _c=t;

  36.         _u=u;
  37.         _v=v;
  38.     }
  39.     float _x,_y,_z;
  40.     float _a,_b,_c;
  41.     float _u,_v;

  42.     static const DWORD FVF;
  43. };
  44. const DWORD Vertex::FVF = D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1;

  45. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

  46. int EnterMsgLoop( bool (*p)(float timeDelta) );

  47. bool Display(float timeDelta);

  48. int APIENTRY _tWinMain(HINSTANCE hInstance,
  49.                      HINSTANCE hPrevInstance,
  50.                      LPTSTR    lpCmdLine,
  51.                      int       nCmdShow)
  52. {
  53.    
  54.      static TCHAR szAppName[] = TEXT ("1") ;
  55.      HWND         hwnd ;
  56.    
  57.      WNDCLASS     wndclass ;

  58.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  59.      wndclass.lpfnWndProc   = WndProc ;
  60.      wndclass.cbClsExtra    = 0 ;
  61.      wndclass.cbWndExtra    = 0 ;
  62.      wndclass.hInstance     = hInstance ;
  63.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  64.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  65.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  66.      wndclass.lpszMenuName  = NULL ;
  67.      wndclass.lpszClassName = szAppName ;

  68.      if (!RegisterClass (&wndclass))
  69.      {
  70.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  71.                       szAppName, MB_ICONERROR) ;
  72.           return 0 ;
  73.      }
  74.      
  75.      hwnd = CreateWindow (szAppName,                  // window class name
  76.                           TEXT ("1"), // window caption
  77.                           WS_OVERLAPPEDWINDOW,        // window style
  78.                           CW_USEDEFAULT,              // initial x position
  79.                           CW_USEDEFAULT,              // initial y position
  80.                          640,              // initial x size
  81.                          480,              // initial y size
  82.                           NULL,                       // parent window handle
  83.                           NULL,                       // window menu handle
  84.                           hInstance,                  // program instance handle
  85.                           NULL) ;                     // creation parameters
  86.      
  87.      ShowWindow (hwnd, nCmdShow) ;
  88.      UpdateWindow (hwnd) ;


  89.     //创建D3D接口
  90.      HRESULT hr= 0;

  91.      IDirect3D9* d3d9  =0;
  92.      d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

  93.      if(!d3d9)
  94.      {
  95.          MessageBox(NULL, TEXT ("This program requires Windows NT!"),
  96.                       szAppName, MB_ICONERROR) ;
  97.      }
  98.    
  99.    

  100.     D3DCAPS9 caps;
  101.     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);

  102.     int vp = 0;
  103.     if(caps.DevCaps  & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
  104.         vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
  105.     else
  106.         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  107.    
  108.    
  109.    
  110.    
  111.         D3DPRESENT_PARAMETERS d3dpp;
  112.     d3dpp.AutoDepthStencilFormat =D3DFMT_D24S8;
  113.     d3dpp.BackBufferCount =1;
  114.     d3dpp.BackBufferFormat   =D3DFMT_A8R8G8B8;
  115.     d3dpp.BackBufferHeight =480;
  116.     d3dpp.BackBufferWidth =640;
  117.     d3dpp.EnableAutoDepthStencil  = true;
  118.     d3dpp.Flags =0;
  119.     d3dpp.FullScreen_RefreshRateInHz =D3DPRESENT_RATE_DEFAULT;
  120.     d3dpp.hDeviceWindow = hwnd;
  121.     d3dpp.MultiSampleQuality =0;
  122.     d3dpp.MultiSampleType =D3DMULTISAMPLE_NONE;
  123.     d3dpp.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE;
  124.     d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
  125.     d3dpp.Windowed = true ;

  126.    
  127.    
  128.    

  129.      hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,
  130.         D3DDEVTYPE_HAL,
  131.         hwnd,
  132.         vp,
  133.         &d3dpp,
  134.         &Device);
  135.     if(FAILED(hr))
  136.     {
  137.         
  138.         d3dpp.AutoDepthStencilFormat =D3DFMT_D16;

  139.          hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,
  140.         D3DDEVTYPE_HAL,
  141.         hwnd,
  142.         vp,
  143.         &d3dpp,
  144.         &Device);
  145.          if(FAILED(hr))
  146.          {
  147.                  MessageBox(NULL, TEXT ("创建失败!"),
  148.                       szAppName, MB_ICONERROR) ;
  149.                  return 0;
  150.          }
  151.     }
  152.     //d3d9->Release();



  153.    
  154.     Device->CreateVertexBuffer
  155.         (
  156.         6*sizeof(Vertex),
  157.         D3DUSAGE_WRITEONLY,
  158.         Vertex::FVF ,
  159.         D3DPOOL_MANAGED,
  160.         &VB,
  161.         0
  162.         );
  163.    

  164.     Vertex * v;
  165.     VB->Lock(0,0,(void**)&v,0);
  166.      v[0] = Vertex(-1.0f, -1.0f, 1.25f,/*三角形坐标*/ 0.0f,0.0f,-1.0f,/*点法线*/ 0.0f,3.0f/*纹理坐标*/);
  167.     v[1] = Vertex(-1.0f,1.0f,1.25f,0.0f,0.0f,-1.0f,0.0f,0.0f );
  168.     v[2] = Vertex( 1.0f,1.0f,1.25f,0.0f,0.0f,-1.0f,3.0f,0.0f);

  169.     // left face
  170.     v[3] = Vertex(-1.0f,-1.0f,1.25f,0.0f,0.0f,-1.0f,0.0f,3.0f);
  171.     v[4] = Vertex(1.0f,1.0f,1.25f,0.0f,0.0f,-1.0f,3.0f,0.0f );
  172.     v[5] = Vertex(1.0f,-1.0f,1.25f,0.0f,0.0f,-1.0f,3.0f,3.0f);

  173.   

  174.    
  175.     VB->Unlock();
  176.    
  177.    
  178.     D3DXCreateTextureFromFile(Device,(LPCTSTR)"a.jpg",&Tex);
  179.     Device->SetTexture (0,Tex);

  180.    
  181.     Device->SetSamplerState (0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
  182.     Device->SetSamplerState (0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
  183.     Device->SetSamplerState (0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
  184.    
  185.     Device->SetRenderState (D3DRS_LIGHTING,false);
  186.    
  187.     D3DXMATRIX proj;
  188.     D3DXMatrixPerspectiveFovLH(
  189.         &proj,
  190.         D3DX_PI* 0.5f,
  191.         640/480,
  192.         1.0f,//近投影面
  193.         1000.0f//远投影面
  194.         );
  195.     Device->SetTransform (D3DTS_PROJECTION,&proj);

  196.     EnterMsgLoop(Display);

  197.     //释放资源
  198.     Release<IDirect3DVertexBuffer9*>(VB);
  199.     Release<IDirect3DTexture9*>(Tex);
  200. }
  201. bool Display(float timeDelta)
  202. {
  203.     if(Device)
  204.     {
  205.     if( ::GetAsyncKeyState('W') & 0x8000f )
  206.         {
  207.             Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
  208.             Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
  209.         }

  210.         // set border color address mode
  211.         if( ::GetAsyncKeyState('B') & 0x8000f )
  212.         {
  213.             Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
  214.             Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
  215.             Device->SetSamplerState(0,  D3DSAMP_BORDERCOLOR, 0x000000ff);
  216.         }

  217.         // set clamp address mode
  218.         if( ::GetAsyncKeyState('C') & 0x8000f )
  219.         {
  220.             Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
  221.             Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
  222.         }

  223.         // set mirror address mode
  224.         if( ::GetAsyncKeyState('M') & 0x8000f )
  225.         {
  226.             Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
  227.             Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
  228.         }   

  229.    

  230.         Device->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0);
  231.         
  232.         Device->BeginScene();
  233.         Device->SetStreamSource(0,VB,0,sizeof(Vertex));//合并顶点资源流
  234.         Device->SetFVF(Vertex::FVF);
  235.    
  236.         
  237.    
  238.         Device->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
  239.    
  240.         
  241.         Device->EndScene();
  242.         Device->Present(0,0,0,0);
  243.     }
  244.     return true;
  245. }
  246. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  247. {
  248.    
  249.      
  250.      switch (message)
  251.      {
  252.      case WM_KEYDOWN:
  253.          if(wParam == VK_ESCAPE)
  254.              DestroyWindow(hwnd);
  255.          
  256.      case WM_DESTROY:
  257.           PostQuitMessage (0) ;
  258.           return 0 ;
  259.      }
  260.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  261. }

  262. int EnterMsgLoop( bool (*p)(float timeDelta) )
  263. {
  264.     MSG          msg ;
  265.     ZeroMemory(&msg,sizeof(MSG));
  266.     static float lastTime = (float)timeGetTime();

  267.      while (msg.message != WM_QUIT)
  268.      {
  269.          if(PeekMessage(&msg,0,0,0,PM_REMOVE))
  270.          {
  271.           TranslateMessage (&msg) ;
  272.           DispatchMessage (&msg) ;
  273.          }
  274.          else
  275.          {
  276.              float currtTime = (float)timeGetTime();
  277.              float timeDelta = (currtTime - lastTime)*0.001f;
  278.              p(timeDelta);
  279.              lastTime = currtTime;
  280.          }
  281.      }
  282.   return (int)msg.wParam ;
  283.      
  284. }

复制代码

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-4-9 14:48:00 | 显示全部楼层

Re: 用D3D纹理映射不成功,屏幕一片白,什么原因?

没人吗·····。·。··
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 14:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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