函数名前缀反映出处于管道的哪个阶段。
IA = Input Assembler
VS = Vertex Shader
GS = Geometry Shader
SO = Stream Out
RS = Rasterizer Stage
PS = Pixel Shader
OM = OutputMerger
Direct3D9 VS Direct3D11
IDirect3DDevice9 | ID3D11Device |
IDirect3D9 | IDXGIFactory, IDXGIAdapter, IDXGIDevice |
IDirect3DDevice9::Present | IDXGISwapChain::Present |
IDirect3DDevice9::TestCooperativeLevel | IDXGISwapChain::Present with PRESENT_TEST |
IDXGIAdapter 描述显卡,显存,列举IDXGIOutput 等。
IDXGIOutput 描述显示器
IDXGISwapChain ::SetFullScreenState | 转换全屏或窗口模式 |
::ResizeTarget | 改变全屏或窗口的视频模式 |
::ResizeBuffers | 调整后备缓存的大小 |
IDirect3DBaseTexture9 | ID3D11Buffer |
IDirect3DTexture9 | ID3D11Texture1D |
IDirect3DCubeTexture9 | ID3D11Texture2D |
IDirect3DVolumeTexture9, IDirect3DIndexBuffer9, IDirect3DVertexBuffer9 | ID3D11Textrue3D |
大部分资源为ID3DBuffers,由ID3D11Device::CreateBuffer()创建。
纹理资源为ID3D11Texture(1-3)D,由ID3D11Device::CreateTexture(1-3)D创建。
IDirect3DVertexShader9 | ID3D11VertexShader |
IDirect3DPixelShader9 | ID3D11PixelShader, ID3D11GeometryShader |
IDirect3DVertexDeclaration9 | ID3D11InputLayout |
着色器由ID3D11Device::CreateVertexShader()或者::CreateGeometry()Shader或者::CreatePixelShader()创建
输入层由ID3D11Device::CreateInputLayout()创建。
从资源数据类型中分离出来 | ID3D11ShaderResourceView (纹理和原始缓存视图绑定到VS,GS或者PS) |
允许相同数据重新解释成多重类型 | ID3D11RenderTargetView 或者ID3D11DepthStencilView(绑定到OM阶段) |
视图由CreateRenderTargetView()或者CreateShaderResourceView()或者CreateDepthStencilView()创建。
着色器资源绑定到管道着色阶段由ID3D11DeviceContext::(V,G,P)SSetShaderResources()设置。
常量缓存通过绑定到着色阶段由ID3D11DeviceContext::(V,G,P)SSetConstantBuffers()设置。
IDirect3DDevice9::SetRenderState | ID3D11BlendState, ID3D11DepthStencilState, ID3D11RasterizerState |
IDirect3DDevice9::SetTextureStageState | ID3D11SamplerState |
状态对象由ID3D11Device::CreateBlednState(),::CreateDepthStecilState(),::CreateRasterizerState()::CreateSamplerState()创建。一旦创建就不能改变。
Blend和DepthStencil状态绑定到OM阶段由ID3D11DeviceContext::OMSetBlendState(),::OMSetDepthStencilState()设置。
光栅器状态绑定到RS阶段由ID3D11DeviceContext::RSSetState()设置。
采样阶段绑定到各个管道着色阶段由ID3D11DeviceContext::(V,G,P)SSetSamplers()设置。
IDirect3DDevice9 ::DrawPrimitive, ::DrawIndexedPrimitive | ID3D11DeviceContext ::Draw(), ::DrawAuto(), ::DrawIndexed(), ::DrawIndexedInstanced(), ::DrawInstanced(), ::IASetPrimitiveTopology() |
创建参考设备
1.初始化交换链
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &sd, sizeof( sd ) );
sd.BufferCount = 1;
sd.BufferDesc.Width = 640;
sd.BufferDesc.Height = 480;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = g_hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
2.申明D3D11特征层。
D3D_FEATURE_LEVEL FeatureLevels = D3D_FEATURE_LEVEL_11_0;
3.创建设备
HRESULT hr = S_OK;
hr = D3D11CreateDeviceAndSwapChain(NULL,
D3D_DRIVER_TYPE_REFERENCE, NULL, 0, &feature_levels, 1,
D3D11_SDK_VERSION, &sd, &swap_chain_, &d3d_device_,
&feature_level, &immediate_context_);
return hr;
绑定渲染目标
HRESULT hr = S_OK;
ID3D11Resource* back_buffer;
if (FAILED(swap_chain_->GetBuffer(0, __uuidof(ID3D11Resource), (LPVOID*)&back_buffer)))
hr = S_FALSE;
hr = d3d_device_->CreateRenderTargetView(back_buffer, NULL, &render_target_view_);
back_buffer->Release();
immediate_context_->OMSetRenderTargets(1, &render_target_view_, NULL);
return hr;
其中ID3D11RenderTargetView* render_target_view_;设置为全局或类变量。
初始化视口
D3D11_VIEWPORT vp;
vp.Width = (FLOAT)640;
vp.Height = (FLOAT)480;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
immediate_context_->RSSetViewports(1, &vp);
vp.Width = (FLOAT)640;
vp.Height = (FLOAT)480;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
immediate_context_->RSSetViewports(1, &vp);
渲染
float clear_color[4] = {0.0f, 0.125f, 0.3f, 1.0f};
immediate_context_->ClearRenderTargetView(render_target_view_, clear_color);
swap_chain_->Present(0,0);
swap_chain_->Present(0,0);