菜鸟求教 D3D无法画三角形代码问题
direct3d吧
全部回复
仅看楼主
level 1
lql20095 楼主
系统:vista
工具:VS2008
只能画出来一个黑背景,代码如下:
// D3D_DEMO1.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "D3D_DEMO1.h"
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <atlstr.h>
#define MAX_LOADSTRING 100
#define D3DFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
// 全局变量:
HINSTANCE hInst;     
LPDIRECT3D9 myd3d=NULL;
LPDIRECT3DDEVICE9 myd3ddevice=NULL;
LPDIRECT3DVERTEXBUFFER9 myvertexbuffer=NULL;
struct myvertex
{
   float x,y,z;
   DWORD color;
};
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HRESULT InitD3D(HWND hWnd)
{
if (NULL==(myd3d=Direct3DCreate9(D3D_SDK_VERSION)))
   return false;
D3DDISPLAYMODE d3ddm;
if (myd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))
   return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
     d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
     if( myd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &myd3ddevice))
   return false;
     myvertex v[]=
{ {1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0),},
       {200.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
    {100.0f, 200.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
};
myd3ddevice->CreateVertexBuffer(sizeof(v), 0, D3DFVF, D3DPOOL_DEFAULT, &myvertexbuffer, NULL);
     VOID* pvertexs;
myvertexbuffer->Lock(0, sizeof(v), (VOID**) &pvertexs, 0);
memcpy(pvertexs, v, sizeof(v));
myvertexbuffer->Unlock();
return true;
}
VOID Cleanup()
{
if(myd3ddevice!=NULL)
   myd3ddevice->Release();
if(myd3d!=NULL)
   myd3d->Release();
if(myvertexbuffer!=NULL)
   myvertexbuffer->Release();
}
VOID Render()
{
if(NULL==myd3ddevice)
   return;
myd3ddevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
myd3ddevice->BeginScene();
myd3ddevice->SetStreamSource(0, myvertexbuffer, 0, sizeof(myvertex));
myd3ddevice->SetFVF(D3DFVF);
myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
     myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
     myd3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
     myd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
myd3ddevice->EndScene();
myd3ddevice->Present(NULL, NULL, NULL, NULL);
}
{
WNDCLASSEX wc={sizeof(WNDCLASSEX), CS_HREDRAW|CS_VREDRAW, WndProc,0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,L"myd3d_demo", NULL};
RegisterClassEx(&wc);
     HWND hWnd=CreateWindow(L"myd3d_demo", L"myd3d_demo", WS_OVERLAPPEDWINDOW, 0, 0, 1024,768, GetDesktopWindow(), NULL,wc.hInstance, NULL);
MSG msg;
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_D3D_DEMO1));
if (InitD3D(hWnd))
{
   ShowWindow(hWnd, SW_SHOWDEFAULT);
   UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0))
{
   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
}
Cleanup();
UnregisterClass(L"myd3d_demo", wc.hInstance);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{...
case WM_PAINT:
   hdc = BeginPaint(hWnd, &ps);
//画图
   Render();
   EndPaint(hWnd, &ps);
   break;
...
}

2010年04月05日 12点04分 1
level 0
你把背景改成白色试试
2010年06月07日 03点06分 2
level 1
好乱的代码
2011年01月17日 10点01分 3
1