问题标签 [directx-12]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用哪个 int 实现?
我正在使用 DirectX 12 API 用 C++ 编写视频游戏引擎。通过这样做,我发现了数据类型__int64,它显然是 Microsoft 特定大小的类型。于是我想到了两个问题:
假设选择了正确的大小,大小的 int (如“ int[size]_t ”)通常比标准int更有效吗?
和
考虑到不同计算机系统之间的效率和兼容性,我应该使用“ int[size]_t ”、“ __int[size] ”和“ int[size] ”中的哪种数据类型?
c++ - 计算从多个线程组随机写入 RWStructuredBuffer 的 Shader
我正在尝试从多个线程组实现对 RWStructuredBuffer 的随机访问读取和写入。当有两个线程(在不同的线程组上)同时运行(在不同的多处理器上)并且它们都试图读/写 RWStructuredBuffer 中的相同元素时,可能会发生争用情况。
当所有线程都在同一个线程组中时,我可以使用原子进行并发写入/读取,所以我的解决方案是一次只使用一个线程组多次分派我的 CS,如下所示:
这样,如果来自不同线程组的两个线程想要访问内存的同一部分,它们必须按顺序进行。
我的问题是,这是否是解决我的问题的好方法,因为多次调用图形 API 可能会产生一些驱动程序开销。
API 是 Directx12,HLSL 是使用着色器模型 5.1 编译的。
谢谢您的帮助。干杯,博扬!
directx - DXGI Waitable SwapChain 不等待
我设置了一个 DX12 应用程序,它只清除每帧的后备缓冲区。
它真的是准系统:没有 PSO,没有根......唯一的特殊性是它在开始新帧( msdn 可等待交换链)之前等待 swapChain 与 Present() 完成(我将帧延迟设置为 1 为好吧,只有 2 个缓冲区)。
第一帧运行良好,但它立即开始绘制第二帧,当然,命令分配器抱怨它正在被重置,而命令仍在 GPU 上执行。
我当然可以设置一个栅栏来等待 gpu 在移动到新帧之前完成,但我认为这是等待交换链对象的工作。
这是渲染例程:
我使用从交换链获得的可等待对象循环此例程:
我用等待标志初始化了交换链:
我在创建 swapChain 后立即调用 SetFrameLatency :
以及随之而来的 swapChain 调整大小:
我的问题是:我是否设置错误?还是这是可等待交换链的工作方式(即,在等待交换链可用之前,您还需要使用栅栏与 gpu 同步)?
编辑:添加 SetFrameLatency 调用 + C++ 着色
directx - 图像法线贴图到 DirectX 9-12
我有一个问题要问你,因为我真的需要这个,但我不知道该如何解决。是否有可能将法线贴图图像转换为 NormalBuffer?或者换句话说...我想在 DirectX 9-12 中制作一个 3D 应用程序,它将用于模型的纹理(模型的材料)一些将从 Substance Painter 导出的图像。有没有可能这样做?
directx-12 - DX12 - 描述符堆优化方法
我一直致力于构建 DX12 渲染器。目前,在查看了许多示例(Mini Engine、BGFX、...)之后,我想我终于找到了描述符绑定的最佳解决方案。这是过程:
- 当调用 addTexture 或任何添加资源时 - 从静态着色器可见堆(CPU 和 GPU 句柄)分配描述符句柄
- 当用户想要绑定一个描述符集时,遍历集合中的所有描述符并使用创建描述符时分配的 GPU 句柄调用 SetRootDescriptorTable。
这是最优化的方法吗?它只涉及在帧开始时绑定 2 个堆(采样器和 cbv_srv_uav)并调用 SetRootDescriptorTable。(我们并没有真正使用 RootDescriptors,因为我们的目标平台是控制台(AMD gpu),它的根签名限制为 13 DWORDS)
c# - 尝试“最小可行”的 SharpDX 12 设置;错误 0x887A0005 “设备已移除”
目标:编写“最小可行”,没有多余的代码来设置 SharpDX 12(DirectX 12 的 C# 包装器),创建一个窗口,并执行一个将屏幕清除为 RGBA(0、0、1、 1)。
期望:尽我所能遵循 DirectX 12 设置教程,然后我会得到一个蓝色背景的窗口。
结果:在循环的第二次运行中,在“swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);”这一行上 错误消息“SharpDX.SharpDXException:HRESULT:[0x887A0005],模块:[SharpDX.DXGI],ApiCode:[DXGI_ERROR_DEVICE_REMOVED/DeviceRemoved],消息:GPU 设备实例已暂停。使用 GetDeviceRemovedReason 确定适当的操作。
在 SharpDX.Result.CheckError() 在 SharpDX.DXGI.SwapChain.Present(Int32 syncInterval, PresentFlags flags) 在 DirectX12BlueScreen.Program.Main(String[] args) 在 *\DirectX12BlueScreen\DirectX12BlueScreen\Program.cs:line 114" 打印到控制台窗口(我用于调试输出)
我在找什么:为什么会发生错误(设备肯定没有被移除);我的代码的哪一部分导致了错误;如果前两条信息不提供该信息,则该问题的解决方案。
由于完整的代码是 165 行,我在此处发布了循环,并将完整的代码放在 pastebin 中:https ://pastebin.com/vctaYkNC
编辑:使用 PhillipH 提供的信息,我现在有了更准确的错误读数:“System.Runtime.InteropServices.SEHException (0x80004005): External component has throw an exception. at SharpDX.Direct3D12.GraphicsCommandList.ClearRenderTargetView(CpuDescriptorHandle renderTargetView, RawColor4 colorRGBA , Int32 numRects, RawRectangle[] rectsRef) 在 SharpDX.Direct3D12.GraphicsCommandList.ClearRenderTargetView(CpuDescriptorHandle renderTargetView, RawColor4 colorRGBA) 在 DirectX12BlueScreen.Program.Main(String[] args) 在 *\DirectX12BlueScreen\DirectX12BlueScreen\Program.cs:line 138"
hlsl - D3D12 不同格式纹理的动态索引
在着色器模型 5.1 中,我们可以对纹理使用动态索引,如下所示:
这里假设所有纹理都有 4 个通道 (rgba)。但是,当我的纹理数组混合了 BC3(rgba)、BC4(单通道 R)、BC5(双通道 RG)等不同格式时,我不知道如何采样。例如,在 BC4 的情况下,我可以尝试
但这不会跳过三个纹素吗?
directx-12 - 为什么要转换为 XMFLOAT 而不是直接使用 XMVECTOR?
在学习 DirectX 12 时,它说我应该对类数据成员使用 XMFLOAT 而不是 XMVECTOR。我不懂为什么。
在我的类中定义 XMVECTOR 变量是错误的吗?还是直接在我的课堂上使用 XMVECTOR?