|
为什么我的渲染对象只渲染了一遍就不再渲染了,谁能给我找找问题出在哪里!(只要在机子上跑一下就可以发现问题,但我就是不知道问题出在哪里)代码如下:
#include <d3d9.h>
#include <d3dx9.h>
#define SAFE_RELEASE(o) {if(o){o->Release();o = NULL;}}
struct LINEVERTEX
{
D3DXVECTOR3 pos;
D3DCOLOR color;
};
#define D3DFVF_LINEVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )
struct RECTVERTEX
{
D3DXVECTOR3 Pos;
D3DCOLOR Color;
D3DXVECTOR2 Tex;
};
#define D3DFVF_RECTVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
//全局变量
LPDIRECT3D9 g_pD3d = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
D3DCAPS9 g_Caps = {(D3DDEVTYPE)0};
LPDIRECT3DVERTEXBUFFER9 g_pLineVB = NULL;
LPDIRECT3DINDEXBUFFER9 g_pLineIB = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pRectVB = NULL;
LPDIRECT3DTEXTURE9 g_pRenderTexture = NULL;
LPDIRECT3DSURFACE9 g_pRenderSurface = NULL;
HRESULT InitD3d(HWND hWnd)
{
if(NULL == (g_pD3d = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
return E_FAIL;
RECT rect;
GetClientRect(hWnd, &rect);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.BackBufferWidth = rect.right - rect.left;
d3dpp.BackBufferHeight = rect.bottom - rect.top;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
if(FAILED(g_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
g_Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ? D3DCREATE_HARDWARE_VERTEXPROCESSING : D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice)))
return E_FAIL;
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
return S_OK;
}
//创建定点缓冲区
HRESULT InitVB()
{
if(FAILED(g_pd3dDevice->CreateVertexBuffer(4 * sizeof(RECTVERTEX), 0, D3DFVF_RECTVERTEX,
D3DPOOL_DEFAULT, &g_pRectVB, NULL)))
return E_FAIL;
RECTVERTEX* rVtx;
if(SUCCEEDED(g_pRectVB->Lock(0, 4 * sizeof(RECTVERTEX), (void**)&rVtx, 0)))
{
rVtx[0].Pos = D3DXVECTOR3(-10.0f, 7.5f, 0.0f);
rVtx[1].Pos = D3DXVECTOR3(-10.0f, -7.5f, 0.0f);
rVtx[2].Pos = D3DXVECTOR3(10.0f, 7.5f, 0.0f);
rVtx[3].Pos = D3DXVECTOR3(10.0f, -7.5f, 0.0f);
rVtx[0].Color = 0xffffffff;
rVtx[1].Color = 0xffffffff;
rVtx[2].Color = 0xffffffff;
rVtx[3].Color = 0xffffffff;
rVtx[0].Tex = D3DXVECTOR2(0, 0);
rVtx[1].Tex = D3DXVECTOR2(0, 1);
rVtx[2].Tex = D3DXVECTOR2(1, 0);
rVtx[3].Tex = D3DXVECTOR2(1, 1);
g_pRectVB->Unlock();
}
else
return E_FAIL;
if(FAILED(g_pd3dDevice->CreateVertexBuffer(12 * sizeof(LINEVERTEX),0, D3DFVF_LINEVERTEX,
D3DPOOL_DEFAULT, &g_pLineVB, NULL)))
return E_FAIL;
LINEVERTEX* lVtx;
if(FAILED(g_pLineVB->Lock(0, 12*sizeof(LINEVERTEX), (void**)&lVtx, 0)))
return E_FAIL;
float fDeltaY = 3.0f;
for (int i = 0; i <= 2 * 5; i += 2)
{
lVtx.pos = D3DXVECTOR3(-10.0f, -7.5+i*fDeltaY/2, 0.0f);
lVtx[i+1].pos = D3DXVECTOR3(10.0f, -7.5+i*fDeltaY/2, 0.0f);
lVtx.color = 0xffffffff;
lVtx[i+1].color = 0xffffffff;
}
g_pLineVB->Unlock();
//创建渲染到纹理表面
if(FAILED(g_pd3dDevice->CreateTexture(512, 512, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT, &g_pRenderTexture, NULL)))
return E_FAIL;
//获得纹理的渲染表面
if(FAILED(g_pRenderTexture->GetSurfaceLevel(0, &g_pRenderSurface)))
return E_FAIL;
return S_OK;
}
//创建索引缓存
HRESULT InitIB()
{
WORD indices[] =
{
0, 1, 2, 3, 4, 5, 6,7 ,8 ,9, 10, 11, 0, 10, 1, 11
};
if(FAILED(g_pd3dDevice->CreateIndexBuffer(16*sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,
&g_pLineIB, NULL)))
return E_FAIL;
VOID* pIndices;
if(FAILED(g_pLineIB->Lock(0, 16 * sizeof(WORD), (void**)&pIndices, 0)))
return E_FAIL;
memcpy(pIndices, indices, 16 * sizeof(WORD));
g_pLineIB->Unlock();
return S_OK;
}
HRESULT InitGeometry()
{
if(FAILED(InitVB()))
return E_FAIL;
if(FAILED(InitIB()))
return E_FAIL;
}
void Cleanup()
{
SAFE_RELEASE(g_pLineVB);
SAFE_RELEASE(g_pLineIB);
SAFE_RELEASE(g_pRectVB);
SAFE_RELEASE(g_pRenderTexture);
SAFE_RELEASE(g_pd3dDevice);
SAFE_RELEASE(g_pD3d);
}
void SetupCamera()
{
D3DXMATRIXA16 matWorld;
D3DXMatrixIdentity(&matWorld);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
D3DXMATRIXA16 matView;
D3DXVECTOR3 vEye(0.0f, 0.0f, -20.0f);
D3DXVECTOR3 vLookAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&matView, &vEye, &vLookAt, &vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 800.0f / 600.0f, 1.0f, 100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}
void Render()
{
LPDIRECT3DSURFACE9 pBackBuffer;
g_pd3dDevice->GetRenderTarget(0, &pBackBuffer);
g_pd3dDevice->SetRenderTarget(0, g_pRenderSurface);
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0xff, 0xff, 0), 1.0f, 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupCamera();
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
g_pd3dDevice->SetStreamSource(0, g_pLineVB, 0, sizeof(LINEVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_LINEVERTEX);
g_pd3dDevice->SetIndices(g_pLineIB);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_LINELIST, 0, 0, 12, 0, 8);
g_pd3dDevice->EndScene();
}
g_pd3dDevice->SetRenderTarget(0, pBackBuffer);
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0xff, 0xff), 1.0f, 0);
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupCamera();
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationAxis( & matWorld , & D3DXVECTOR3( 1 , 1 , 0 ) ,
sinf(D3DX_PI * 2.0f * (timeGetTime() % 5000 ) / 5000.0f ));
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
g_pd3dDevice->SetTexture(0, g_pRenderTexture);
g_pd3dDevice -> SetTextureStageState( 0 , D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
g_pd3dDevice -> SetTextureStageState( 0 , D3DTSS_TEXCOORDINDEX, 0 );
g_pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSU , D3DTADDRESS_MIRROR);
g_pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSV , D3DTADDRESS_MIRROR);
g_pd3dDevice -> SetRenderState(D3DRS_LIGHTING , FALSE);
g_pd3dDevice->SetStreamSource(0, g_pRectVB, 0, sizeof(RECTVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_RECTVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
g_pd3dDevice->EndScene();
}
g_pd3dDevice-> resent(NULL, NULL, NULL, NULL);
}
// 消息处理
LRESULT WINAPI MsgProc(HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
break ;
}
return : efWindowProc(hWnd, message , wParam , lParam);
}
// Windows 入口
int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
{
WNDCLASS wndClass;
memset( & wndClass , 0 , sizeof (wndClass));
wndClass.hInstance = hInstance;
wndClass.lpszClassName = L" 渲染到纹理 " ;
wndClass.lpfnWndProc = MsgProc;
RegisterClass( & wndClass);
// 创建窗口
HWND hWnd = CreateWindow( L" 渲染到纹理 " , L" 渲染到纹理! "
, WS_OVERLAPPEDWINDOW , 0 , 0 , 800 , 600 ,0
, 0 , wndClass.hInstance , 0 );
// 显示窗口
ShowWindow(hWnd , SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// 初始化 D3D 设备
if (SUCCEEDED(InitD3d(hWnd)))
{
if(FAILED(InitGeometry()))
return E_FAIL;
// 消息处理循环
MSG msg;
memset( & msg , 0 , sizeof (msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage( & msg , 0 , 0 , 0 , PM_REMOVE))
{
TranslateMessage( & msg);
DispatchMessage( & msg);
}
else
{
Render();
}
}
}
// 清空场景
Cleanup();
UnregisterClass( L" 渲染到纹理 " , wndClass.hInstance);
return 0 ;
} |
|