Direct3D 11 API 改编自Intro_to_Direct3D10

来源:互联网 发布:淘宝太坑了女主角视频 编辑:程序博客网 时间:2024/05/19 05:41

函数名前缀反映出处于管道的哪个阶段。

 IA = Input Assembler


VS = Vertex Shader


GS = Geometry Shader


SO = Stream Out


RS = Rasterizer Stage


PS = Pixel Shader


OM = OutputMerger






Direct3D9                  VS                  Direct3D11

IDirect3DDevice9 ID3D11DeviceIDirect3D9IDXGIFactory, IDXGIAdapter, IDXGIDeviceIDirect3DDevice9::PresentIDXGISwapChain::PresentIDirect3DDevice9::TestCooperativeLevelIDXGISwapChain::Present with  PRESENT_TEST

IDXGIAdapter 描述显卡,显存,列举IDXGIOutput 等。

IDXGIOutput 描述显示器 

IDXGISwapChain
::SetFullScreenState转换全屏或窗口模式::ResizeTarget改变全屏或窗口的视频模式::ResizeBuffers调整后备缓存的大小


IDirect3DBaseTexture9ID3D11BufferIDirect3DTexture9ID3D11Texture1DIDirect3DCubeTexture9ID3D11Texture2DIDirect3DVolumeTexture9,
IDirect3DIndexBuffer9,
IDirect3DVertexBuffer9ID3D11Textrue3D

大部分资源为ID3DBuffers,由ID3D11Device::CreateBuffer()创建。
纹理资源为ID3D11Texture(1-3)D,由ID3D11Device::CreateTexture(1-3)D创建。
IDirect3DVertexShader9ID3D11VertexShaderIDirect3DPixelShader9 ID3D11PixelShader,
ID3D11GeometryShaderIDirect3DVertexDeclaration9ID3D11InputLayout
着色器由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::SetRenderStateID3D11BlendState,
ID3D11DepthStencilState,
ID3D11RasterizerStateIDirect3DDevice9::SetTextureStageStateID3D11SamplerState
状态对象由ID3D11Device::CreateBlednState(),::CreateDepthStecilState(),::CreateRasterizerState()::CreateSamplerState()创建。一旦创建就不能改变。
Blend和DepthStencil状态绑定到OM阶段由ID3D11DeviceContext::OMSetBlendState(),::OMSetDepthStencilState()设置。
光栅器状态绑定到RS阶段由ID3D11DeviceContext::RSSetState()设置。 
采样阶段绑定到各个管道着色阶段由ID3D11DeviceContext::(V,G,P)SSetSamplers()设置。

IDirect3DDevice9
::DrawPrimitive,
::DrawIndexedPrimitiveID3D11DeviceContext
::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);

渲染
  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);