读书人

为什么小弟我用DirectX画的彩色三角形

发布时间: 2013-07-09 09:50:48 作者: rapoo

为什么我用DirectX画的彩色三角形显示是黑色的

#include <windows.h>
#include <stdio.h>
#include <d3d9.h>
#include <d3dx9tex.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

#define SURFACE_WIDTH800
#define SURFACE_HEIGHT600

HWND g_hWnd;
LPDIRECT3D9 pD3D;
LPDIRECT3DDEVICE9 pd3dDevice;
IDirect3DSurface9 *pBackground;
IDirect3DVertexBuffer9 *g_pVertexBuffer=NULL;
IDirect3DIndexBuffer9 *g_pIndexBuffer=NULL;
ID3DXMesh *g_pD3dxMesh=NULL;

float g_fZ=0.0f;

struct VERTEX
{
VERTEX(float x,float y,float z,D3DCOLOR color){
fX=x;
fY=y;
fZ=z;
d3dColor=color;
}
float fX,fY,fZ;
D3DCOLOR d3dColor;
static const DWORD FVF;
};
const DWORD VERTEX::FVF=D3DFVF_XYZ|D3DFVF_DIFFUSE;

bool InitDirect3D()
{
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(pD3D!=NULL)
{
D3DCAPS9 d3dcaps;
if(0==pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dcaps))
{
D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp,0,sizeof(d3dpp));
d3dpp.BackBufferWidth=SURFACE_WIDTH;
d3dpp.BackBufferHeight=SURFACE_HEIGHT;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount=1;
d3dpp.Windowed=true;
d3dpp.hDeviceWindow=g_hWnd;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality=0;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;

DWORD dwBehaviorFlag;
if(d3dcaps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
dwBehaviorFlag=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
dwBehaviorFlag=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,dwBehaviorFlag,&d3dpp,&pd3dDevice);
if(!FAILED(hr))
{
pd3dDevice->CreateVertexBuffer(3*sizeof(VERTEX),D3DUSAGE_WRITEONLY,VERTEX::FVF,D3DPOOL_MANAGED,&g_pVertexBuffer,NULL);
D3DXVECTOR3 position(0.0f,0.0f,-5.0f);
D3DXVECTOR3 target(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V,&position,&target,&up);
pd3dDevice->SetTransform(D3DTS_VIEW,&V);

D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)SURFACE_WIDTH/SURFACE_HEIGHT,1.0f,1000.0f);
pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);

//pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);
//pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
return true;
}
else
{
switch(hr)
{
case D3DERR_INVALIDCALL:
OutputDebugString(L"函数的参数为一个无效值\n");
break;
case D3DERR_NOTAVAILABLE:
OutputDebugString(L"当前设备不支持所设类型\n");
break;
case D3DERR_OUTOFVIDEOMEMORY:
OutputDebugString(L"没有足够的显存执行操作\n");
break;
default:
OutputDebugString(L"未知错误\n");
break;
}
}
}
}
return false;
}

void OnLButtonDown()
{
SetTimer(g_hWnd,1,33,NULL);
}
void OnLButtonUp()
{
KillTimer(g_hWnd,1);
}


void OnTimer()
{
if(pd3dDevice)
{
VERTEX *pVertex;
g_pVertexBuffer->Lock(0,3*sizeof(VERTEX),(void**)&pVertex,0);
pVertex[0]=VERTEX(0.0f,0.0f,g_fZ,D3DCOLOR_ARGB(255,255,0,0));
pVertex[1]=VERTEX(10.0f,0.0f,g_fZ,D3DCOLOR_ARGB(255,0,255,0));
pVertex[2]=VERTEX(10.0f,-10.0f,g_fZ,D3DCOLOR_ARGB(255,0,0,255));
g_pVertexBuffer->Unlock();

pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xFFFFFFFF,1.0f,0);

pd3dDevice->BeginScene();

pd3dDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(VERTEX));
pd3dDevice->SetFVF(VERTEX::FVF);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL,NULL,NULL,NULL);

g_fZ-=0.05f;
}
}


void RenderDisplay()
{
if(pd3dDevice!=NULL)
{
IDirect3DSurface9 *pBackBuffer=NULL;
pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xFFFFFFFF,1.0f,0);
pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
}

void ClearupDirect()
{
if(pd3dDevice!=NULL)
{
pd3dDevice->Release();
pd3dDevice=NULL;
}
if(pD3D!=NULL)
{
pD3D->Release();
pD3D=NULL;
}
if(g_pVertexBuffer!=NULL)
{
g_pVertexBuffer->Release();
g_pVertexBuffer=NULL;
}
if(g_pIndexBuffer!=NULL)
{
g_pIndexBuffer->Release();
g_pIndexBuffer=NULL;
}
}

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch(message)
{
case WM_LBUTTONDOWN:
OnLButtonDown();
break;
case WM_LBUTTONUP:
OnLButtonUp();
break;
case WM_TIMER:
OnTimer();
break;
case WM_PAINT:
RenderDisplay();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= WinProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= NULL;
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName= NULL;
wcex.lpszClassName= L"DirectExampleClass";
wcex.hIconSm= NULL;
RegisterClassEx(&wcex);
g_hWnd=CreateWindowEx(0,L"DirectExampleClass",L"DirectExampleWindow",WS_OVERLAPPEDWINDOW,100,100,SURFACE_WIDTH,SURFACE_HEIGHT,NULL,NULL,hInstance,NULL);
if(g_hWnd!=NULL)
{
if(InitDirect3D())
{
ShowWindow(g_hWnd,nShowCmd);
UpdateWindow(g_hWnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

ClearupDirect();
}
}
return 0;
}

DirectX 3D Surface


[解决办法]
检测一下,材质,灯光,法向量的代码有没有弄错
[解决办法]
没有光线
或者加个材质

[解决办法]
pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE)
这个必须要设置上的
[解决办法]
D3DFVF_DIFFUSE的原因, 设置它的时候,必须关闭光照,否则就是黑色的

读书人网 >网络游戏

热点推荐