您的位置:首页 > 其它

Direct3D 11 API 改编自Intro_to_Direct3D10

2011-12-22 12:06 337 查看
函数名前缀反映出处于管道的哪个阶段。



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
IDirect3D9IDXGIFactory, IDXGIAdapter, IDXGIDevice
IDirect3DDevice9::PresentIDXGISwapChain::Present
IDirect3DDevice9::TestCooperativeLevelIDXGISwapChain::Present with PRESENT_TEST
IDXGIAdapter 描述显卡,显存,列举IDXGIOutput 等。

IDXGIOutput 描述显示器

IDXGISwapChain

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

IDirect3DIndexBuffer9,

IDirect3DVertexBuffer9
ID3D11Textrue3D
大部分资源为ID3DBuffers,由ID3D11Device::CreateBuffer()创建。
纹理资源为ID3D11Texture(1-3)D,由ID3D11Device::CreateTexture(1-3)D创建。

IDirect3DVertexShader9ID3D11VertexShader
IDirect3DPixelShader9 ID3D11PixelShader,

ID3D11GeometryShader
IDirect3DVertexDeclaration9ID3D11InputLayout
着色器由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,

ID3D11RasterizerState
IDirect3DDevice9::SetTextureStageStateID3D11SamplerState
状态对象由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);

渲染
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: