本文主要是对旋转立方体加光照。完整代码看这里。
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 ;
}