📄 light.cpp
字号:
g_pMyd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// 进行透视转换
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/2.5, 1.0f, 1.0f, 100.0f );
g_pMyd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
return;
}
//-----------------------------------------------------------------------------
// 名称: ProcInput()
// 功能: 处理外部控制设备的输入
//-----------------------------------------------------------------------------
VOID ProcInput()
{
if(KEYDOWN(VK_DOWN))
{
g_Player.LookAt[0].x = g_Player.LookAt[0].x-sinf(g_Angle)/20;
g_Player.LookAt[0].z = g_Player.LookAt[0].z-cosf(g_Angle)/20;
g_Player.LookAt[1].x = g_Player.LookAt[1].x-sinf(g_Angle)/20;
g_Player.LookAt[1].z = g_Player.LookAt[1].z-cosf(g_Angle)/20;
g_lightPosition.x = g_lightPosition.x - sinf(g_Angle)/20;
g_lightPosition.z = g_lightPosition.z-cosf(g_Angle)/20;
}
if(KEYDOWN(VK_UP))
{
g_Player.LookAt[0].x = g_Player.LookAt[0].x+sinf(g_Angle)/20;
g_Player.LookAt[0].z = g_Player.LookAt[0].z+cosf(g_Angle)/20;
g_Player.LookAt[1].x = g_Player.LookAt[1].x+sinf(g_Angle)/20;
g_Player.LookAt[1].z = g_Player.LookAt[1].z+cosf(g_Angle)/20;
g_lightPosition.x = g_lightPosition.x+sinf(g_Angle)/20;
g_lightPosition.z = g_lightPosition.z+cosf(g_Angle)/20;
}
if(KEYDOWN(VK_RIGHT))
{
g_Angle+=0.01f;
g_Player.LookAt[1].x = g_Player.LookAt[0].x+sinf(g_Angle);
g_Player.LookAt[1].z = g_Player.LookAt[0].z+cosf(g_Angle);
}
if(KEYDOWN(VK_LEFT))
{
g_Angle-=0.01f;
g_Player.LookAt[1].x = g_Player.LookAt[0].x+sinf(g_Angle);
g_Player.LookAt[1].z = g_Player.LookAt[0].z+cosf(g_Angle);
}
if(KEYDOWN(VK_1))
{
g_TextureOp = D3DTOP_SELECTARG1;
}
else if(KEYDOWN(VK_2))
{
g_TextureOp = D3DTOP_SELECTARG2;
}
else if(KEYDOWN(VK_3))
{
g_TextureOp = D3DTOP_MODULATE;
}
return;
}
//-----------------------------------------------------------------------------
// 名称: RenderSene()
// 功能: 渲染3D场景
//-----------------------------------------------------------------------------
VOID RenderSene()
{
D3DXMATRIX matWorld;
//检查Direct3D设备是否已经创建,如果没有创建就直接返回
if( NULL == g_pMyd3dDevice )
return;
D3DCOLORVALUE color;
color.r = 1.0f;
color.b = 1.0f;
color.g = 1.0f;
// 清除Direct3D设备的后台表面,背景颜色为蓝色RGB(0,0,255)
g_pMyd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,100,255), 1.0f, 0 );
// 打开3D渲染开关
g_pMyd3dDevice->BeginScene();
D3DXMatrixIdentity(&matWorld);
g_pMyd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pMyd3dDevice->SetMaterial( &mtrl );
//**************************************************************
// 渲染地面
//**************************************************************
g_pMyd3dDevice->SetTexture( 0, g_pTextureLand );
g_pMyd3dDevice->SetTexture( 1, NULL );
g_pMyd3dDevice->SetTexture( 2, NULL );
g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
g_pMyd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
g_pMyd3dDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// 设置待渲染顶点的来源
g_pMyd3dDevice->SetStreamSource( 0, g_pMyVxBufferLine, sizeof(CUSTOMVERTEX02) );
// 进行3D渲染,在这里设置渲染的顶点格式,并调用DrawPrimitive完成顶点渲染处理
g_pMyd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX02 );
g_pMyd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
//**************************************************************
// 渲染墙面
//**************************************************************
// 设置待渲染顶点的来源
g_pMyd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, 0xffffffff );
g_pMyd3dDevice->SetTexture( 0, g_pTextureWall0 );
g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
// g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
// g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// g_pMyd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
SetTextureColorStage(g_pMyd3dDevice, 0, D3DTA_TEXTURE,
D3DTOP_SELECTARG1, D3DTA_DIFFUSE);
g_pMyd3dDevice->SetTexture( 1, g_pTextureWall1 );
g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
// g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
// g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
// g_pMyd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
SetTextureColorStage(g_pMyd3dDevice, 1, D3DTA_TEXTURE,
g_TextureOp, D3DTA_CURRENT );
DWORD dwNumPasses;
HRESULT hr;
if( FAILED( hr = g_pMyd3dDevice->ValidateDevice( &dwNumPasses ) ) )
{
return;
}
g_pMyd3dDevice->SetStreamSource( 0, g_pMyVxBufferRec, sizeof(CUSTOMVERTEX02) );
// 进行3D渲染,在这里设置渲染的顶点格式,并调用DrawPrimitive完成顶点渲染处理
g_pMyd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX02 );
float i, j;
for (i = -GRID_WIDTH/2 + 1; i < GRID_WIDTH/2; i+=4)
{
for(j = -GRID_WIDTH/2 + 1; j < GRID_WIDTH/2; j+=4)
{
if((j > -2) && (j < 2))
continue;
// 为不同的墙面设置不同的材质
float r = 1 - 1.0f/i;
float g = 1 - 1.0f/j;
float a = 1 - 1.0f/(i+j);
mtrl.Diffuse.r = mtrl.Ambient.r = r;
mtrl.Diffuse.g = mtrl.Ambient.g = g;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = a;
mtrl.Specular.r = mtrl.Specular.g =mtrl.Specular.b = 1.0f;
mtrl.Specular.a = 1.0f;
mtrl.Power = 50.0f;
g_pMyd3dDevice->SetMaterial( &mtrl );
D3DXMatrixTranslation( &matWorld, j, 0, i );
g_pMyd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
g_pMyd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
}
g_pMyd3dDevice->SetTexture( 0, NULL );
// 关闭3D渲染开关
g_pMyd3dDevice->EndScene();
// 展现后台表面到窗口的客户区域中,即把渲染后的图像显示到窗口中
g_pMyd3dDevice->Present( NULL, NULL, NULL, NULL );
return;
}
//-----------------------------------------------------------------------------
// 名称: Cleanup()
// 功能: 释放创建过的Direct3D对象和设备
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if( g_pTextureWall0 != NULL )
g_pTextureWall0->Release();
if( g_pTextureWall1 != NULL )
g_pTextureWall1->Release();
if( g_pTextureLand != NULL )
g_pTextureLand->Release();
if(g_pMyVxBufferRec != NULL)
g_pMyVxBufferRec->Release();
if(g_pMyVxBufferLine != NULL)
g_pMyVxBufferLine->Release();
// 释放时的顺序为先释放后创建的对象,设备后创建,先释放
if( g_pMyd3dDevice != NULL)
g_pMyd3dDevice->Release();
// Direct3D对象最先创建,但需要最后释放
if( g_pMyD3D != NULL)
g_pMyD3D->Release();
return;
}
//-----------------------------------------------------------------------------
// 名称: MsgProc()
// 功能: Windows的消息处理函数
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// 名称: WinMain()
// 功能: Windows主函数,程序启动时,从这里开始执行
//-----------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 定义一个Windows类,指定消息的处理函数为MsgProc
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
MY_WINCLASS_NAME, NULL };
// 注册这个窗口类
RegisterClassEx( &wc );
// 创建应用程序窗口
HWND hWnd = CreateWindow( MY_WINCLASS_NAME, "3D游戏编程——纹理",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// 调用InitMy3D函数进行3D对象和设备的创建,传入参数为窗口的句柄hWnd
if( SUCCEEDED( InitMy3D( hWnd ) ) )
{
// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// 程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成
MSG msg;
while( msg.message != WM_QUIT)
{
if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
ProcInput();
MatricesTrans();
RenderSene();
}
}
// 调用Cleanup函数清除3D对象和设备
Cleanup();
// 注销窗口类
UnregisterClass( MY_WINCLASS_NAME, wc.hInstance );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -