DirectX11-Sample-Tutorial06-光照

本文主要是对旋转立方体加光照。完整代码看这里



Tutorial06.fx

//--------------------------------------------------------------------------------------
// Constant Buffer Variables
//--------------------------------------------------------------------------------------
cbuffer ConstantBuffer : register( b0 )
{
	matrix World;
	matrix View;
	matrix Projection;
	float4 vLightDir[2];
	float4 vLightColor[2];
	float4 vOutputColor;
}


//--------------------------------------------------------------------------------------
struct VS_INPUT
{
    float4 Pos : POSITION;
    float3 Norm : NORMAL;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float3 Norm : TEXCOORD0;
};


//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output = (PS_INPUT)0;
    output.Pos = mul( input.Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Norm = mul( input.Norm, World );
    
    return output;
}


//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 PS( PS_INPUT input) : SV_Target
{
    float4 finalColor = 0;
    
    //do NdotL lighting for 2 lights
    for(int i=0; i<2; i++)
    {
        finalColor += saturate( dot( (float3)vLightDir[i],input.Norm) * vLightColor[i] );
    }
    finalColor.a = 1;
    return finalColor;
}


//--------------------------------------------------------------------------------------
// PSSolid - render a solid color
//--------------------------------------------------------------------------------------
float4 PSSolid( PS_INPUT input) : SV_Target
{
    return vOutputColor;
}

main.cpp

#include <Windows.h>
#include <d3d11.h>
#include <D3DX11.h>
#include <D3Dcompiler.h>
#include <xnamath.h>
#include <tchar.h>

//顶点结构
struct SimpleVertex 
{
	XMFLOAT3 Pos;
	XMFLOAT3 Normal;
};

//常缓存结构,包括相机矩阵,和光照等
struct ConstantBuffer
{
	XMMATRIX world;
	XMMATRIX view;
	XMMATRIX projection;//相机矩阵

	XMFLOAT4 vLightDir[2];//光照方向
	XMFLOAT4 vLightColor[2];//光照颜色
	XMFLOAT4 vOutputColor;//输出颜色
};

//全局变量
HINSTANCE g_hInstance	=	NULL;//进程句柄
HWND g_hWnd	=	NULL;//窗口句柄

D3D_DRIVER_TYPE g_driverType	=	D3D_DRIVER_TYPE_HARDWARE;//驱动类型
D3D_FEATURE_LEVEL g_featureLevel	=	D3D_FEATURE_LEVEL_11_0;//SDK版本

ID3D11Device* g_device	=	NULL;//设备,显卡
ID3D11DeviceContext* g_deviceContext	=	NULL;//设备上下文
IDXGISwapChain* g_swapChain	=	NULL;//交换链
ID3D11RenderTargetView* g_renderTargetView	=	NULL;//渲染目标视图

ID3D11Texture2D* g_depthBuffer	=	NULL;//深度缓存
ID3D11DepthStencilView* g_depthStencilView	=	NULL;//深度模板视图

ID3D11VertexShader* g_vertexShader	=	NULL;//顶点着色器
ID3D11PixelShader* g_pixelShader	=	NULL;//像素着色器
ID3D11PixelShader* g_pixelShaderSolid	=	NULL;

ID3D11InputLayout* g_inputLayout	=	NULL;//输入布局
ID3D11Buffer* g_vertexBuffer	=	NULL;//顶点缓存
ID3D11Buffer* g_indexBuffer	=	NULL;//索引缓存

ID3D11Buffer* g_constantBuffer	=	NULL;//常缓存
XMMATRIX g_world;
XMMATRIX g_view;
XMMATRIX g_projection;

//全局函数
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );//初始化窗口
HRESULT InitDevice();//初始化d3d设备
HRESULT CompileFromFile( WCHAR* filename, LPCSTR entrypoint, LPCSTR shaderModel, ID3DBlob** ppBlob );//编译着色器文件
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );//窗口过程函数
void Render();//渲染
void ShutdownDevice();//关闭设备

