问题标签 [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.

0 投票
1 回答
1054 浏览

directx - 当引用 RWStructuredBuffer 时,为什么这个 HLSL 像素着色器不能编译?

我正在使用 DirectX 12,尝试使用无人机进行渲染。这是我的像素着色器代码:

使用该D3DCompileFromFile函数时编译失败。

当我替换这一行时:

像这样:

没有提到RWStructuredBuffer,那么它编译得很好并正确渲染。

我认为绑定数据没有任何问题(VS 图形调试器显示正确绑定的两个无人机)。不过,我认为这不会影响着色器的编译。

任何时候我引用FLBufferor StartOffsetBuffer,它都不会编译。

什么会导致这个问题?

0 投票
1 回答
3857 浏览

multithreading - DirectX 12 中的多线程

我很难在 DX12 中接受多线程渲染的概念。

根据 MSDN,必须将绘制命令写入直接命令列表(最好使用捆绑包),然后将这些列表提交到命令队列。也有人说直接命令列表可以有多个命令队列。但我不清楚这样做的目的是什么。

我通过在并行线程中构建命令列表来充分利用多线程,不是吗?如果是这样,我为什么要与设备关联多个命令队列?

我怀疑命令队列管理不当会导致渲染库开发后期的性能出现巨大问题。

0 投票
0 回答
174 浏览

mfc - why does a DX12 app with SDI/MDI make strange flickering when using the DXGI_FORMAT_R16G16B16A16_FLOAT for the back buffer

I have been programming on DirectX12 since last year, and I've experienced DX10 and 11. There is something bizarre I found in my application DX12 and i am not able to find why or a solution. I cannot show my original code, but it's ok, because it happens in any simply DX12 sample.

We can use directly the Triangle Sample (provided by DirectX12 officials) for example. I integrate it without modifying anything basic in a MFC SDI application, and until now everything works fine. But after I change the Swap Chain format to DXGI_FORMAT_R16G16B16A16_FLOAT, the application produces flickers when other windows or apps are staying/moving on the top of it but without entirely covering it. You can find here the video I made (sorry for the quality) to show the flickering, and also here the visual c++ 2015 mfc sample.

I tried something like changing erasebackground method, but still can't find a solution... Is this a programming level problem? but in which level, MFC, DirectX12, or DXGI? Or is this a os or hardware level problem??

I have already give the whole project vc++, so i suppose I can jump the step of giving the "Minimal, Complete, and Verifiable example". I dont show the code, because I dont know which part of code may be the cause of the problem, and also I am not sure if it is coding problem. And I would like to mention that the problem arises only when I replace the DXGI_FORMAT_R8G8B8A8_UNORM by DXGI_FORMAT_R16G16B16A16_FLOAT. And by the way, the flickering does not happen with DirectX11 if i do the same "integration to MFC" thing.

PS. There is no error or warning when debugging in VC2015.

PS. the same thing happens when I integrate the sample (by making it dll) into an C# Winforms apps.

0 投票
1 回答
568 浏览

graphics - 创建着色器资源视图性能

ID3D12Resource我想知道在将它传递给a之前为a创建一个着色器资源视图ID3D12GraphicsCommandList并在帧完成后销毁它是否被认为是一种“好的”做法?

请注意,我只为所述资源创建了一次描述符视图。

0 投票
0 回答
319 浏览

c# - 适用于 Windows Direct3D12 的 Unity 5.4 图形 API 未激活

我现在在装有 GTX980ti 和 4700K i7 处理器的 win10 计算机上使用 Unity 5.4.0f2。

我将“Windows 图形 API”部分中的 Direct3D12 选项填充为唯一选项,但游戏会自动返回到 Direct3D11 API。

我用SystemInfo.graphicsDeviceType命令检查了它。

如何强制游戏采用 DirectX12?

图片

0 投票
1 回答
787 浏览

c++ - 更新顶点缓冲区会导致调试层错误

我将 Windows 10 更新到版本 1607,其中包括额外的 D3D 调试层检查。我的顶点缓冲区更新代码在更新之前没有警告/错误,但现在我在调用时遇到错误CopyBufferRegion

资源 (0x000001DB301B9750:'') 的资源状态 (0xAC3: D3D12_RESOURCE_STATE_GENERIC_READ)(子资源:0)对于用作目标缓冲区无效。预期状态位:0x400:D3D12_RESOURCE_STATE_COPY_DEST,实际状态:0xAC3:D3D12_RESOURCE_STATE_GENERIC_READ

如果我转换vb到想要的状态 ( D3D12_RESOURCE_STATE_COPY_DEST),我会收到如下错误:

D3D12 错误:ID3D12CommandList::ResourceBarrier:某些堆仅限于某些 D3D12_RESOURCE_STATES 状态,并且无法更改。D3D12_HEAP_TYPE_UPLOAD 需要 D3D12_RESOURCE_STATE_GENERIC_READ。D3D12_HEAP_TYPE_READBACK 需要 D3D12_RESOURCE_STATE_COPY_DEST。[ RESOURCE_MANIPULATION 错误 #741:RESOURCE_BARRIER_INVALID_HEAP]

这是我的代码。它创建一个顶点缓冲区并上传顶点数据,必要时调整缓冲区的大小:

如何修复这些调试层错误?

0 投票
1 回答
257 浏览

rendering - 在 DirectX 12 上渲染多个模型错误

我试图仅使用一个图形上下文在 DirectX 12 上渲染多个模型,但结果非常奇怪,我不太清楚是什么原因。在此处输入图像描述sponza 模型从外部渲染结果,右边是正确的结果,左边是有问题的。

在此处输入图像描述从内部渲染左侧 sponza(有问题的)的结果。

即使加载的两个网格是相同的,每个模型都有自己的顶点缓冲区、索引缓冲区和 SRV。在创建图形上下文的过程中,只有一个图形上下文,并设置了每个模型的索引和顶点缓冲区,然后我调用drawIndexed()函数进行渲染。创建图形上下文后,我们每帧执行一次图形上下文。但是,如果我们为每个模型创建单独的图形上下文并每帧执行所有图形上下文,则渲染效果很好,但帧速率下降了很多。

提供有关导致奇怪结果的原因的任何提示将对您非常有帮助,或者提供更好的解决方案。非常感谢您。

0 投票
1 回答
1885 浏览

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 的任何格式创建资源视图描述。但是,您可以通过为视图指定类型化格式来查看无类型资源。


我真的不明白为什么不允许使用无类型格式以及我应该使用哪种格式

0 投票
2 回答
1364 浏览

uwp - 在 UWP 中混合使用 DirectX 12 和 XAML 控件

我想用 C++/CX 和 DirectX 12 创建一个 UWP 应用程序 (XAML),这样我就可以混合 XAML 控件(网格、按钮等)和 DirectX,比如关卡编辑器,但我很挣扎找到一种方法如何初始化 DirectX 以在特定控件(如网格)内呈现。

基本模板和所有其他教程仅展示了如何在应用程序的整个区域内进行操作。创建设备资源时,我们使用 SetWindow(CoreWindow::GetForCurrentThread()); 设置要绘制的窗口。

有没有办法从 xaml 控件中使用 hwnd 创建设备资源,有没有办法为特定控件获取 hwnd?

0 投票
1 回答
1129 浏览

c++ - 将多个网格绘制到不同的位置 (DirectX 12)

我对 DirectX 12 有疑问。我制作了一个小型 3D 渲染器。模型在顶点着色器中转换为 3D 空间,基本世界视图投影矩阵位于常量缓冲区中。

要更改常量缓冲区的数据,我当前使用memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize)此命令会立即替换常量缓冲区的数据。


所以问题就来了,绘图被记录到一个命令列表中,稍后发送到gpu执行。

例子:

在此之后,我将命令列表发送到 gpu 以执行,但询问所有网格将在同一位置,因为所有 memcpys 甚至在命令列表发送到 gpu 之前都已执行。所以基本上最后一个 memcpy 会覆盖以前的。


所以基本上问题是我如何将网格绘制到不同的位置,或者如何在命令列表中替换常量缓冲区的数据,以便常量缓冲区在 gpu 上的每个绘制调用之间发生变化?

谢谢


不再需要帮助,我自己解决了。我为每个网格创建了常量缓冲区。