问题标签 [direct3d12]
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++ - 我可以在已编译的 D3D 着色器中更改绑定点吗?
我有一个 HLSL 着色器,它定义了一些资源,比如一个常量缓冲区:
如果我编译我的着色器,我将能够通过反射 API 查询寄存器。但是是否有可能以类似的方式在编译的着色器 blob 中更改寄存器(例如,更改为),您可以将绑定点分配给已编译的 OpenGL 程序中的资源?b3
windows-10-mobile - Windows 10 移动版(手机)是否支持 Direct3D 12?
Windows 10 移动版(手机)是否支持 Direct3D 12?我最近将我的个人项目升级到 Direct3D 12,印象是它可以在所有版本的 Windows 10 通用应用程序上运行。我的手机可以正常运行我的旧 Direct3D 11.1 代码,但 D3D12CreateDevice() 失败并出现指定功能级别(11_0、11_1、12_0 或 12_1)或接口(ID3D12Device)不受支持的错误。是我做错了什么,还是手机真的不支持 D3D12?如果不支持,会一直支持吗?我不介意现在只在 PC 上开发,但我宁愿现在知道它永远不会被支持。
c++ - Direct3D12 中的 CPU/GPU 共享缓冲区
我没有使用 Direct3D 的经验,所以我可能只是在寻找错误的地方。但是,我想将我用 OpenGL(使用 FreeGLUT)编写的程序转换为与 Windows IoT 兼容的 UWP(运行 Direct3D,12,因为它很酷)。我正在尝试将我的程序移植到 Raspberry Pi 3,但我不想转换为 Linux。
通过 Microsoft 提供的示例,我已经弄清楚了我认为开始需要知道的大部分内容,但我无法弄清楚如何在 CPU 和 GPU 之间共享动态数据缓冲区。
我想知道该怎么做:
- 创建 CPU/GPU 共享循环缓冲区
- 使用 GPU 阅读和绘图
- 用 CPU 写入/替换部分
快速半伪代码:
以前在 OpenGL 中通过简单地使用 glBegin()/glEnd() 和 glVertex3f() 来完成未写入数组中的每个值的操作。
更新:我基本上想要使用 glBufferSubData() 的 OpenGLs VBO 编辑的 Direct3D12 等价物。如果这更有意义。
更新 2:我发现我可以放弃每一帧的顶点缓冲区并将新缓冲区重新上传到 GPU。正如人们所期望的那样,每帧传输 10,000 到 200,000 个 double 会产生相当多的开销。所以我试图找到一种方法来使用常量缓冲区将 5-10 个更新的顶点移植到着色器中,这样我就可以使用着色器从常量缓冲区复制到顶点缓冲区,而不必每帧都使用映射/取消映射. 这样,我在 CPU 上的循环缓冲区独立于 GPU 上使用的缓冲区,但它们都将通过定期更新共享相同的信息。如果我找不到解决方案,我会做更多的查找并在着色器上发布另一个更具体的问题。
graphics - D3D12 有类似 vkCmdBlitImage 的东西吗?
我想通过将基本图像blitting 到mip 级别来为2D 纹理创建mipmap 链。在 Vulkan 中,vkCmdBlitImage
可用于在对图像进行线性过滤时执行此操作(请参阅另一个问题)。我怎样才能在 D3D12 中达到同样的效果?
c++ - KeyDown 延迟 C++ UWP Windows 10 Direct3D 12 应用程序
我的问题是,在 KeyDown 上,几乎有一秒钟的延迟,直到所有事件队列开始被处理,请参阅此处的视频演示。其次,没有处理并行键,我可以去 W、S 或其他一些,但不能同时使用两者。
我已经尝试过运行 Render() async 和 using ProcessUntiLQuit
,改变我读取输入的方式,等等......
我目前正在使用ProcessAllIfPresent
经典Run(while not closed)
循环
在我的 IFrameworkView 实例应用程序中,以下是我的 KeyDown 处理程序:
总共只有 K 个映射键,因此它运行在恒定时间。这会设置所有标志并将其传递给应用程序,应用程序只需调用“UpdatePosition”方法直接修改值:
该应用程序以 60 FPS 的速度呈现。
谢谢你的帮助。
directx-12 - D3D12 的 SetGraphicsRootSignature 有什么意义?
我对该ID3D12GraphicsCommandList::SetGraphicsRootSignature
方法的存在感到有些困惑。根据我对这个 MSDN 页面的了解,它的唯一有效用法似乎是始终在之后调用它SetPipelineState
,并为其提供与创建管道状态对象时提供的相同的根签名。如果是这样,它不隐含有什么好处?还有其他方法可以使用此方法吗?
dxgi - 着色器资源视图使用哪种格式进入深度模板缓冲区资源?
深度模板缓冲区资源被定义为DXGI_FORMAT_D24_UNORM_S8_UINT
格式。
我会假设要在该资源中创建着色器资源视图 (SRV),需要将视图格式描述为:
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
其中红色通道访问深度值DXGI_FORMAT_R24G8_TYPELESS
其中红色通道访问深度和绿色通道模板值
但是,创建此类 SRV 失败并出现以下错误:
D3D12 ERROR: ID3D12Device::CreateShaderResourceView: 对于资源格式 D24_UNORM_S8_UINT,在制作 D3D 视图时,视图的格式名称不能为 R24_UNORM_X8_TYPELESS。请参阅此资源格式的有效视图格式名称集的文档,确定资源(或其中的一部分)在着色器中的显示方式。[ STATE_CREATION 错误 #28:CREATESHADERRESOURCEVIEW_INVALIDFORMAT]
查看API 文档后,我得到了以下信息:
查看资源时,资源视图描述必须指定与资源格式兼容的类型化格式。这意味着您不能使用名称中带有 _TYPELESS 的任何格式创建资源视图描述。但是,您可以通过为视图指定类型化格式来查看无类型资源。
我真的不明白为什么不允许使用无类型格式以及我应该使用哪种格式?
c++ - 使用 MSAA 创建交换链失败
当我尝试使用 MSAA 支持设置交换链时,我收到一个DXGI_ERROR_INVALID_CALL
错误 - 这是创建交换链的代码:
查找最佳可用 MSAA 设置的方法如下所示:
什么时候rsd.enableMSAA
一切false
都完美。
我的设备是这样创建的(我使用的是 warp 适配器,因为我没有硬件支持):
我的日志说:
directx-12 - 使用堆类型上传更新 GPU 资源的最佳方法是什么?
我正在使用ID3D12Resource::Map
方法来更新 GPU 资源。这是最有效的方法吗?存在哪些替代方案?