secondsen 发表于 2010-9-12 19:58:27

为什么这样画不出四边形。。DirectX

四边形。。两个三角形拼出来。。按照教程做的话没有问题是一个四边形

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

先上代码。。

secondsen 发表于 2010-9-12 19:58:39

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

// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;

// 定义了一个顶点缓存对象
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;

// 定义场景中单个3D点的结构
struct stD3DVertex
{
    float x, y, z, rhw;    // 点的x,y,z坐标值
    unsigned long color;   // 点的颜色
};

// 定义顶点格式标识符,即灵活顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// 初始化Direct3D
bool InitializeD3D(HWND hWnd, bool fullscreen)
{
    D3DDISPLAYMODE displayMode;

    // 创建Direct3D接口对象
    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(g_D3D == NULL) return false;

    // 获得当前显卡的显示模式
    if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
      return false;

    // 建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));

    if(fullscreen)
    {
      d3dpp.Windowed = FALSE;
      d3dpp.BackBufferWidth = 1024;
      d3dpp.BackBufferHeight = 768;
      //判断系统分辨率是否大于游戏所需分辨率
      if ((GetSystemMetrics(SM_CXSCREEN) < 1024) || (GetSystemMetrics(SM_CYSCREEN) < 768))
            MessageBox(NULL,"当前系统分辨率小于1024×768", "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
    }
    else
      d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = displayMode.Format;

    // Create the D3DDevice
    if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
    {
      return false;
    }

    return true;
}

// 用于创建演示程序中要绘制在屏幕上的物体
bool InitializeObjects()
{
   unsigned long col = D3DCOLOR_XRGB(255, 255, 255);

   // Fill in our structure to draw an object.
   // x, y, z, rhw, color.
   // objData结构体数组:设置所有点的数据
   stD3DVertex objData[] =
      {
         // 点坐标及颜色的数据
         { 420.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 0), },
         { 420.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 255), },
         { 220.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 255), },
         { 220.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(90, 255, 90), },
      };

   // 创建顶点缓存
   if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
             D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
             NULL))) return false;

   // Fill the vertex buffer.
   void *ptr;

   // 锁定顶点缓存,以进行读写操作
   if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
      (void**)&ptr, 0))) return false;
      
   // 将数据复制到该缓存中
   memcpy(ptr, objData, sizeof(objData));

   // 对顶点缓存进行解锁
   g_VertexBuffer->Unlock();

   return true;
}

void RenderScene()
{
    // 清空后台缓存
    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);

    // 开始绘制,开始渲染
    g_D3DDevice->BeginScene();

    // 设置顶点数据流的输入源
    g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
                                 sizeof(stD3DVertex));
    g_D3DDevice->SetFVF(D3DFVF_VERTEX);               // 设置顶点格式
    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构成另一个三角形)

    // 结束绘制,停止渲染
    g_D3DDevice->EndScene();

    // 显示绘制的结果
    g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}

void Shutdown()
{
    if(g_D3DDevice != NULL) g_D3DDevice->Release();
    if(g_D3D != NULL) g_D3D->Release();
    if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
   
    g_D3DDevice = NULL;
    g_D3D = NULL;
    g_VertexBuffer = NULL;
}

// 窗口过程函数(系统自动调用,即回调函数)
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
      case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
            break;
      case WM_KEYUP:
            if(wParam == VK_ESCAPE) PostQuitMessage(0);
            break;
    }

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


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
    // 注册窗口相关类型
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DirectX_GAME", NULL };
    RegisterClassEx(&wc);

    // 创建这个注册好的应用程序窗口
    HWND hWnd = CreateWindow("DirectX_GAME", "DirectX_Project", WS_OVERLAPPEDWINDOW,
                           0, 0, 1024, 768, GetDesktopWindow(), NULL,
                           wc.hInstance, NULL);

    // 隐藏鼠标指针
    ShowCursor(FALSE);

    // 初始化 Direct3D
    if(InitializeD3D(hWnd, true)&&InitializeObjects())
    {
      // 显示该窗口
      ShowWindow(hWnd, SW_SHOWDEFAULT);
      UpdateWindow(hWnd);

      // 进入消息循环
      MSG msg;
      ZeroMemory(&msg, sizeof(msg));

      while(msg.message != WM_QUIT)// 只要不是退出命令,就一直循环
      {
            // 从消息队列中获取下一条消息
            if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
            {
                // 对相关消息进行一些转换
                TranslateMessage(&msg);
                // 将转换后的消息发送给消息过程函数
                DispatchMessage(&msg);
            }
            else
                // 处理向屏幕绘制图像的代码部分
                RenderScene();
      }
    }

    // 释放所有的Direct3D对象
    Shutdown();

    // 注销窗口类
    UnregisterClass("DirectX_GAME", wc.hInstance);
    return 0;
}

secondsen 发表于 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就只能显示出来一个三角形呢??
按照注释(抄书上的)应该也能画出来一个四边形啊。

求解

secondsen 发表于 2010-9-12 20:06:41

上图

shawind 发表于 2010-9-12 20:12:32

TRIANGLEFAN是画扇形吧,用来显示圆形什么的。
你可以改下点的坐标,以其一点为中心,其他点绕着它成扇形分布,就可以看出效果了。

secondsen 发表于 2010-9-12 22:32:39

果然颠倒一下坐标就可以了继续学习

tamashii 发表于 2010-9-27 23:36:57

g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

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

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

PS:话说我想要那个初音的和那个蕾米莉亚的勋章……………………………………
PS CS2:钉宫四萌的也想要………………
PS CS3:干脆都给我算了……………………
页: [1]
查看完整版本: 为什么这样画不出四边形。。DirectX