游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3476|回复: 2

关于Direct3d 画三角形问题~求大神解决

[复制链接]

1

主题

2

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2013-9-17 23:04:44 | 显示全部楼层 |阅读模式
    求大神帮我看看是哪里出了问题,编译没出错~运行就是不出三角形~跪求大神们了
  1. /////MyDirect3d.h
  2. #pragma once
  3. //
  4. // Our custom FVF, which describes our custom vertex structure.  
  5. #define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

  6. class CMyDirect3d
  7. {
  8. public:
  9. //
  10. private:
  11.         //
  12.         HRESULT        hr;
  13.         HWND        d3dhwnd;
  14.         bool        d3dfullscreen;
  15.         //
  16.         D3DDISPLAYMODE        displayMode;
  17.         LPDIRECT3D9 d3d        ;
  18.         LPDIRECT3DDEVICE9        d3dDevice;
  19.         D3DPRESENT_PARAMETERS        d3dpp;

  20.         //
  21.         LPDIRECT3DVERTEXBUFFER9 vertexBuffer;
  22.         D3DXMATRIX World;
  23.         struct stD3DVertex
  24.         {
  25.                 float x, y, z,rhw;
  26.                 DWORD color;
  27.         };
  28. //
  29. public:
  30.         CMyDirect3d(void);
  31.         ~CMyDirect3d(void);
  32.         CMyDirect3d(HWND hwnd, bool fullscreen);
  33. //
  34.         bool Initialize();
  35.         bool RenderScreen();
  36.         bool InitializeObjects();

  37. };
复制代码
  1. ////MyDirect3d.cpp
  2. #include "stdafx.h"
  3. #include "MyDirect3d.h"


  4. CMyDirect3d::CMyDirect3d(void)
  5. {
  6. }

  7. CMyDirect3d::CMyDirect3d(HWND hwnd, bool fullscreen)
  8. {
  9.         d3dhwnd = hwnd;
  10.         d3dfullscreen = fullscreen;
  11. }

  12. CMyDirect3d::~CMyDirect3d(void)
  13. {
  14.         if(d3dDevice != NULL) d3dDevice->Release();  
  15.         if(d3d != NULL) d3d->Release();  
  16.         if(vertexBuffer != NULL) vertexBuffer->Release();

  17.         //
  18.         d3dDevice = NULL;  
  19.         d3d = NULL;
  20.         vertexBuffer = NULL;
  21.         //MessageBox(NULL, TEXT("hfaf"), TEXT("he"), 0);
  22. }
  23. //////////////////////////////////////////////////////////////////////////
  24. bool CMyDirect3d::Initialize()
  25. {
  26.         // Create the D3D object.
  27.         d3d = Direct3DCreate9(D3D_SDK_VERSION);

  28.         if (d3d == NULL)
  29.         {
  30.                 return false;
  31.         }
  32.         // Get the desktop display mode.
  33.         if (FAILED(d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
  34.         {
  35.                 return false;
  36.         }
  37.         // Set up the structure used to create the D3Device
  38.         ZeroMemory(&d3dpp, sizeof(d3dpp));
  39.         if (d3dfullscreen)
  40.         {
  41.                 d3dpp.Windowed         = FALSE;
  42.                 d3dpp.BackBufferWidth  = 640;
  43.                 d3dpp.BackBufferHeight = 480;
  44.         }
  45.         else
  46.                 d3dpp.Windowed        = TRUE;
  47.         d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
  48.         d3dpp.BackBufferFormat = displayMode.Format;
  49.         hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dhwnd,
  50.                                                         D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice);
  51.         if (FAILED(hr))
  52.         {
  53.                 DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  54.                 return false;
  55.         }
  56.         //
  57.         if (!InitializeObjects())
  58.         {
  59.                 return false;
  60.         }
  61.         return true;
  62. }//end Initialize
  63. bool CMyDirect3d::InitializeObjects()
  64. {
  65.         //ColorVertex t;
  66.         // Create the vertex buffer.
  67.         hr = d3dDevice->CreateVertexBuffer(sizeof(stD3DVertex), 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT,
  68.                                                                                 &vertexBuffer, NULL);
  69.         if (FAILED(hr))
  70.         {
  71.                 DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  72.                 return false;
  73.         }
  74.         //
  75.         stD3DVertex triangle[]=
  76.         {
  77.                 420.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0),
  78.                 420.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0),
  79.                 300.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255),
  80.         };
  81.         // Fill the vertex buffer
  82.         void* p;
  83.         hr = vertexBuffer->Lock(0, sizeof(stD3DVertex), (void**)&p, 0);
  84.         if (FAILED(hr))
  85.         {
  86.                 DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  87.                 return false;
  88.         }
  89.         memcpy(p, triangle, sizeof(stD3DVertex));
  90.         vertexBuffer->Unlock();
  91.         //
  92.         //D3DXMATRIX proj;
  93.         //D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5f, 1.3333f, 1.0f, 1000.0f);
  94.         //d3dDevice->SetTransform(D3DTS_PROJECTION, &proj);
  95.         //d3dDevice->SetRenderState(D3DRS_LIGHTING, false);
  96.         //
  97.         return true;
  98. }
  99. //
  100. bool CMyDirect3d::RenderScreen()
  101. {
  102.         // Clear the back-buffer
  103.         hr = d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET,
  104.                                         D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
  105.         if (FAILED(hr))
  106.         {
  107.                 DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  108.                 return false;
  109.         }
  110.         // Begin the screen start rendering
  111.         d3dDevice->BeginScene();
  112.                 //Render objDate
  113.                 hr = d3dDevice->SetStreamSource(0, vertexBuffer, 0, sizeof(stD3DVertex));
  114.                 if (FAILED(hr))
  115.                 {
  116.                         DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  117.                         return false;
  118.                 }
  119.                 hr = d3dDevice->SetFVF(D3DFVF_VERTEX);
  120.                 if (FAILED(hr))
  121.                 {
  122.                         DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  123.                         return false;
  124.                 }
  125.                 //D3DXMatrixTranslation(&World, -1.25f, 0.0f, 0.0f);
  126.                 //hr = d3dDevice->SetTransform(D3DTS_WORLD, &World);
  127.                 if (FAILED(hr))
  128.                 {
  129.                         DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  130.                         return false;
  131.                 }
  132.                 //hr = d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
  133.                 if (FAILED(hr))
  134.                 {
  135.                         DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  136.                         return false;
  137.                 }
  138.                 hr = d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
  139.                 if (FAILED(hr))
  140.                 {
  141.                         DXTRACE_ERR_MSGBOX(DXGetErrorStringW(hr),hr);
  142.                         return false;
  143.                 }
  144.         // End the screen stop rendering
  145.         d3dDevice->EndScene();
  146.         // Display the screen.
  147.         d3dDevice->Present(NULL, NULL, NULL, NULL);

  148.         return true;
  149. }
