|

楼主 |
发表于 2009-10-11 20:32:00
|
显示全部楼层
Re: 各位大哥快来帮帮我,我被这个问题整惨了
算了,还是把全部代码都发上来,谢谢了。另外PTEX1我加载的另外一张纹理,如果在把渲染时把PTEX改成PTEX1就一切正常(但程序的意义也失去了)。请问到底怎么回事啊??
#include <windows.h>
#include <mmsystem.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
bool initWindow(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
bool initDirect3D(HWND hwnd);
void render(void);
int screen_height = 480;
int screen_width = 640;
LPDIRECT3D9 pD3D;
LPDIRECT3DDEVICE9 pd3dDevice;
LPDIRECT3DTEXTURE9 pTex;
LPDIRECT3DTEXTURE9 pTex1;
LPDIRECT3DVERTEXBUFFER9 pVB;
LPD3DXMESH pMesh;
LPDIRECT3DSURFACE9 pOld,pNew;
HINSTANCE hInst;
HWND wndHandle;
struct CUSVERTEX
{
float x,y,z;
float u,v;
CUSVERTEX()
{
x=0;y=0;z=0;
u=0;v=0;
}
CUSVERTEX(float _x,float _y,float _z,float _u,float _v)
{
x=_x;y=_y;z=_z;
u=_u;v=_v;
}
};
#define FVF D3DFVF_XYZ|D3DFVF_TEX1
/////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
if (!initWindow(hInstance))
{
MessageBox(NULL, "Unable to create window", "ERROR", MB_OK);
return false;
}
if (!initDirect3D(wndHandle))
{
MessageBox(NULL, "Unable to init Direct3D", "ERROR", MB_OK);
return false;
}
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
if( NULL == pd3dDevice )
break;
render();
}
}
if( pd3dDevice != NULL)
{
pd3dDevice->Release();
pd3dDevice = NULL;
}
if( pD3D != NULL)
{
pD3D->Release();
pD3D = NULL;
}
return (int) msg.wParam;
}
bool initWindow(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "DirectXExample";
wcex.hIconSm = 0;
RegisterClassEx(&wcex);
wndHandle = CreateWindow("DirectXExample",
"DirectXExample",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if (!wndHandle)
return false;
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
bool initDirect3D(HWND hwnd)
{
if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
{
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = screen_height;
d3dpp.BackBufferWidth = screen_width;
d3dpp.hDeviceWindow = hwnd;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pd3dDevice ) ) )
{
return false;
}
pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
D3DXCreateTeapot(pd3dDevice,&pMesh,NULL);
pd3dDevice->CreateVertexBuffer(4*sizeof(CUSVERTEX),D3DUSAGE_WRITEONLY,FVF,D3DPOOL_MANAGED,&pVB,NULL);
CUSVERTEX *p;
pVB->Lock(NULL,NULL,(void**)&p,NULL);
p[0]=CUSVERTEX( -10.0f, 10.0f,0.0f,0.0f,0.0f);
p[1]=CUSVERTEX( -5.0f, 10.0f,0.0f,1.0f,0.0f);
p[2]=CUSVERTEX( -10.0f, 5.0f,0.0f,0.0f,1.0f);
p[3]=CUSVERTEX( -5.0f, 5.0f,0.0f,1.0f,1.0f);
pVB->Unlock();
D3DXCreateTexture(pd3dDevice,128,128,0,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTex);
D3DXCreateTextureFromFile(pd3dDevice,"e:\\erik1a.bmp",&pTex1);
pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
return true;
}
void render(void)
{
D3DXMATRIX world,view,proj;
D3DXVECTOR3 pos,at,up;
static int r=0;
if(++r>360)
r=0;
pd3dDevice->GetRenderTarget(0,&pOld);
pTex->GetSurfaceLevel(0,&pNew);
pd3dDevice->SetRenderTarget(0,pNew);
pd3dDevice->SetRenderState(D3DRS_ZENABLE,FALSE);
pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
pd3dDevice->Clear( 0, NULL,0,0x44555566, 1.0f, 0 );
pd3dDevice->BeginScene();
pd3dDevice->SetTransform(D3DTS_WORLD,&world);
pos=D3DXVECTOR3(0,2,-1.5);
at=D3DXVECTOR3(0,0,0);
up=D3DXVECTOR3(0,1,0);
D3DXMatrixLookAtLH(&view,&pos,&at,&up);
pd3dDevice->SetTransform(D3DTS_VIEW,&view);
D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
pMesh->DrawSubset(0);
pd3dDevice->EndScene();
pd3dDevice->SetRenderTarget(0,pOld);
pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
pNew->Release();
D3DXMatrixIdentity(&world);
D3DXMatrixIdentity(&view);
D3DXMatrixIdentity(&proj);
pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x11223344, 1.0f, 0 );
pd3dDevice->BeginScene();
pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
D3DXMatrixIdentity(&world);
pd3dDevice->SetTransform(D3DTS_WORLD,&world);
pos=D3DXVECTOR3(0,0,-5);
at=D3DXVECTOR3(0,0,0);
up=D3DXVECTOR3(0,1,0);
D3DXMatrixLookAtLH(&view,&pos,&at,&up);
pd3dDevice->SetTransform(D3DTS_VIEW,&view);
D3DXMatrixOrthoLH(&proj,20,20,1,1000);
pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
pd3dDevice->SetStreamSource(0,pVB,0,sizeof(CUSVERTEX));
pd3dDevice->SetFVF(FVF);
pd3dDevice->SetTexture(0,pTex);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
D3DXMatrixRotationY(&world,D3DXToRadian(r));
pd3dDevice->SetTransform(D3DTS_WORLD,&world);
pos=D3DXVECTOR3(0,1,-3);
at=D3DXVECTOR3(0,0,0);
up=D3DXVECTOR3(0,1,0);
D3DXMatrixLookAtLH(&view,&pos,&at,&up);
pd3dDevice->SetTransform(D3DTS_VIEW,&view);
D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
pMesh->DrawSubset(0);
pd3dDevice->EndScene();
pd3dDevice-> resent( NULL, NULL, NULL, NULL );
// pTex->Release();
} |
|