Articles of DirectX 11

无法找出DirectX11着色器?

所以,我不知道如何使用着色器。 对它们进行编码很容易,但实际上并没有使用它们 。 MSDN对我来说真的没用,这意味着他们有最糟糕的教程。 我正在阅读Frank Luna的Direct3d 11书,而我终于到了真正能够画画的地方。 令人兴奋的,除了它不起作用的事实。 他的BoxDemo – 我确定在三年前制作这本书的时候就已经工作了,但现在所有新的DirectX的东西 – 省略了DirectX SDK,现在使用“Windows SDK”,FX被弃用,没有更多的D3DX库…太令人沮丧了。 我继续降级到DirectX 2010 SDK – 这样我才能真正使用教程。 几乎所有的D3D教程都使用D3DX库。 无论如何…现在我的问题。 Visual Studio有一个选项来制作.hlsl文件。 但是,它也具有make .fx文件的能力(如果只是在文件名末尾键入.fx,则会创build.fx文件)。 所以,我可以使用不推荐的.fx方式,并学习如何使用它的所有教程教学 – 或者我可以学习新的 HLSL方式,并有最困难,最沮丧的时间试图学习它没有教程。 我知道他们都使用HLSL语言。 但是他们都用在程序上有所不同。 (CreateEffectFromMemory,CompileFromFile等)。 我有种希望去学习新的方式,但是如果我不这样做的话。 虽然,我几乎有一个使用.fx文件的整个程序。 我相信它会工作,但我只需要帮助build立和利用“Effects11.lib”。 对不起,拖后 – 事实上,我相信我会得到任何答复一段时间 – 如果我得到任何 – 由于长度。 我非常沮丧,因为学习DirectX使我的编程生涯在过去的一个月,两个月里陷入了巨大的停滞。 请谢谢你的帮助

在directx-11上使用指定的字体

我想在DirectX 11中使用指定的字体文件 search后,我坚持创build一个自定义的字体集合。 加载指定字体文件的代码: Platform::String^ pathTEST; Microsoft::WRL::ComPtr<IDWriteFontFile> fontFileTEST; Microsoft::WRL::ComPtr<IDWriteFontFileLoader> fontFileLoaderTEST; Windows::Storage::StorageFolder^ folder = Windows::Storage::ApplicationData::Current->LocalFolder; pathTEST = folder->Path + L"\\Bubblegum.ttf";//#BubbleGum HRESULT hr = S_OK; if (SUCCEEDED(hr)) hr = dwriteFactory->CreateFontFileReference(pathTEST->Data(), NULL, &fontFileTEST); if (SUCCEEDED(hr)) hr = fontFileTEST->GetLoader(&fontFileLoaderTEST); if (SUCCEEDED(hr)) hr = dwriteFactory->RegisterFontFileLoader(fontFileLoaderTEST.Get()); 应该使用字体的代码,但我缺less字体集合: MyIDWriteFactory2->CreateTextFormat( L"BubbleGum", MyWriteFontCollection (nullptr for the moment), DWRITE_FONT_WEIGHT_LIGHT, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 16.0f, L"en-us", &MyIDWriteTextFormat); 我没有任何问题使用系统字体像Arial。 […]

DirectX :: XMMATRIX __declspec(align('16'))将不会alignment

我正在使用DirectXMath构build我的3D模拟项目 void SetConstantBuffer(ID3D11DeviceContext*_device_context, DirectX::XMMATRIX _world, DirectX::XMMATRIX _view, DirectX::XMMATRIX _projection) { ConstantBuffer const_buffer; const_buffer.View = DirectX::XMMatrixTranspose(_world); const_buffer.World = DirectX::XMMatrixTranspose(_view); const_buffer.Projection = DirectX::XMMatrixTranspose(_projection); _device_context->UpdateSubresource(m_const_buffer, 0, NULL, &const_buffer, 0, 0); } 我可能在DirectXMath里的SIMD标志上得到这样的编译器错误: 错误C2719:'_world':具有__declspec(align('16'))的forms参数将不会alignment 错误C2719:'_view':具有__declspec(align('16'))的forms参数将不会alignment 错误C2719:'_projection':具有__declspec(align('16'))的forms参数将不会alignment 有没有其他方式没有将其转换为DirectX :: XMFLOAT4X4? 顺便说一句,我使用的是一台x86机器,并在Visual Studio 2012 Express上编译。

