/***********************************************************************
filename:  Main.cpp
created: 14/1/2009
author: SunLei

purpose:
*************************************************************************/
/***************************************************************************
 *   Copyright (C) 2009 SunLei & The  Development Team
 *
 ***************************************************************************/
#include <iostream>
#include <windows.h>
#include <d3dx9.h>#define WIDTH 640
#define HEIGHT 480BOOL InitWindow ();
BOOL InitDirect ();
LRESULT CALLBACK SWindowProc( HWND hwnd , UINT msg, WPARAM wParam, LPARAM lParam);
int EnterMsgLoop(  BOOL ( *display )( float timeDelta ));
BOOL display ( float timeDelta ) ;
BOOL setUp ();HWND hwnd;
LPDIRECT3D9 d3dobj;
IDirect3DDevice9* device; 
IDirect3DVertexBuffer9* vb;
D3DXMATRIX WorldMatrix;
struct SVertex
{
float _x,_y,_z ,rhw;
DWORD color;
};
int main ( int argc, char *argv[] )
{
if ( !InitWindow() )
{
MessageBox(0, "InitWindow() - FAILED", 0, 0);
return -1;
} if ( !InitDirect() )
{
MessageBox(0, "InitDirect() - FAILED", 0, 0);
return -1;
}


if ( !setUp() )
{
MessageBox(0, "setUp() - FAILED", 0, 0);
return -1;
}
EnterMsgLoop ( display ) ;
return 0;
}BOOL InitWindow ()
{
WNDCLASS window;
window.style = CS_VREDRAW|CS_HREDRAW;
window.hInstance = GetModuleHandle ( 0 ) ;
window.hCursor =  LoadCursor(0, IDC_ARROW);
window.hIcon = LoadIcon(0, IDI_APPLICATION);
window.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
window.lpszMenuName  = 0;
window.lpszClassName = "Direct3D9App";
window.lpfnWndProc   = (WNDPROC)SWindowProc; 
window.cbClsExtra    = 0;
window.cbWndExtra    = 0; if( !RegisterClass(&window) ) 
{
MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
} hwnd = CreateWindow("Direct3D9App", "Direct3D9App", 
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, WIDTH, HEIGHT,
0 /*parent hwnd*/, 0 /* menu */, GetModuleHandle ( 0 ), 0 /*extra*/);  if( !hwnd )
{
MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
} ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd); return true;}BOOL InitDirect ()
{
if( NULL == (d3dobj = Direct3DCreate9(D3D_SDK_VERSION)))
return false; D3DPRESENT_PARAMETERS frame;
 ZeroMemory( &frame, sizeof(frame) );
frame.BackBufferWidth = WIDTH;
frame.BackBufferCount = 1;
frame.BackBufferHeight = HEIGHT;
frame.Windowed = true;
frame.SwapEffect = D3DSWAPEFFECT_DISCARD;
frame.BackBufferFormat = D3DFMT_UNKNOWN;
frame.hDeviceWindow = hwnd; HRESULT hr = d3dobj ->CreateDevice(  D3DADAPTER_DEFAULT ,D3DDEVTYPE_HAL ,hwnd , D3DCREATE_SOFTWARE_VERTEXPROCESSING , &frame , &device );
if ( FAILED ( hr ))
return false ;
return true;}
LRESULT CALLBACK SWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
DestroyWindow(hwnd);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}int EnterMsgLoop(  BOOL ( *pdisplay )( float timeDelta ))
{
MSG msg;
ZeroMemory( &msg , sizeof MSG ) ; while ( msg.message != WM_QUIT )
{
if( PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
        {
float currTime  = (float)timeGetTime();
float timeDelta = (currTime )*0.001f; pdisplay(timeDelta);
        }
} return 0;
}
BOOL display ( float timeDelta )

device->Clear(0, 0, D3DCLEAR_TARGET , D3DCOLOR_XRGB( 0 ,0,0), 1.0f, 0);
device->BeginScene();
device->SetStreamSource(0, vb, 0, sizeof(SVertex));
device ->SetFVF( D3DFVF_XYZRHW|D3DFVF_DIFFUSE ); device->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 ,1 ); device->EndScene();
device->Present(0,0,0,0);
return true;
}
BOOL setUp ()
{
SVertex  vx[] = { 
{ 100.0f , 0.0f , 0.5f , 1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ 0.0f , 0.0f , 0.5f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ 0.0f , 100.0f , 0.5f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, { 0.0f , 0.0f ,  5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ 0.0f , 100.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ -0.100f , 0.0f , 5.0f ,D3DCOLOR_ARGB(0,255,0,0)}, { -100.0f , 0.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ 100.0f , 0.0f ,5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},
{ 0.0f , 100.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}
};
device ->CreateVertexBuffer( sizeof vx , 0 , D3DFVF_XYZRHW|D3DFVF_DIFFUSE , D3DPOOL_DEFAULT , &vb,NULL);



VOID* pVertices;
HRESULT T = vb->Lock(0,  sizeof(vx), (void**)&pVertices, 0);
memcpy( pVertices , vx , sizeof vx );
vb->Unlock(); return true;
}

解决方案 »

  1.   

    SVertex  vx[] = { 
    { 100.0f , 50.0f , 0.5f , 1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { 250.0f , 150.0f , 0.5f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { 250.0f ,250.0f , 0.5f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)},  { 0.0f , 0.0f ,  5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { 0.0f , 100.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { -0.100f , 0.0f , 5.0f ,D3DCOLOR_ARGB(0,255,0,0)},  { -100.0f , 0.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { 100.0f , 0.0f ,5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)}, 
    { 0.0f , 100.0f , 5.0f ,1.0f,D3DCOLOR_ARGB(0,255,0,0)} 
    }; 
    顶点没设置好,导致你看不到,也可以通过SetTransform来改变观察点
      

  2.   

    RHW 就是告诉D3D这个定点的坐标是已经被手工变换过的,不需要再进行WVP变换
    有RHW标志的顶点坐标就是屏幕坐标
      

  3.   

    添加w坐标,即齐次坐标
    可以将矩阵的加法和乘法操作封装到一个矩阵当中,而不涉及两个矩阵.
    引入一个没用空间特性的W坐标,很大程度上只是使得数学运算得以进行,如果设置W为1.0,就可以很容易的进行加法运算