完整代码看这里。
Tutorial07.fx
Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );
cbuffer cbNeverChanges : register( b0 )
{
matrix view;
};
cbuffer cbChangeOnResize : register( b1 )
{
matrix projection;
};
cbuffer cbChangesEveryFrame : register( b2 )
{
matrix world;
float4 vMeshColor;
};
//--------------------------------------------------------------------------------------
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
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.Tex = input.Tex;
return output;
}
float4 PS( PS_INPUT input) : SV_Target
{
return txDiffuse.Sample( samLinear, input.Tex ) * vMeshColor;
}
main.cpp
#include <Windows.h>
#include <d3d11.h>
#include <D3DX11.h>
#include <D3Dcompiler.h>
#include <xnamath.h>
#include <tchar.h>
//顶点结构
struct SimpleVertex
{
XMFLOAT3 Pos;
XMFLOAT2 Tex;
};
//常缓存结构,包括相机矩阵,和光照等
struct CBNeverChanges
{
XMMATRIX mView;
};
struct CBChangeOnResize
{
XMMATRIX mProjection;
};
struct CBChangesEveryFrame
{
XMMATRIX mWorld;
XMFLOAT4 vMeshColor;
};
//全局变量
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;//像素着色器
ID3D11InputLayout* g_inputLayout = NULL;//输入布局
ID3D11Buffer* g_vertexBuffer = NULL;//顶点缓存
ID3D11Buffer* g_indexBuffer = NULL;//索引缓存
ID3D11Buffer* g_pCBNeverChanges = NULL;
ID3D11Buffer* g_pCBChangeOnResize = NULL;
ID3D11Buffer* g_pCBChangesEveryFrame = NULL;
ID3D11ShaderResourceView* g_pTextureRV = NULL;
ID3D11SamplerState* g_pSamplerLinear = NULL;
XMMATRIX g_world;
XMMATRIX g_view;
XMMATRIX g_projection;
XMFLOAT4 g_vMeshColor( 0.7f, 0.7f, 0.7f, 1.0f );
//全局函数
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.cb