为什么我的DX11游戏中加载了D3D10SDKLayers.dll?

请参阅下面的编辑更新。 原始问题已被修改! 我有一个使用DX11设备的工作窗口。 当我尝试使用Alt + Enter全屏时,出现问题。 如果窗口没有聚焦,我得到一个debugging输出,说: 'MyGame.exe': Loaded 'C:\Windows\SysWOW64\D3D10SDKLayers.DLL', Cannot find or open the PDB file 然后警告 DXGI Warning: IDXGISwapChain::Present: Fullscreen presentation inefficiencies incurred due to application not using IDXGISwapChain::ResizeBuffers appropriately, specifying a DXGI_MODE_DESC not available in IDXGIOutput::GetDisplayModeList, or not using DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH 我相当确定一个DX11游戏不应该加载D3D10SDKLayers.dll,特别是在执行中。 从MSDN文档,我收集到这个DLL是在设备创build时加载的: if a device is created with the appropriate layer flag, […]

如何在C ++中提前分配内存?

总体情况 对带宽,CPU使用率和GPU使用率都非常敏感的应用程序需要每秒从一个GPU向另一个GPU传输大约10-15GB的数据。 它使用DX11 API来访问GPU,因此上传到GPU只能在需要映射每个单独上传的缓冲区时发生。 上传一次以25MB的大小发生,16个线程同时向缓冲区写入缓冲区。 关于这一点,没有什么可以做的。 写入的实际并发级别应该较低,如果它不是以下错误。 这是一个带有3 Pascal GPU,高端Haswell处理器和四通道RAM的强大工作站。 在硬件上没有太多可以改进的地方。 它运行的是Windows 10的桌面版本。 实际问题 一旦我传递了大约50%的CPU负载, MmPageFault()某些东西(在Windows内核中,当访问已映射到您的地址空间但尚未被操作系统提交的内存时调用)破坏严重,其余50% MmPageFault()的旋转锁正在浪费CPU负载。 CPU使用率达到100%,应用程序性能完全降低。 我必须假设,这是由于每秒需要分配给进程的大量内存,而且每次DX11缓冲区未映射时,这些内存也完全没有映射到进程中。 相应地,实际上每秒有数千次对MmPageFault()的调用,随着memcpy()被顺序写入缓冲区而顺序发生。 每遇到一个未提交的页面。 一旦CPU负载超过50%,保护页面pipe理的Windows核心中的乐观旋转locking会完全降低性能。 注意事项 缓冲区由DX11驱动程序分配。 没有什么可以调整分配策略。 使用不同的内存API,特别是重复使用是不可能的。 调用DX11 API(映射/取消映射缓冲区)全部来自单个线程。 实际的复制操作可能发生在multithreading上,而不是系统中的虚拟处理器。 减less内存带宽的要求是不可能的。 这是一个实时应用程序。 事实上,硬性限制目前是主要GPU的PCIe 3.0 16x带宽。 如果可以的话,我已经需要进一步推进了。 避免使用multithreading副本是不可能的,因为有独立的生产者 – 消费者队列,这些队列不能被轻易地合并。 自旋锁性能的下降似乎是非常罕见的(因为使用案例推得这么远),在Google上,你不会发现自旋锁函数名称的单一结果。 升级到对映射(Vulkan)进行更多控制的API正在进行中,但它不适合作为短期修复。 由于相同的原因,切换到更好的操作系统内核目前不是一种select。 减lessCPU负载也不起作用; 除了(通常微不足道的和廉价的)缓冲拷贝外,还有太多的工作需要完成。 问题 可以做什么? 我需要显着减less个别页面错误的数量。 我知道映射到我的进程的缓冲区的地址和大小,我也知道内存还没有被提交。 我怎样才能确保尽可能less的交易提交内存? DX11的exception标志,它可以防止取消映射后的缓冲区解除分配,Windows API强制在单个事务中提交,几乎任何东西都是值得欢迎的。 目前的状态 // In the processing […]