Direct3D
会头痛的可达鸭
美食研究猿
展开
-
从零开始学D3D
目录原创 2021-03-18 10:57:02 · 309 阅读 · 0 评论 -
读取ID3D11ShaderResourceView、ID3D11Texture2D
SaveD3D11ResourceView(ID3D11Device *device, ID3D11DeviceContext *deviceContext, ID3D11ShaderResourceView *srv){ ID3D11Resource *res; ID3D11Texture2D *tex; srv->GetResource(&res); res->QueryInterface(&tex); SaveD3D11Texture(device, devi.原创 2021-06-02 15:45:33 · 1888 阅读 · 1 评论 -
D3D画矩形
前言:在ID3D11RenderTargetView、ID3D11ShaderResourceView进行shader运算后,必须执行draw、drawIndex才能把数据存在ID3D11ShaderResourceView中原创 2021-06-02 15:42:56 · 581 阅读 · 0 评论 -
D3D前言
D3D: 全称:Direct3D,windows系统下,为了提高显示性能开发的显示程序接口(显卡,gpu) OPENGL和D3D 本质是一样(为了不同的系统、应用程序提供显示用的接口函数和显示功能),标准不一致 OPENGL是一个性能卓越的三位图形标准,适用于不同的系统、平台 D3D是微软开发的 针对于Windows系统 D3D10 1、状态对象(state Object) ...原创 2021-03-18 10:58:33 · 301 阅读 · 0 评论 -
创建Swap Chain(交换链)
一、Swap Chain两个或者多个用于呈现和显示的缓冲区,显示设备前缓冲区和充当渲染目标的后端缓冲区,通过交换两个缓冲区来呈现后台缓冲区 定义了几种渲染特性: 1、渲染区域大小 2、显示刷新率 3、显示模式 4、表面格式二、创建方式 1、D3D11CreateDeviceAndSwapChainHRESULT D3D11CreateDeviceAndSwapChain( IDXGIAdapter ...原创 2021-03-18 11:19:59 · 1516 阅读 · 1 评论 -
创建Reference device(基础设备)
一、初始化交换链 // DXGI交换链 DXGI_SWAP_CHAIN_DESC swapChainDesc; // 清空内存 ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) ); swapChainDesc.BufferCount = 1; swapChainDesc.BufferDe原创 2021-03-18 11:08:45 · 292 阅读 · 0 评论 -
创建WARP device(图形变换设备)
一、初始化交换链//DXGI交换链DXGI_SWAP_CHAIN_DESC swapChainDesc;// 清空内存ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) );swapChainDesc.BufferCount = 1;swapChainDesc.BufferDesc.Width = 640; swapChainDesc.BufferDesc.Height = 480;swapChainDes原创 2021-03-18 11:13:30 · 401 阅读 · 0 评论 -
创建Device Feature Level(功能特性)
一、获取 D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain ---ppDevice 传NULL -or- ID3D11Device::GetFeatureLevel 二、检查上一步返回的D3D_FEATURE_LEVEL值// 注:存在Direct3D 11.1运行时, pFeatureLevels设置为NULL,则不会创建D3D_FEATURE_LEVEL_11_1设备// 创建D3D_...原创 2021-03-18 11:44:42 · 642 阅读 · 0 评论 -
创建并初始化设备
一、初始化交换链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.R原创 2021-03-18 11:40:16 · 368 阅读 · 0 评论 -
获取Adapter Display Modes(适配器显示模式)
一、通过IDXGIFatory枚举可用的adapters二、通过IDXGIAdapter::EnumOutputs 枚举输出IDXGIOutput* pOutput = NULL;HRAESULT hr = pAdapter->EnumOutputs(0. &pOutput);三、通过IDXGIOutput::GetDisplayModeList获取到有效的display ModesUNIT numModes = 0;DXGI_FORMAT format = DXGI_原创 2021-03-18 11:35:07 · 479 阅读 · 0 评论 -
枚举Adapters(图形适配器)
一、使用场景确认多少个图形适配器 创建D3D 设备 使用IDXGIAdapter检索设备性能 二、步骤 1、创建IDXGIFactroyIDXGIFactory * pFactory = NULL;CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory) 2、枚举IDXGIFactory::EnumAdapters for(UINT i = 0; pFactory->EnumA...原创 2021-03-18 11:31:44 · 956 阅读 · 0 评论 -
创建Device Vertex Buffer(顶点缓冲区)---顶点缓冲区包含每个顶点的数据
一、初始化静态顶点缓冲区1、定义顶点数据结构,包含颜色、位置等数据2、分配顶点数据内存3、初始化D3D11_BUFFER_DESC4、初始化D3D11_SUBRESOURCE_DATA5、通过ID3D11Device::CreateBuffer 创建顶点数据ID3D11Buffer* g_pVertexBuffer = nullptr;// step1 define device vertex structstruct SimpleVertexCombined{ ..原创 2021-03-18 11:48:48 · 322 阅读 · 0 评论 -
创建Index Buffer(索引缓冲区)--索引缓冲区包含索引数据,为渲染做好准备
一、创建一个索引缓冲区Buffer ID3D11Buffer*g_pIndexBuffer = nullptr;unsigned int indices[] = {0, 1, 2};二、初始化D3D11_BUFFER_DESC,BindFlags传递D3D11_BIND_INDEX_BUFFER // 填充D3D11_BUFFER_DESC D3D11_BUFFER_DESC bufferDesc; bufferDesc.Usage = D3D11_...原创 2021-03-22 09:08:20 · 853 阅读 · 0 评论 -
创建Constant Buffer(常量缓冲区)--包含Shader(着色器)
一、定义用于与着色器通信的常量数据ID3D11Buffer* g_pConstantBuffer11 = nullptr;// definestruct VS_CONSTANT_BUFFER{ XMFLOAT4X4 mWOrldViewProj; XMFLOAT4 vSomeVectorTharMayBeNeededByASpecificShader; float fSomeFloatThatMayBeNeededByASpecificShader;原创 2021-03-22 09:11:15 · 1122 阅读 · 0 评论 -
初始化Texture(使用不同类型创建纹理)---创建期间初始化、创建后进行填充
一、Default Usage(默认用法) A、调用ID3D11Device::CreateTexture2D 并初始化pInitialData B、调用ID3D11DeviceContext::UpdateSubresource 填充默认纹理二、Dynamic Usage(动态用法) A、调用ID3D11DeviceContext::Map,传入D3D11_MAP_WRITE_DISCARD 获取到纹理指针 B、把数...原创 2021-03-22 09:28:37 · 481 阅读 · 0 评论 -
创建Texture(纹理)
一、填充D3D11_TEXTURE2D_DESCD3D11_TEXTURE2D_DESC desc;desc.Width = 1920; desc.Height = 1080;desc.MipLevels = desc.ArraySize = 1;desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;desc.SampleDesc.Count = 1;desc.Usage = D3D11_USAGE_DYNAMIC;原创 2021-03-22 09:15:08 · 3886 阅读 · 0 评论 -
通过文件初始化Texture(使用WIC创建纹理和视图)
一、通过CoCreateInstance初始化IWICImagingFactory 二、通过IWICImagingFactory::CreateDecoderFromFilename 创建IWICBitmapDecoder 对象 三、通过IWICBitmapDecoder::GetFrame 获取Frame 四、通过IWICBitmapSource::GetPixelFormat 获取图片格式 五、将图片格式转化为DXG...原创 2021-03-22 09:40:02 · 1448 阅读 · 0 评论 -
设计Hull Shader
一、定义Hull Shader 输入、输出// input controlstruct 在VS_CONTROL_POINT_OUTPUT // 怀疑写错了。。为啥不是_INPUT{ float3 vPosition : WORLDPOS; float2 vUV : TEXCOORD0; float3 vTangent : TANGENT;};// Output controlstruct BEZIER_CONTROL_POINT原创 2021-03-22 09:58:27 · 631 阅读 · 0 评论 -
创建Compute Shader(着色器)----HLSL(high level shader language)
一、通过D3DCompileFromFile 编写HLSL shader代码 UINT flags = D3DCOMPTLE_ENABLE_STRICTNESS;#if define(DEBUG) || define(_DEBUG) flag |= D3DCOMPTLE_DEBUG;#endif // 尽可能使用更高的CS着色器配置文件,提供更高的性能 LPCSTR profile = ( device->GetFeatureLevel() >= D3D_FEATURE_原创 2021-03-22 09:53:41 · 674 阅读 · 0 评论 -
使用Dynamic resources(使用动态资源)
一、重要的APIA、ID3D11DeviceContext::Map;B、ID3D11DeviceContext::Unmap;C、D3D11_USAGE二、基础对象的创建A、Create a TextureB、Initialize a Texture ProgrammaticallyC、Create a Constant Buffer三、步骤 A、指定动态用法 1、指定资源动态使用,例如:D3D11_BU...原创 2021-03-22 09:47:41 · 569 阅读 · 0 评论 -
创建Hull Shader
一、前言 Hull Shader是舞台工作三个阶段的第一个阶段,可以实现tessellation, Hull Shader transforms将一组输入控制点 转化为 输出控制点,输入、输出点的数量根据转换内容和数量而变化二、设计Hull shader三、通过ID3D11Device::CreateHullShader创建hull-shader对象 HRESULT CreateHullShader( ...原创 2021-03-22 10:01:22 · 467 阅读 · 0 评论 -
初始化Tessellator Stage---Tessellation 细分曲面
一、通过ID3D11DeviceContext::HSSetShader初始化 void HSSetShader( ID3D11HullShader* pHullShader, ID3D11ClassInstance *const *ppClassInstances, // shader数组指针, UINT NumClassInstances); ...原创 2021-03-22 10:14:03 · 140 阅读 · 0 评论 -
设计Domain Shader(域着色器)--第三个阶段,
一、前言 通过hull shader的转换控制点和UV坐标生成表面几何,对于固定的细分曲面生成的点都将调用Domain Shader, 输入为:UV[W]坐标,已经Hull Shader的所有输出数据二、定义Domain 属性[domain("quad")] // 四边形三、通过domain定位 Hull上的位置对于四边形的patch,使用float2 对于三重曲面patch,使用float3(用于重心坐标) 对于isoline,使用float2flo...原创 2021-03-23 09:45:06 · 1388 阅读 · 0 评论 -
记录Command List---渲染指令列表
一、ID3D11Device::CreateDeferredContextHRESULT hr;ID3D11DeviceContext* pDeferredContext = NULL;hr = g_pd3dDevice->CreateDeferredContext(0, &pDeferredContext);二、使用DeferredContext渲染float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f };pDeferred原创 2021-03-23 09:52:35 · 594 阅读 · 0 评论 -
播放Command List
通过ID3D11DeviceContext::ExecuteCommandList 传入有效的ID3D11CommandList objectif(g_pd3dCommandList){ g_pImmediateContext->ExecuteCommandList(g_pd3dCommandList, TRUE);}原创 2021-03-23 09:53:29 · 188 阅读 · 0 评论 -
创建Domain Shader
一、设计domain shader二、编译shader三、创建Domain Shader --- ID3D11Device::CreateDomainShaderHRESULT CreateDomainShader( const void *pShaderBytecode, // SIZE_T BytecodeLength, //原创 2021-03-23 09:48:27 · 227 阅读 · 0 评论 -
检查Driver Support(驱动支持)--确认硬件加速是否支持多线程
一、如果驱动和图形硬件设备(简单来说就显卡和显卡驱动),不支持多线程,可能会限制以下性能同时创建多个可能会受到限制 在渲染图形时创建的对象可能受到限制,例如应用程序应避免在后台线程上创建需要很长时间才能创建的对象。 耗时很长的创建操作可能会阻止立即进行上下文渲染,并增加视觉帧频停顿的风险(卡顿)二、检查方式初始化一个ID3D11Device,默认启用多线程 通过ID3D11Device :: CheckFeatureSupport,feature参数=D3D11_FEATURE_THREA..原创 2021-03-23 09:56:21 · 748 阅读 · 0 评论 -
编译Shader(使用D3DComileFromFile编译做着色器)
一、前言通常使用fxc.exe HLSL代码编译器来编辑shader二、通过D3DCompileFromFile编译HLSL shader代码UINT flags = D3DCOMPILE_ENABLE_STRICTNESS;#if defined( DEBUG ) || defined( _DEBUG ) flags |= D3DCOMPILE_DEBUG;#endif // Prefer higher CS shader profile when possible as原创 2021-03-23 09:50:35 · 1639 阅读 · 0 评论 -
渲染--案例Tutorial04
MSDN一、需要存在一个渲染目标ID3D11RenderTargetView1、创建渲染目标,通过D3Ddevicehr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, nullptr, &g_pRenderTargetView ); A、获取的D3D设备(D3D设备是通过D3D11CreateDevice 接口获取而来的,但是对于不同系统、硬件、驱动等,可能支持的格式D3D12 D3D11 D3D10.....原创 2021-03-23 10:14:06 · 538 阅读 · 0 评论