|

楼主 |
发表于 2004-4-8 23:01:00
|
显示全部楼层
Re:vs怪现象。
#include <d3d9.h>
#include <d3dx9.h>
#include "D3DFile.h"
#include "DXUtil.h"
#include "D3DUtil.h"
struct D3DVERTEX
{
D3DXVECTOR3 p;
D3DXVECTOR3 n;
FLOAT tu, tv;
static const DWORD FVF;
};
const DWORD D3DVERTEX::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;
HRESULT hr;
LPD3DXBUFFER pCode;
LPD3DXBUFFER pErrorMsgs;
LPDIRECT3DVERTEXSHADER9 m_pVertexShader;
LPDIRECT3DVERTEXBUFFER9 g_pVB0 = NULL;
LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration0;
LPD3DXBUFFER pCode0;
LPDIRECT3DVERTEXSHADER9 m_pVertexShader0;
LPDIRECT3DTEXTURE9 m_pTexture0;
LPD3DXMESH m_pMesh;
D3DMATERIAL9 *m_pMeshMaterials;
LPDIRECT3DTEXTURE9 *m_pMeshTextures;
DWORD m_dwNumSubsets;
LPDIRECT3DTEXTURE9 m_pDolphinTexture;
LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB1;
LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB2;
LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB3;
LPDIRECT3DINDEXBUFFER9 m_pDolphinIB;
DWORD m_dwNumDolphinVertices;
DWORD m_dwNumDolphinFaces;
LPDIRECT3DVERTEXDECLARATION9 m_pDolphinVertexDeclaration;
LPDIRECT3DVERTEXSHADER9 m_pDolphinVertexShader;
LPDIRECT3DVERTEXSHADER9 m_pDolphinVertexShader2;
TCHAR strPath[MAX_PATH];
LPDIRECT3DVERTEXBUFFER9 pMeshSourceVB;
LPDIRECT3DINDEXBUFFER9 pMeshSourceIB;
D3DVERTEX* pSrc;
D3DVERTEX* pDst;
CD3DMesh DolphinMesh01;
CD3DMesh DolphinMesh02;
CD3DMesh DolphinMesh03;
HRESULT InitD3D( HWND hWnd )
{ if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
//g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
return S_OK;
}
VOID Cleanup()
{
if( g_pVB != NULL )
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release();
}
VOID Cleanup0()
{
//释放Mesh对象
if( g_pVB != NULL )
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release();
}
VOID SetMatrix()
{ UINT iTime = timeGetTime() % 30000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 30000.0f;
D3DXMATRIX mat, matView, matProj,matWorld,matRotate;
D3DXMatrixRotationY( &matRotate, fAngle );
D3DXMatrixScaling( &matWorld, 0.05f, 0.05f, 0.05f );
D3DXMatrixMultiply( &matWorld, &matWorld, &matRotate );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, -40.0f,20.0f ), //from
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), //at
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ));//up
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMatrixMultiply( &mat, &matWorld, &matView );
D3DXMatrixMultiply( &mat, &mat, &matProj );
D3DXMatrixTranspose( &mat ,&mat );
//D3DXMatrixIdentity(&mat);
g_pd3dDevice->SetVertexShaderConstantF( 0 , (float*)&mat , 4 );
}
HRESULT LoadVSH0()
{float color[4] = {0,1.0,0,0}; //RGBA
g_pd3dDevice->SetVertexShaderConstantF( 4, (float*)&color, 1 );
float lightDir[4] = {-1,1,1,0};
g_pd3dDevice->SetVertexShaderConstantF( 12, (float*)&lightDir, 1 );
const char strVertexShader0[] =
"vs_1_1 // 版本指令\n"\
"dcl_position v0 // 声明位置寄存器\n"\
"dcl_normal v4 // v0 is position, v4 is normal\n"\
"dcl_texcoord0 v8 // 声明纹理坐标寄存器\n"\
"m4x4 oPos, v0, c0 // 用视/投影矩阵变换顶点\n"\
"mov oT0, v8 // 把漫反射色赋\n";
if( FAILED(D3DXAssembleShader( strVertexShader0,sizeof(strVertexShader0)-1, NULL, NULL, 0, &pCode0, NULL )))
return E_FAIL;
if( FAILED(g_pd3dDevice->CreateVertexShader( (DWORD*)pCode0->GetBufferPointer(),
&m_pVertexShader0 )))
return E_FAIL;
pCode0->Release();
return S_OK;
}
HRESULT InitVB1()
{
D3DXCreateTextureFromFile( g_pd3dDevice, "Tiny_skin.bmp", &m_pDolphinTexture ) ;
// Load the file-based mesh objects
DolphinMesh01.Create( g_pd3dDevice, _T("Tiny.x") ) ;
// Set the FVF type to match the vertex format we want
DolphinMesh01.SetFVF( g_pd3dDevice, D3DVERTEX::FVF );
// Get the number of vertices and faces for the meshes
m_dwNumDolphinVertices = DolphinMesh01.GetSysMemMesh()->GetNumVertices();
m_dwNumDolphinFaces = DolphinMesh01.GetSysMemMesh()->GetNumFaces();
g_pd3dDevice->CreateVertexBuffer( m_dwNumDolphinVertices * sizeof(D3DVERTEX),
D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED,
&m_pDolphinVB1, NULL );
g_pd3dDevice->CreateIndexBuffer( m_dwNumDolphinFaces * 3 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16, D3DPOOL_MANAGED,
&m_pDolphinIB, NULL );
// Copy vertices for mesh 01
DolphinMesh01.GetSysMemMesh()->GetVertexBuffer( &pMeshSourceVB );
m_pDolphinVB1->Lock( 0, 0, (void**)&pDst, 0 );
pMeshSourceVB->Lock( 0, 0, (void**)&pSrc, 0 );
memcpy( pDst, pSrc, m_dwNumDolphinVertices * sizeof(D3DVERTEX) );
m_pDolphinVB1->Unlock();
pMeshSourceVB->Unlock();
pMeshSourceVB->Release();
// Copy indices for the dolphin mesh
DolphinMesh01.GetSysMemMesh()->GetIndexBuffer( &pMeshSourceIB );
m_pDolphinIB->Lock( 0, 0, (void**)&pDst, 0 );
pMeshSourceIB->Lock( 0, 0, (void**)&pSrc, 0 );
memcpy( pDst, pSrc, 3 * m_dwNumDolphinFaces * sizeof(WORD) );
m_pDolphinIB->Unlock();
pMeshSourceIB->Unlock();
pMeshSourceIB->Release();
// Create vertex shader for the dolphin
D3DVERTEXELEMENT9 declDolphin[] =
{
// First stream is first mesh
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};
g_pd3dDevice->CreateVertexDeclaration( declDolphin, &m_pDolphinVertexDeclaration );
DXUtil_FindMediaFileCb( strPath, sizeof(strPath), TEXT("DolphinTween.vsh") );
D3DXAssembleShaderFromFile( strPath, NULL, NULL, 0, &pCode, NULL ) ;
g_pd3dDevice->CreateVertexShader( (DWORD*)pCode->GetBufferPointer(),
&m_pDolphinVertexShader );
/**/
LoadVSH0();
return S_OK;
}
VOID Render1()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
SetMatrix();
// g_pd3dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);
// g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
// Render the dolphin
g_pd3dDevice->SetTexture( 0, m_pDolphinTexture );
g_pd3dDevice->SetVertexDeclaration( m_pDolphinVertexDeclaration );
g_pd3dDevice->SetVertexShader( m_pVertexShader0 );
g_pd3dDevice->SetStreamSource( 0, m_pDolphinVB1, 0, sizeof(D3DVERTEX) );
g_pd3dDevice->SetIndices( m_pDolphinIB );
g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
0, m_dwNumDolphinVertices,
0, m_dwNumDolphinFaces );
g_pd3dDevice->SetTexture( 0,NULL );
g_pd3dDevice->EndScene();
}
g_pd3dDevice-> resent( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Robin", NULL };
RegisterClassEx( &wc );
HWND hWnd = CreateWindow( "Robin", "Robin",
WS_OVERLAPPEDWINDOW, 100, 50, 900, 650,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
if( SUCCEEDED( InitVB1() ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render1();
}
}
}
UnregisterClass( "Robin", wc.hInstance );
return 0;
}
|
|