第一次写博客这个东西,平时自己学习的时候记录的东西都是纸质的,查找不太方便,而且由于自己得不少知识学习都来自优快云。所以在这里做一个我自学的记录!
由于第一次学习Directx,记录的很多东西都是自己简单了解到的。可能不全,甚至可能不对,先记录下,以后修改!
基于VisualC++,Directx学习记录正式开始:
一:基础概念的了解
1.Direct3D的定义:是微软公司创建的多媒体编程接口。由C++实现,被用于Windows,XBOX,XBOX360电子游戏的开发,并且只支持这些平台
2.必要的工具及开发环境:需要一个最新的DirectX SDK。和visual studio (貌似在下载安装VS的时候会自动下载下Directx SDK)SDK下载的文件夹中有个Simples文件,里面有不少的简单代码供于学习
二:初始化Direct3D设备
Direct3D使用之前需要创建一个设备,通过这个设备来调用Direct API;
在Direct3D中设备被分成了两个部分:1.Device (用来创建资源) 2.Devicecontext (用来执行渲染操作)
初始化Direct3D要实现三个目的:1.创建设备。2.创建交换链。3。创建立即执行上下文(context)。 知识补充:1设备,很简单,调用directX API的。2.交换链。交换链上实际保存着两个缓存(buffer)。一个前台缓存,一个后台缓存。缓存上存储着绘制好的图像信息,前台缓存显示在屏幕上时,后台缓存绘制下一个图像信息(如果只有一个缓存的话,切换界面时绘制图画会导致屏幕闪烁)。3,立即执行上下文。用来直接向驱动发送渲染信息。上下文分为两种 立即执行上下文和延迟执行上下文(一般用于分线程); 整体来说。设备是管理资源,交换链是显示资源,上下文是处理资源的(多好理解);
初始化Direct3D的4个步骤:1,填写DXGI_SWAP_CHAIN_DESC(交换链结构)
2,用D3D11CreateDeviceAndSwapChain函数和1中的结构体,创建ID3D11Device(设备),IDXGISwapChain(交换链)和ID3D11DeviceContext;
3.创建渲染视图ID3D11RenderTargetView并将其绑定至管线 (为了让后台缓存可以被渲染)
4,设置视口(一个在windows窗口中用来显示Direct的地方)
三.下面开始简单的代码示例
#include <windows.h> //要用到windows环境和windows窗口
#include <d3d11.h> //用到D3D的API
#include <d3dx11.h> //我电脑中D3D的头文件和库文件位置是C:\Program Files (x86)\Windows Kits\8.1\Include\um
#include <d3dcompiler.h> //应该是着色器的接口函数用到此头文件
#include <xnamath.h> //XNA的数学库
#include "resource.h" //图片资源文件
struct SimpleVertex //定义一个顶点数据类型,这里面只写了位置和颜色,实际上还可以包含很多例如顶点法向量,纹理坐标,镜面反射颜色等
{
XMFLOAT3 Pos;//由三个单精度浮点数组成的顶点的坐标,float4的第四个坐标是齐次坐标
XMFLOAT4 Color;//由4个单精度浮点数组成的颜色坐标,前三位是RGB值,最后一个是Aplha透明度
};
struct ConstantBuffer //世界坐标向视图坐标转换的数据保存矩阵,世界坐标是三维的,想在二维屏幕上显示就需要转换。绘制三维物体都需要这个
{
AMMATRIX wWorld; //保存物体的三维实际坐标
AMMATRIX wView;
AMMATRIX mProjection;
};
//定义了一些全局变量
HINSTANCE g_hInst = NULL;//window窗口用到
HWND g_hWnd = NULL;
D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;//驱动器类型(D3D的执行位置)
D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;//DX版本,这里是DX11
ID3D11Device* g_pd3dDevice = NULL;//设备接口
ID3D11DeviceContext* g_pImmediateContext = NULL;//立即执行上下文接口
IDXGISwapChain* g_pSwapChain = NULL;//交换链接口
ID3D11RenderTargetView* g_pRenderTargetView = NULL;//资源视图接口
ID3D11VertexShader* g_pVertexShader = NULL;//顶点着色器
ID3D11PixelShader* g_pPixelShader = NULL;//像素着色器
ID3D11InputLayout* g_pVertexLayout = NULL;//
ID3D11Buffer* g_pVertexBuffer = NULL;//顶点缓存区
ID3D11Buffer* g_pIndexBuffer = NULL;//索引缓存区
ID3D11Buffer* g_pConstantBuffer = NULL;//世界转换缓存区
XMMATRIX g_World;//世界坐标
XMMATRIX g_View;
XMMATRIX g_Projection;
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );//windows窗口创建函数
HRESULT InitDevice(); //设备初始化函数
void CleanupDevice(); //设备清空函数
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );//windows窗口回调函数
void Render(); //图形绘制函数
//主函数
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
if( FAILED( InitWindow( hInstance, nCmdShow ) ) )//第一步初始化windows窗口
return 0;
if( FAILED( InitDevice() ) ) //初始化设备
{
CleanupDevice();
return 0;
}
// Main message loop
MSG msg = {0};
while( WM_QUIT != msg.message )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )//出错输出
{
TranslateMessage( &msg );
&nbs