//主函数
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, LPWSTR nCmdLine, int nCmdShow )
{
	//初始化窗口
	if ( FAILED( InitWindow( hInstance, nCmdShow ) ) )
	{
		return 0;
	}

	//初始化设备
	if ( FAILED( InitDevice() ) )
	{
		return 0;
	}

	//循环接收消息
	MSG msg;
	ZeroMemory( &msg, sizeof( msg ) );
	while( msg.message != WM_QUIT )
	{
		if ( PeekMessage( &msg, g_hWnd, 0, 0, PM_REMOVE ) )
		{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
		else
		{
			Render();
		}
	}

	ShutdownDevice();

	return ( int )msg.wParam;
}

HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
	//初始化窗口类
	WNDCLASSEX wcex;
	wcex.cbClsExtra		=	0;
	wcex.cbSize			=	sizeof( WNDCLASSEX );
	wcex.cbWndExtra		=	0;
	wcex.hbrBackground	=	( HBRUSH )GetStockObject( BLACK_BRUSH );
	wcex.hCursor		=	LoadCursor( hInstance, IDC_CROSS );
	wcex.hIcon			=	LoadIcon( hInstance, IDI_WINLOGO );
	wcex.hIconSm		=	wcex.hIcon;
	wcex.hInstance		=	hInstance;
	wcex.lpfnWndProc	=	WndProc;
	wcex.lpszClassName	=	_T("Tutorial06-Class");
	wcex.lpszMenuName	=	NULL;
	wcex.style			=	CS_HREDRAW | CS_VREDRAW;

	//注册窗口类
	if ( !RegisterClassEx( &wcex ) )
	{
		return E_FAIL;
	}

	//创建窗口
	g_hWnd	=	CreateWindow( _T("Tutorial06-Class"),
							  _T("Tutorial06-Window"),
							  WS_OVERLAPPEDWINDOW,
							  CW_USEDEFAULT,
							  CW_USEDEFAULT,
							  640,
							  480,
							  NULL,
							  NULL,
							  hInstance,
							  NULL );
	if ( !g_hWnd )
	{
		return E_FAIL;
	}

	//显示窗口
	ShowWindow( g_hWnd, nCmdShow );

	g_hInstance	=	hInstance;

	return S_OK;
}

HRESULT CompileFromFile( WCHAR* filename, LPCSTR entrypoint, LPCSTR shaderModel, ID3DBlob** ppBlob )
{
	HRESULT hResult;
	ID3DBlob* pErrorBlob;
	hResult	=	D3DX11CompileFromFile( filename, NULL, NULL, entrypoint, shaderModel,
									   D3DCOMPILE_ENABLE_STRICTNESS, 0, NULL, ppBlob, &pErrorBlob, NULL );
	if ( FAILED( hResult ) )
	{
		if ( pErrorBlob != NULL )
		{
			OutputDebugStringA( ( char* )pErrorBlob->GetBufferPointer() );
			pErrorBlob->Release();
			pErrorBlob	=	NULL;
		}
		return hResult;
	}

	if ( pErrorBlob )
	{
		pErrorBlob->Release();
	}

	return S_OK;
}

