幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5538|回复: 6

[通用编程] 为什么这样画不出四边形。。DirectX

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2010-9-12 19:58:27 | 显示全部楼层 |阅读模式
四边形。。两个三角形拼出来。。按照教程做的话没有问题是一个四边形

改了一个参数。。。就只能画出一个三角形了。。。

先上代码。。
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2010-9-12 19:58:39 | 显示全部楼层
  1. #include<d3d9.h>
  2. #include<d3dx9.h>
  3. // Direct3D object and device.
  4. LPDIRECT3D9 g_D3D = NULL;
  5. LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
  6. // 定义了一个顶点缓存对象
  7. LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
  8. // 定义场景中单个3D点的结构
  9. struct stD3DVertex
  10. {
  11.     float x, y, z, rhw;    // 点的x,y,z坐标值
  12.     unsigned long color;   // 点的颜色
  13. };
  14. // 定义顶点格式标识符,即灵活顶点格式
  15. #define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
  16. // 初始化Direct3D
  17. bool InitializeD3D(HWND hWnd, bool fullscreen)
  18. {
  19.     D3DDISPLAYMODE displayMode;
  20.     // 创建Direct3D接口对象
  21.     g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
  22.     if(g_D3D == NULL) return false;
  23.     // 获得当前显卡的显示模式
  24.     if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
  25.         return false;
  26.     // 建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息
  27.     D3DPRESENT_PARAMETERS d3dpp;
  28.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  29.     if(fullscreen)
  30.     {
  31.         d3dpp.Windowed = FALSE;
  32.         d3dpp.BackBufferWidth = 1024;
  33.         d3dpp.BackBufferHeight = 768;
  34.         //判断系统分辨率是否大于游戏所需分辨率
  35.         if ((GetSystemMetrics(SM_CXSCREEN) < 1024) || (GetSystemMetrics(SM_CYSCREEN) < 768))
  36.             MessageBox(NULL,"当前系统分辨率小于1024×768", "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
  37.     }
  38.     else
  39.         d3dpp.Windowed = TRUE;
  40.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  41.     d3dpp.BackBufferFormat = displayMode.Format;
  42.     // Create the D3DDevice
  43.     if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  44.                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
  45.     {
  46.         return false;
  47.     }
  48.     return true;
  49. }
  50. // 用于创建演示程序中要绘制在屏幕上的物体
  51. bool InitializeObjects()
  52. {
  53.    unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
  54.    // Fill in our structure to draw an object.
  55.    // x, y, z, rhw, color.
  56.    // objData结构体数组:设置所有点的数据
  57.    stD3DVertex objData[] =
  58.       {
  59.          // 点坐标及颜色的数据
  60.          { 420.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 0), },
  61.          { 420.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 255), },
  62.          { 220.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 255), },
  63.          { 220.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(90, 255, 90), },
  64.       };
  65.    // 创建顶点缓存
  66.    if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
  67.              D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
  68.              NULL))) return false;
  69.    // Fill the vertex buffer.
  70.    void *ptr;
  71.    // 锁定顶点缓存,以进行读写操作
  72.    if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
  73.       (void**)&ptr, 0))) return false;
  74.       
  75.    // 将数据复制到该缓存中
  76.    memcpy(ptr, objData, sizeof(objData));
  77.    // 对顶点缓存进行解锁
  78.    g_VertexBuffer->Unlock();
  79.    return true;
  80. }
  81. void RenderScene()
  82. {
  83.     // 清空后台缓存
  84.     g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
  85.     // 开始绘制,开始渲染
  86.     g_D3DDevice->BeginScene();
  87.     // 设置顶点数据流的输入源
  88.     g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
  89.                                  sizeof(stD3DVertex));
  90.     g_D3DDevice->SetFVF(D3DFVF_VERTEX);                 // 设置顶点格式
  91.     g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);   // 进行绘制
  92.     //第一个参数是图元类型
  93.     //点列 D3DPT_POINTLIST
  94.     //线列 D3DPT_LINELIST(例如:点1和点2连接,点3和点4连接)
  95.     //线带 D3DPT_LINESTRIP(例如:点1和点2相连,点2和点3相连)
  96.     //三角形列 D3DPT_TRIANGLELIST(例如:点1、点2和点3构成一个三角形,而点4、点5和点6构成另一个三角形)
  97.     //三角形带 D3DPT_TRIANGLESTRIP(例如:点1、点2和点3构成一个三角形,点2、点3和点4构成另一个三角形)
  98.     //三角形扇 D3DPT_TRIANGLEFAN(例如:点1、点2和点3构成一个三角形,而点1、点3和点4构成另一个三角形)
  99.     // 结束绘制,停止渲染
  100.     g_D3DDevice->EndScene();
  101.     // 显示绘制的结果
  102.     g_D3DDevice->Present(NULL, NULL, NULL, NULL);
  103. }
  104. void Shutdown()
  105. {
  106.     if(g_D3DDevice != NULL) g_D3DDevice->Release();
  107.     if(g_D3D != NULL) g_D3D->Release();
  108.     if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
  109.      
  110.     g_D3DDevice = NULL;
  111.     g_D3D = NULL;
  112.     g_VertexBuffer = NULL;
  113. }
  114. // 窗口过程函数(系统自动调用,即回调函数)
  115. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  116. {
  117.     switch(msg)
  118.     {
  119.         case WM_DESTROY:
  120.             PostQuitMessage(0);
  121.             return 0;
  122.             break;
  123.         case WM_KEYUP:
  124.             if(wParam == VK_ESCAPE) PostQuitMessage(0);
  125.             break;
  126.     }
  127.     return DefWindowProc(hWnd, msg, wParam, lParam);
  128. }
  129. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
  130. {
  131.     // 注册窗口相关类型
  132.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  133.                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  134.                      "DirectX_GAME", NULL };
  135.     RegisterClassEx(&wc);
  136.     // 创建这个注册好的应用程序窗口
  137.     HWND hWnd = CreateWindow("DirectX_GAME", "DirectX_Project", WS_OVERLAPPEDWINDOW,
  138.                              0, 0, 1024, 768, GetDesktopWindow(), NULL,
  139.                              wc.hInstance, NULL);
  140.     // 隐藏鼠标指针
  141.     ShowCursor(FALSE);
  142.     // 初始化 Direct3D
  143.     if(InitializeD3D(hWnd, true)&&InitializeObjects())
  144.     {
  145.         // 显示该窗口
  146.         ShowWindow(hWnd, SW_SHOWDEFAULT);
  147.         UpdateWindow(hWnd);
  148.         // 进入消息循环
  149.         MSG msg;
  150.         ZeroMemory(&msg, sizeof(msg));
  151.         while(msg.message != WM_QUIT)// 只要不是退出命令,就一直循环
  152.         {
  153.             // 从消息队列中获取下一条消息
  154.             if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
  155.             {
  156.                 // 对相关消息进行一些转换
  157.                 TranslateMessage(&msg);
  158.                 // 将转换后的消息发送给消息过程函数
  159.                 DispatchMessage(&msg);
  160.             }
  161.             else
  162.                 // 处理向屏幕绘制图像的代码部分
  163.                 RenderScene();
  164.         }
  165.     }
  166.     // 释放所有的Direct3D对象
  167.     Shutdown();
  168.     // 注销窗口类
  169.     UnregisterClass("DirectX_GAME", wc.hInstance);
  170.     return 0;
  171. }
