DirectX11(一)
来源:互联网 发布:html嵌入php 编辑:程序博客网 时间:2024/06/07 13:36
前言
开始接触到DirectX是大四时买了本《DIRECTX.9.0.3D游戏开发编程基础》开始的,当时只是照着书把书上的例子敲了一遍,由于不知道D3D的这些API背后的原理,看起来非常吃力,到了着色器语言那部分就完全晕了。最近实现了自己的软件光栅化渲染器,对图形学有了点了解,现在在接触D3D的一些API,自然而然能联想到一些背后的原理。现在打算认真学习下D3D11,先从官方SDK里带的例子开始学习吧。
初始化Direct3D 11 设备
首先必须要创建的是
ID3D11Device(设备):该设备包含创建资源的方法
ID3D11DeviceContext(上下文):主要用于在缓冲区执行渲染
IDXGISwapChain(交换链):将后台缓存与前台缓存交换,在显示器上显示
先要创建一个DXGI_SWAP_CHAIN_DESC 结构,填写相应的参数,
根据这个结构使用D3D11CreateDeviceAndSwapChain方法来创建。
//DXGI_SWAP_CHAIN_DESC结构 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; //D3D_DRIVER_TYPE_HARDWARE表示将使用硬件加速,如果不支持,可选用软件,但是效率低 if( FAILED( D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, NULL, &g_pImmediateContext ) ) ) { return FALSE; }
创建渲染目标视图
// Create a render target view ID3D11Texture2D *pBackBuffer; if( FAILED( g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer ) ) ) return FALSE; hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView ); pBackBuffer->Release(); if( FAILED( hr ) ) return FALSE; g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
创建渲染目标视图,确保输出的管道渲染被写入到后台缓冲区
ID3D11Texture2D *pBackBuffer; //获取交换链的后台缓存 if( FAILED( g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer ) ) ) return FALSE; //绑定交换链的后面缓冲区作为渲染目标 hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView ); pBackBuffer->Release(); if( FAILED( hr ) ) return FALSE; g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
初始化视图
我们需要在Direct3D 11渲染设置的最后一件事是初始化视口。视口映射剪辑空间坐标,其中x和y范围从1到1,z范围从0到1,渲染目标空间,有时被称为像素空间。在Direct3D 9,如果应用程序没有设定一个视口,视口设置为默认大小为渲染目标相同。在Direct3D 11,默认不创建视口。因此,我们必须这样做之前,我们可以看到屏幕上的任何东西。因为我们想使用整个渲染目标的输出,我们设置左上角到(0,0)和宽度和高度是相同的渲染目标的大小。
D3D11_VIEWPORT vp; vp.Width = (FLOAT)width; vp.Height = (FLOAT)height; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pImmediateContext->RSSetViewports( 1, &vp );
渲染
以下代码只是单单的设置一个背景色
void Render() { //用一种颜色来将后台缓存填充 float ClearColor[4] = { 0.0f, 0.125f, 0.6f, 1.0f }; // RGBA g_pd3dDevice->ClearRenderTargetView( g_pRenderTargetView, ClearColor ); //交换,从而在显示器上显示 g_pSwapChain->Present( 0, 0 ); }
项目Github地址
阅读全文
0 0
- DirectX11(一)
- 一、VS2015update2环境下DirectX11编程说明(2016.5.5更新)
- DirectX11笔记(一)--配置DirectX工程
- DirectX11-教程3(下)
- DirectX11 深度模板视图(depth-stencil)
- DirectX11 兰伯特余弦定理(Lambert)
- DirectX11学习笔记一:准备工作_XMVECTOR的使用
- 3D GAME PROGRAMMING WITH DIRECTX11 (1)
- 3D GAME PROGRAMMING WITH DIRECTX11 (2)
- 3D GAME PROGRAMMING WITH DIRECTX11(3)
- 3D GAME PROGRAMMING WITH DIRECTX11(4)
- DirectX11解析
- DirectX11教程
- Directx11 初始化
- DirectX11 视口
- DirectX11 光照
- DirectX11 Effects
- DirectX11 镜面光
- 汉诺塔
- 1.10 使用xshell连接linux
- boost中的shared_ptr的一些理解
- 常见的八种导致 APP 内存泄漏的问题
- scrapy爬虫【4】→爬百度美女图
- DirectX11(一)
- 中断机构和中断处理程序
- 如何解决IAR不能设置断点的问题
- 1.11 1.12putty密钥认证及xshell秘钥登陆
- 学习率Learning rate
- 2017 计蒜之道 初赛 第六场(解题报告)
- python搜索效率研究
- 写给想学编程的GGMM
- 1.13 单用户模式