HRESULT InitDevice()
{
	HRESULT hResult;
	//-----------------------------------------------------------------------------------------
	//初始化交换链描述
	DXGI_SWAP_CHAIN_DESC swapChainDesc;
	ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) );

	UINT nScreenWidth	=	640;
	UINT nScreenHeight	=	480;
	D3D_DRIVER_TYPE driverTypes[]	=	{
		D3D_DRIVER_TYPE_HARDWARE,
		D3D_DRIVER_TYPE_WARP,
		D3D_DRIVER_TYPE_REFERENCE
	};
	UINT nNumDriverTypes	=	ARRAYSIZE( driverTypes );
	D3D_FEATURE_LEVEL featureLevels[]	=	{
		D3D_FEATURE_LEVEL_11_0,
		D3D_FEATURE_LEVEL_10_1,
		D3D_FEATURE_LEVEL_10_0
	};
	UINT nNumFeatureLevels	=	ARRAYSIZE( featureLevels );

	swapChainDesc.BufferCount	=	1;
	swapChainDesc.BufferDesc.Format		=	DXGI_FORMAT_B8G8R8A8_UNORM;
	swapChainDesc.BufferDesc.Width		=	nScreenWidth;
	swapChainDesc.BufferDesc.Height		=	nScreenHeight;
	swapChainDesc.BufferDesc.RefreshRate.Numerator		=	60;
	swapChainDesc.BufferDesc.RefreshRate.Denominator	=	1;
	swapChainDesc.BufferUsage	=	DXGI_USAGE_RENDER_TARGET_OUTPUT;
	swapChainDesc.OutputWindow	=	g_hWnd;
	swapChainDesc.SampleDesc.Count		=	1;
	swapChainDesc.SampleDesc.Quality	=	0;
	swapChainDesc.Windowed				=	true;

	//创建交换链
	for ( UINT i=0; i<nNumDriverTypes; i++ )
	{
		g_driverType	=	driverTypes[i];
		hResult	=	D3D11CreateDeviceAndSwapChain( NULL,
												   g_driverType,
												   NULL,
												   0,
												   featureLevels,
												   nNumFeatureLevels,
												   D3D11_SDK_VERSION,
												   &swapChainDesc,
												   &g_swapChain,
												   &g_device,
												   &g_featureLevel,
												   &g_deviceContext );
		if ( SUCCEEDED( hResult ) )
		{
			break;
		}
	}

	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//创建渲染目标视图
	ID3D11Texture2D* backBufer;
	hResult	=	g_swapChain->GetBuffer( 0,
										__uuidof( ID3D11Texture2D ),
										( LPVOID* )&backBufer );//获取后备缓存
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	hResult	=	g_device->CreateRenderTargetView( backBufer,
												  NULL, 
												  &g_renderTargetView );//创建于后备缓存链接的渲染目标视图
	if ( backBufer )
	{
		backBufer->Release();
		backBufer	=	NULL;
	}
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//-----------------------------------------------------------------------------------------------
	//创建深度缓存
	D3D11_TEXTURE2D_DESC depthBufferDesc;
	ZeroMemory( &depthBufferDesc, sizeof( depthBufferDesc ) );
	depthBufferDesc.Width		=	nScreenWidth;
	depthBufferDesc.Height		=	nScreenHeight;
	depthBufferDesc.ArraySize	=	1;
	depthBufferDesc.BindFlags	=	D3D11_BIND_DEPTH_STENCIL;
	depthBufferDesc.CPUAccessFlags	=	0;
	depthBufferDesc.Format		=	DXGI_FORMAT_D24_UNORM_S8_UINT;
	depthBufferDesc.MipLevels	=	1;
	depthBufferDesc.MiscFlags	=	0;
	depthBufferDesc.SampleDesc.Count	=	1;
	depthBufferDesc.SampleDesc.Quality	=	0;
	depthBufferDesc.Usage		=	D3D11_USAGE_DEFAULT;
	
	hResult	=	g_device->CreateTexture2D( &depthBufferDesc,
										   NULL,
										   &g_depthBuffer );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//创建深度模板视图
	D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
	ZeroMemory( &depthStencilViewDesc, sizeof( depthStencilViewDesc ) );
	depthStencilViewDesc.Format	=	depthBufferDesc.Format;
	depthStencilViewDesc.ViewDimension	=	D3D11_DSV_DIMENSION_TEXTURE2D;
	depthStencilViewDesc.Texture2D.MipSlice	=	0;
	hResult	=	g_device->CreateDepthStencilView( g_depthBuffer,
												  &depthStencilViewDesc,
												  &g_depthStencilView );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}
	g_deviceContext->OMSetRenderTargets( 1, &g_renderTargetView, g_depthStencilView );

	//-------------------------------------------------------------------------------------------------
	//创建视口
	D3D11_VIEWPORT viewport;
	viewport.Width	=	(FLOAT)nScreenWidth;
	viewport.Height	=	(FLOAT)nScreenHeight;
	viewport.MinDepth	=	0.0f;
	viewport.MaxDepth	=	1.0f;
	viewport.TopLeftX	=	0;
	viewport.TopLeftY	=	0;
	g_deviceContext->RSSetViewports( 1, &viewport );

	//----------------------------------------------------------------------------------------------------
	//编译顶点着色器
	ID3DBlob* pVSBlob;
	hResult	=	CompileFromFile( _T("Tutorial06.fx"),
								 "VS",
								 "vs_4_0",
								 &pVSBlob );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	hResult	=	g_device->CreateVertexShader( pVSBlob->GetBufferPointer(),
											  pVSBlob->GetBufferSize(),
											  NULL,
											  &g_vertexShader );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//定义输入布局
	D3D11_INPUT_ELEMENT_DESC layout[]	=	{
		{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },//顶点
		{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },//法线
	};
	UINT nNumElements	=	ARRAYSIZE( layout );

	hResult	=	g_device->CreateInputLayout( layout,
											 nNumElements,
											 pVSBlob->GetBufferPointer(),
											 pVSBlob->GetBufferSize(),
											 &g_inputLayout );
	if ( pVSBlob )
	{
		pVSBlob->Release();
		pVSBlob	=	NULL;
	}
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	g_deviceContext->IASetInputLayout( g_inputLayout );

	//编译像素着色器
	ID3DBlob* pPSBlob;
	hResult	=	CompileFromFile( _T("Tutorial06.fx"),
								 "PS",
								 "ps_4_0",
								 &pPSBlob );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	hResult	=	g_device->CreatePixelShader( pPSBlob->GetBufferPointer(),
											 pPSBlob->GetBufferSize(),
											 NULL,
											 &g_pixelShader );
	if ( pPSBlob )
	{
		pPSBlob->Release();
		pPSBlob	=	NULL;
	}
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	hResult	=	CompileFromFile( _T("Tutorial06.fx"),
								 "PSSolid",
								 "ps_4_0",
								 &pPSBlob );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	hResult	=	g_device->CreatePixelShader( pPSBlob->GetBufferPointer(),
											 pPSBlob->GetBufferSize(),
											 NULL,
											 &g_pixelShaderSolid );
	if ( pPSBlob )
	{
		pPSBlob->Release();
		pPSBlob	=	NULL;
	}
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//------------------------------------------------------------------------------------------------------------
	//创建顶点缓存
	SimpleVertex vertices[] =
	{
		{ XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
		{ XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },

		{ XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) },
		{ XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) },

		{ XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ) },

		{ XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT3( 1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT3( 1.0f, 0.0f, 0.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT3( 1.0f, 0.0f, 0.0f ) },

		{ XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT3( 0.0f, 0.0f, -1.0f ) },
		{ XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT3( 0.0f, 0.0f, -1.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 0.0f, -1.0f ) },
		{ XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 0.0f, -1.0f ) },

		{ XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
		{ XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
		{ XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
		{ XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
	};

	D3D11_BUFFER_DESC bufferDesc;
	ZeroMemory( &bufferDesc, sizeof( bufferDesc ) );
	bufferDesc.Usage		=	D3D11_USAGE_DEFAULT;
	bufferDesc.ByteWidth	=	sizeof( SimpleVertex ) * 24;
	bufferDesc.BindFlags	=	D3D11_BIND_VERTEX_BUFFER;//顶点缓存
	bufferDesc.CPUAccessFlags	=	0;

	D3D11_SUBRESOURCE_DATA initData;
	initData.pSysMem	=	vertices;

	hResult	=	g_device->CreateBuffer( &bufferDesc, &initData, &g_vertexBuffer );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	UINT stride	=	sizeof( SimpleVertex );
	UINT offset	=	0;
	g_deviceContext->IASetVertexBuffers( 0, 1, &g_vertexBuffer, &stride, &offset );

	//创建索引缓存
	WORD indices[] =
	{
		3,1,0,
		2,1,3,

		6,4,5,
		7,4,6,

		11,9,8,
		10,9,11,

		14,12,13,
		15,12,14,

		19,17,16,
		18,17,19,

		22,20,21,
		23,20,22
	};

	bufferDesc.Usage	=	D3D11_USAGE_DEFAULT;
	bufferDesc.ByteWidth	=	sizeof( WORD ) * 36; //36个索引,12个三角面片
	bufferDesc.BindFlags	=	D3D11_BIND_INDEX_BUFFER;
	bufferDesc.CPUAccessFlags	=	0;

	initData.pSysMem	=	indices;

	hResult	=	g_device->CreateBuffer( &bufferDesc, &initData, &g_indexBuffer );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	g_deviceContext->IASetIndexBuffer( g_indexBuffer, DXGI_FORMAT_R16_UINT, 0 );
	g_deviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

	//创建常缓存
	bufferDesc.Usage	=	D3D11_USAGE_DEFAULT;
	bufferDesc.ByteWidth	=	sizeof( ConstantBuffer );
	bufferDesc.BindFlags	=	D3D11_BIND_CONSTANT_BUFFER;
	bufferDesc.CPUAccessFlags	=	0;

	hResult	=	g_device->CreateBuffer( &bufferDesc, NULL, &g_constantBuffer );
	if ( FAILED( hResult ) )
	{
		return hResult;
	}

	//创建相机矩阵
	g_world	=	XMMatrixIdentity();

	XMVECTOR Eye = XMVectorSet( 0.0f, 4.0f, -10.0f, 0.0f );
	XMVECTOR At = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
	XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
	g_view = XMMatrixLookAtLH( Eye, At, Up );

	g_projection = XMMatrixPerspectiveFovLH( XM_PIDIV4, nScreenWidth / (FLOAT)nScreenHeight, 0.01f, 100.0f );
	
	return S_OK;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	PAINTSTRUCT ps;
	HDC hdc;

	switch( uMsg )
	{
	case WM_PAINT:
		hdc = BeginPaint( hWnd, &ps );
		EndPaint( hWnd, &ps );
		break;

	case WM_DESTROY:
		PostQuitMessage( 0 );
		break;

	default:
		return DefWindowProc( hWnd, uMsg, wParam, lParam );
	}

	return 0;
}

void Render()
{
	//-----------------------------------------------------------------
	//清除背景
	float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f };
	g_deviceContext->ClearRenderTargetView( g_renderTargetView, ClearColor );
	g_deviceContext->ClearDepthStencilView( g_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

	//--------------------------------------------------------------------
	//设置相机矩阵
	static float t = 0.0f;
	if( g_driverType == D3D_DRIVER_TYPE_REFERENCE )
	{
		t += ( float )XM_PI * 0.0125f;
	}
	else
	{
		static DWORD dwTimeStart = 0;
		DWORD dwTimeCur = GetTickCount();
		if( dwTimeStart == 0 )
			dwTimeStart = dwTimeCur;
		t = ( dwTimeCur - dwTimeStart ) / 1000.0f;
	}

	g_world	=	XMMatrixRotationY( t );

	XMFLOAT4 vLightDirs[2] =
	{
		XMFLOAT4( -0.577f, 0.577f, -0.577f, 1.0f ),
		XMFLOAT4( 0.0f, 0.0f, -1.0f, 1.0f ),
	};

	XMFLOAT4 vLightColors[2] =
	{
		XMFLOAT4( 0.5f, 0.5f, 0.5f, 1.0f ),
		XMFLOAT4( 0.5f, 0.0f, 0.0f, 1.0f )
	};

	XMMATRIX mRotate = XMMatrixRotationY( -2.0f * t );
	XMVECTOR vLightDir = XMLoadFloat4( &vLightDirs[1] );
	vLightDir = XMVector3Transform( vLightDir, mRotate );
	XMStoreFloat4( &vLightDirs[1], vLightDir );

	ConstantBuffer cb1;
	cb1.world	=	XMMatrixTranspose( g_world );
	cb1.view	=	XMMatrixTranspose( g_view );
	cb1.projection	=	XMMatrixTranspose( g_projection );
	cb1.vLightDir[0]	=	vLightDirs[0];
	cb1.vLightDir[1]	=	vLightDirs[1];
	cb1.vLightColor[0]	=	vLightColors[0];
	cb1.vLightColor[1]	=	vLightColors[1];
	cb1.vOutputColor	=	XMFLOAT4( 0,0,0,0 );
	
	g_deviceContext->UpdateSubresource( g_constantBuffer, 0, NULL, &cb1, 0, 0 );
	g_deviceContext->VSSetShader( g_vertexShader, NULL, 0 );
	g_deviceContext->VSSetConstantBuffers( 0, 1, &g_constantBuffer );
	g_deviceContext->PSSetShader( g_pixelShader, NULL, 0 );
	g_deviceContext->PSSetConstantBuffers( 0, 1, &g_constantBuffer );
	g_deviceContext->DrawIndexed( 36, 0, 0);

	//---------------------------------------------------------------
	for ( int m=0; m<2; m++ )
	{
		XMMATRIX mLight	=	XMMatrixTranslationFromVector( 5.0f * XMLoadFloat4( &vLightDirs[m] ) );
		XMMATRIX mLightScale = XMMatrixScaling( 0.2f, 0.2f, 0.2f );
		mLight = mLightScale * mLight;

		cb1.world = XMMatrixTranspose( mLight );
		cb1.vOutputColor = vLightColors[m];
		g_deviceContext->UpdateSubresource( g_constantBuffer, 0, NULL, &cb1, 0, 0 );

		g_deviceContext->PSSetShader( g_pixelShaderSolid, NULL, 0 );
		g_deviceContext->DrawIndexed( 36, 0, 0 );
	}

	//---------------------------------------------------------------------------------
	g_swapChain->Present( 0, 0 );
	return ;
}


void ShutdownDevice()
{
	if ( g_deviceContext )
	{
		g_deviceContext->ClearState();
	}

	if ( g_constantBuffer )
	{
		g_constantBuffer->Release();
		g_constantBuffer	=	NULL;
	}

	if ( g_vertexBuffer )
	{
		g_vertexBuffer->Release();
		g_vertexBuffer	=	NULL;
	}

	if ( g_indexBuffer )
	{
		g_indexBuffer->Release();
		g_indexBuffer	=	NULL;
	}

	if ( g_inputLayout )
	{
		g_inputLayout->Release();
		g_inputLayout	=	NULL;
	}

	if ( g_vertexShader )
	{
		g_vertexShader->Release();
		g_vertexShader	=	NULL;
	}

	if ( g_pixelShaderSolid )
	{
		g_pixelShaderSolid->Release();
		g_pixelShaderSolid	=	NULL;
	}

	if ( g_pixelShader )
	{
		g_pixelShader->Release();
		g_pixelShader	=	NULL;
	}

	if ( g_depthBuffer )
	{
		g_depthBuffer->Release();
		g_depthBuffer	=	NULL;
	}

	if ( g_depthStencilView )
	{
		g_depthStencilView->Release();
		g_depthStencilView	=	NULL;
	}

	if ( g_renderTargetView )
	{
		g_renderTargetView->Release();
		g_renderTargetView	=	NULL;
	}

	if ( g_swapChain )
	{
		g_swapChain->Release();
		g_swapChain	=	NULL;
	}

	if ( g_deviceContext )
	{
		g_deviceContext->Release();
		g_deviceContext	=	NULL;
	}

	if ( g_device )
	{
		g_device->Release();
		g_device	=	NULL;
	}
	return ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值