复制代码
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2010-9-12 20:01:13 | 显示全部楼层
g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);   // 进行绘制
    //第一个参数是图元类型
    //点列 D3DPT_POINTLIST
    //线列 D3DPT_LINELIST(例如:点1和点2连接,点3和点4连接)
    //线带 D3DPT_LINESTRIP(例如:点1和点2相连,点2和点3相连)
    //三角形列 D3DPT_TRIANGLELIST(例如:点1、点2和点3构成一个三角形,而点4、点5和点6构成另一个三角形)
    //三角形带 D3DPT_TRIANGLESTRIP(例如:点1、点2和点3构成一个三角形,点2、点3和点4构成另一个三角形)
    //三角形扇 D3DPT_TRIANGLEFAN(例如:点1、点2和点3构成一个三角形,而点1、点3和点4构成另一个三角形)


就是这个地方。。。我用的参数是D3DPT_TRIANGLESTRIP
为什么用D3DPT_TRIANGLEFAN就只能显示出来一个三角形呢??
按照注释(抄书上的)应该也能画出来一个四边形啊。

求解
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2010-9-12 20:06:41 | 显示全部楼层
上图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2010-9-12 20:12:32 | 显示全部楼层
TRIANGLEFAN是画扇形吧,用来显示圆形什么的。
你可以改下点的坐标,以其一点为中心,其他点绕着它成扇形分布,就可以看出效果了。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2010-9-12 22:32:39 | 显示全部楼层
果然颠倒一下坐标就可以了继续学习
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
发表于 2010-9-27 23:36:57 | 显示全部楼层
g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

看来你不是这个问题 - -bbbbbb
我来解释一下吧

D3D对象的面都是单面的,背面是透明的。
有些时候创建出来的三角形是背面朝上的,所以就看不到了。
这个时候就需要更改CULLMODE即可。

PS:话说我想要那个初音的和那个蕾米莉亚的勋章……………………………………
PS CS2:钉宫四萌的也想要………………
PS CS3:干脆都给我算了……………………
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-28 19:41 , Processed in 0.022606 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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