复制代码
  1. // DrawTriangle.cpp : 定义应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "DrawTriangle.h"
  5. #include "MyDirect3d.h"

  6. #define MAX_LOADSTRING 100

  7. // 全局变量:
  8. HINSTANCE hInst;                                                                // 当前实例
  9. TCHAR szTitle[MAX_LOADSTRING];                                        // 标题栏文本
  10. TCHAR szWindowClass[MAX_LOADSTRING];                        // 主窗口类名
  11. CMyDirect3d*        pmyd3d;

  12. // 此代码模块中包含的函数的前向声明:
  13. ATOM                                MyRegisterClass(HINSTANCE hInstance);
  14. BOOL                                InitInstance(HINSTANCE, int);
  15. LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
  16. INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);

  17. int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
  18.                                          _In_opt_ HINSTANCE hPrevInstance,
  19.                                          _In_ LPTSTR    lpCmdLine,
  20.                                          _In_ int       nCmdShow)
  21. {
  22.         UNREFERENCED_PARAMETER(hPrevInstance);
  23.         UNREFERENCED_PARAMETER(lpCmdLine);

  24.         // TODO: 在此放置代码。
  25.         MSG msg;
  26.         HACCEL hAccelTable;
  27.         ZeroMemory(&msg, sizeof(msg));
  28.         // 初始化全局字符串
  29.         LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  30.         LoadString(hInstance, IDC_DRAWTRIANGLE, szWindowClass, MAX_LOADSTRING);
  31.         MyRegisterClass(hInstance);

  32.         // 执行应用程序初始化:
  33.         if (!InitInstance (hInstance, nCmdShow))
  34.         {
  35.                 return FALSE;
  36.         }

  37.         hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DRAWTRIANGLE));

  38.         // 主消息循环:
  39.         while (GetMessage(&msg, NULL, 0, 0))
  40.         {
  41.                 if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  42.                 {
  43.                         TranslateMessage(&msg);
  44.                         DispatchMessage(&msg);
  45.                 }
  46.                 else
  47.                 {
  48.                         pmyd3d->RenderScreen();
  49.                 }
  50.         }
  51.         delete pmyd3d;

  52.         return (int) msg.wParam;
  53. }



  54. //
  55. //  函数: MyRegisterClass()
  56. //
  57. //  目的: 注册窗口类。
  58. //
  59. ATOM MyRegisterClass(HINSTANCE hInstance)
  60. {
  61.         WNDCLASSEX wcex;

  62.         wcex.cbSize = sizeof(WNDCLASSEX);

  63.         wcex.style                        = CS_HREDRAW | CS_VREDRAW;
  64.         wcex.lpfnWndProc        = WndProc;
  65.         wcex.cbClsExtra                = 0;
  66.         wcex.cbWndExtra                = 0;
  67.         wcex.hInstance                = hInstance;
  68.         wcex.hIcon                        = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DRAWTRIANGLE));
  69.         wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
  70.         wcex.hbrBackground        = NULL;
  71.         wcex.lpszMenuName        = MAKEINTRESOURCE(IDC_DRAWTRIANGLE);
  72.         wcex.lpszClassName        = szWindowClass;
  73.         wcex.hIconSm                = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  74.         return RegisterClassEx(&wcex);
  75. }

  76. //
  77. //   函数: InitInstance(HINSTANCE, int)
  78. //
  79. //   目的: 保存实例句柄并创建主窗口
  80. //
  81. //   注释:
  82. //
  83. //        在此函数中,我们在全局变量中保存实例句柄并
  84. //        创建和显示主程序窗口。
  85. //
  86. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  87. {
  88.    HWND hWnd;

  89.    hInst = hInstance; // 将实例句柄存储在全局变量中

  90.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  91.           CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, GetDesktopWindow(), NULL, hInstance, NULL);

  92.    if (!hWnd)
  93.    {
  94.           return FALSE;
  95.    }
  96.    pmyd3d = new CMyDirect3d(hWnd, false);
  97.    if (!pmyd3d->Initialize())
  98.    {
  99.            MessageBox(NULL, TEXT("ha"), TEXT("CMyDirect3d::Initialize is false"), 0);
  100.    }
  101.    ShowWindow(hWnd, nCmdShow);
  102.    UpdateWindow(hWnd);

  103.    return TRUE;
  104. }

  105. //
  106. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  107. //
  108. //  目的: 处理主窗口的消息。
  109. //
  110. //  WM_COMMAND        - 处理应用程序菜单
  111. //  WM_PAINT        - 绘制主窗口
  112. //  WM_DESTROY        - 发送退出消息并返回
  113. //
  114. //
  115. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  116. {
  117.         int wmId, wmEvent;
  118.         PAINTSTRUCT ps;
  119.         HDC hdc;

  120.         switch (message)
  121.         {
  122.         case WM_COMMAND:
  123.                 wmId    = LOWORD(wParam);
  124.                 wmEvent = HIWORD(wParam);
  125.                 // 分析菜单选择:
  126.                 switch (wmId)
  127.                 {
  128.                 case IDM_ABOUT:
  129.                         DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  130.                         break;
  131.                 case IDM_EXIT:
  132.                         DestroyWindow(hWnd);
  133.                         break;
  134.                 default:
  135.                         return DefWindowProc(hWnd, message, wParam, lParam);
  136.                 }
  137.                 break;

  138.         case WM_DESTROY:
  139.                 PostQuitMessage(0);
  140.                 return 0;
  141.                 break;
  142.         default:
  143.                 return DefWindowProc(hWnd, message, wParam, lParam);
  144.         }
  145.         return 0;
  146. }

  147. // “关于”框的消息处理程序。
  148. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  149. {
  150.         UNREFERENCED_PARAMETER(lParam);
  151.         switch (message)
  152.         {
  153.         case WM_INITDIALOG:
  154.                 return (INT_PTR)TRUE;

  155.         case WM_COMMAND:
  156.                 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  157.                 {
  158.                         EndDialog(hDlg, LOWORD(wParam));
  159.                         return (INT_PTR)TRUE;
  160.                 }
  161.                 break;
  162.         }
  163.         return (INT_PTR)FALSE;
  164. }
复制代码


13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2013-9-21 09:16:01 | 显示全部楼层
本帖最后由 书径尘 于 2013-9-21 09:22 编辑

【1】
hr = d3dDevice->CreateVertexBuffer(sizeof(stD3DVertex), 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT, &vertexBuffer, NULL);

第1个参数要改为:sizeof(stD3DVertex)*3 ,表明整个缓冲区的大小,因为你要画3个顶点

【2】
hr = vertexBuffer->Lock(0, sizeof(stD3DVertex), (void**)&p, 0);

同样只是锁定了1个顶点,省事的话可以直接填0:
hr = vertexBuffer->Lock(0, 0, (void**)&p, 0);

还有:
memcpy(p, triangle, sizeof(stD3DVertex));
这个也得改为:
memcpy(p, triangle, sizeof(triangle));

改完这些,你就能看到三角形了.

另外,给个建议,不要把演示程序写的那么复杂,应该写一个极尽简单的win32窗口初始化代码,和一个d3d的初始化代码,1个cpp文件足够了... 不要涉及无关的内容. 这样出错了,才容易查找问题。

1

主题

2

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2013-9-21 21:48:36 | 显示全部楼层
感谢这位大哥给的意见~~问题已解决~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-26 08:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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