问题标签 [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 投票
3 回答
2379 浏览

indices - DirectX 12 索引缓冲区

我是 DirectX 12 的新手,并试图在 DX 上渲染网格。到目前为止,我成功地从 obj 和 fbx 文件中检索到顶点和索引,并使用模板通用窗口项目在 DX 12 上渲染所有顶点。但是,我遇到了索引缓冲区的一些问题,因为三角形列表的渲染结果完全不正确,尤其是当输入网格很大(数十万个顶点)时。基本上,索引数据被写为一个指针数组,它似乎是正确的。使用线表图元拓扑,渲染结果如下图所示。 线表图元拓扑渲染结果

我想知道是否有人可以提出任何可能在代码中出错的建议。对于 IBV 设置,我使用模板项目中的确切代码。提前感谢您的任何帮助。

更新:数据是使用 FBX SDK 检索到的 obj 文件数据。我确认了 obj 网格信息和检索到的数据,它们是精确匹配的。所以我认为数据文件是正确的。此外,对于 IBV 设置传入的数据,例如缓冲区字节大小,也是正确的。对于代码,它来自 VS DX 12 模板通用 windows 项目,如下所示。非常感谢您的帮助。

0 投票
2 回答
1373 浏览

c++ - GetCPUDescriptorHandleForHeapStart 堆栈损坏

在使用 DirectX 12.0 进行编程时,我偶然发现了一个相当不寻常的问题。到目前为止,还没有任何研究具有洞察力。

我正在使用 C(不是 C++)进行编程。看起来官方的 DirectX 12 标头支持 C 和 C++ 的绑定,但是编写 C 等效代码来执行上述任务会导致崩溃,而 C++ 则不会。我不相信错误是我的。

以下是详细信息:我的 D3D12 设备初始化过程中有以下代码块:

其中hRTV代表“渲染目标视图的句柄”(D3D12_CPU_DESCRIPTOR_HANDLE),而pRTVHeap代表“指向渲染目标视图堆的指针” (ID3D12DescriptorHeap)。

这是 C++ 等价物 - 这很好用:

不存在编译时错误,但在运行时,在 C 中调用此方法 (GetCPUDescriptorHandleForHeapStart) 会触发堆栈损坏(%ESP 被替换 4 个字节)。

我检查了该方法的反汇编并记下了 RET(返回)指令:

对于那些熟悉汇编和(希望)__stdcallCOM(组件对象模型)对象的调用约定的人this来说,在堆栈上传递的(或等效的)指针是第一个参数(在这种情况下,应该是唯一的参数)的方法,一种使 COM 对象能够访问自己的数据的做法。

以下代码片段(也显示在上面)引起了我的困惑,当运行时抛出“未对齐的堆栈指针/堆栈损坏”(%ESP)错误时,这是​​理所当然的:

在这种情况下,只应传递一个参数(this指针)。指针的大小(在 32 位系统上——我的目标架构是 x86)是 4 个字节(32 位),那么为什么被调用者清理堆栈上的 8 个字节呢?

我称这为错误是否正确?Microsoft 是否需要被告知此问题?我错了吗?

感谢您抽出宝贵的时间,希望比我有更多知识的人能启发我。请不要提出偏爱 C++ 而不是 C 的古老论点。

0 投票
2 回答
2260 浏览

c++ - Direct3D 12 窗口模式强制垂直同步

我正在编写一个简单的 Direct3D 12 应用程序来为 Vulkan 的发布做准备,它在所有方面都按预期工作,除了一个:在有边框的窗口中运行将帧速率限制为 60fps,即使禁用了 vsync。令我困惑的是:全屏窗口中的同一程序以近 4000 fps 的速度运行。

使用肮脏的自制分析器,我发现挂断发生在我的代码的这一部分,它一直等到最后一帧完成,然后才开始处理下一帧。

用于呈现渲染帧的代码很普通:

注意:第一段代码使用上述函数的返回值作为endFenceValue.

我正在使用的交换链是这样设置的:

对于那些感兴趣的人,我正在使用 SDL 创建窗口,但我自己编写WinMain并没有解决问题。我还尝试在 nVidia 控制面板中检查我的 vsync 设置,退出 fl.ux(但不卸载它),并在系统属性中更改我的性能设置。

任何人都可以为此提供解释或解决方案吗?

0 投票
1 回答
343 浏览

c++ - 你如何读取顶点/索引缓冲区?

基本上,我的问题是:如何在 DirectX 12 中读取顶点/索引缓冲区?我想我正在寻找与 DirectX 11 的地图功能等效的东西,我现在明白你必须手动完成。我尝试用谷歌搜索答案,但没有找到任何东西。DirectX 12 示例/教程并不多,因为它很新。

0 投票
1 回答
1045 浏览

c++ - 在 D3D12 中绘制多个对象

我正在修补 DirectX 12,并且在尝试绘制“棋盘”时碰壁了。我已经在网上搜索了很多,所以任何帮助/指针将不胜感激。

在 D3D11 中,工作代码如下。

在 D3D12 中,我尝试过做同样的事情,但它似乎是在全局执行翻译,因为所有正方形都在同一个位置。

谢谢你,切尔西

0 投票
1 回答
914 浏览

c++ - 无法绘制方形 DirectX 12 c++

在 D3D12 中,如何绘制正方形?以下代码只能绘制第一个三角形。

为什么我们在 D3D12 中没有 D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLELIST?TRIANGLELIST 有什么选择吗?或者有什么办法可以直接画正方形?

0 投票
1 回答
523 浏览

c++ - c++,directx 12:颜色选择问题

我想在 DirectX 12 中实现颜色选择。所以基本上我要做的是同时渲染到两个渲染目标。第一个渲染目标应该包含正常渲染,而第二个应该包含 objectID。

要渲染到两个渲染目标,我认为您需要做的就是使用 OMSetRenderTargets 设置它们。

问题 1:如何指定应将哪个着色器或管道状态对象用于特定的渲染目标?就像你怎么说render_target_0应该用shader_0渲染,render_target_1应该用shader_1渲染?

问题 2:渲染后如何从帧缓冲区中读取像素?是否像 DirectX 11 中使用 CopySubresourceRegion 然后使用 Map?你需要使用回读堆吗?您是否需要使用资源屏障或栅栏或某种同步原语来避免 CPU 和 GPU 同时使用帧缓冲区资源?

我尝试在谷歌上搜索答案,但并没有走得太远,因为 DirectX 12 非常新,而且还没有很多适用于 DirectX 12 的示例、教程或开源项目。

提前感谢您的帮助。

代码示例的额外特别奖励积分。

0 投票
1 回答
669 浏览

c++ - 在交换链中为每个 renderTarget 创建一个分配器是否有意义?

Microsoft 的 HelloWorld 示例大多使用单个 CommandAllocator,然后等到前一帧完全完成。然而,他们也说(全部大写)这不是应该怎么做的。

所以我的想法是在交换链中每帧​​创建一个分配器,并在循环缓冲区中保留要等待的栅栏值:

这是一个理智的方法吗?或者,还有更好的方法?

0 投票
2 回答
4536 浏览

c++ - C++ ofstream:找不到输出文件

我已经创建了一个默认的 DirectX12 应用程序(旋转 3D 立方体),并且在我void DX::DeviceResources::Present()尝试将后台缓冲区写入文件中:

问题出现在这里:

我只想先写一个文件(如此处所示,然后再尝试写后台缓冲区的内容。现在,由于某种原因,我找不到输出文件......我到处搜索,我的项目中的所有目录,甚至在 Microsoft DirectX SDK 文件夹中。

没有抛出异常,我可以在调试时单步执行每一行而不会出错。

它可能在哪里?

0 投票
3 回答
1377 浏览

c++ - 在使用 VS 2015 的 DirectX12 应用程序中,ofstream.is_open() 始终为假

我已经尝试了几个小时,但我无法让我的DirectX12应用程序编写一个简单的文件......

关于我的设置:

  • Windows 10 更新。
  • DirectX12 默认的“旋转立方体”应用程序。DirectX 12 应用程序(通用 Windows)
  • 视觉工作室 2015

我正在这样做:

我尝试过的(几乎所有在阳光下和厨房水槽下的东西):

  • 我也试过使用fstreamwfstream以及做!outfile.fail()
  • 我检查了项目中的每个目录,甚至还尝试使用了 Microsoft DirectX SDK。
  • 我试过相对路径:outFile.open("WHERETHEFISMYFILE.txt");
  • 我试过设置绝对路径。
  • 我已经尝试通过允许“每个人”并授予完全访问权限来向文件夹添加权限 - 只是为了理智。
  • 我也尝试过获取当前的工作目录,并将其C:\Users\pookie\Documents\Visual Studio 2015\Projects\demoDX12\x64\Debug\demoDX12\AppX设置为c:\
  • 我在项目的每个文件夹中手动创建了文件...
  • 我已经尝试过调试和发布配置,以及 x86 和 x64 及其所有可能的组合
  • 我已经尝试\\过以及//在我的文件路径中
  • 我尝试用 %20 替换路径中的空格
  • 我也尝试过在管理员模式下运行 Visual Studio。

问题出现在这里:if (outFile.is_open()). 由于某种原因,它总是返回 false。

我在这里做错了什么?

更新: 为了让我放心,我尝试了一个带有以下代码的空控制台应用程序:

结果是一样的:is_open() == false. 我在这里不知所措。

更新 2:

根据要求,我正在更新此问题以显示我正在使用的确切项目。我正在使用默认的 DirectX12 应用程序 - 旋转立方体。我跟着这个教程

在我的项目中,有一个名为的void DX::DeviceResources::Present()方法,我试图在这个方法中写入文件(尽管我在这个项目的许多其他地方也试过这个。

这里是:

更新 3

所以,一个带有文件输出的空白项目工作正常,如果我使用

注意ios_base::out

这可以。但是,这在默认的 DirectX12 应用程序中仍然不起作用。

这绝对是与 DirectX 相关的问题。看到这个。我已尝试按照该帖子中建议的解决方案进行操作,但仍然无法使其正常工作。

我还可以确认一个全新的 DirectX12 项目也有同样的问题。试试看。

解决方案

感谢 ebyrob,我得到了这个工作。事实证明,这些新的 Windows 应用程序只能写入某些文件夹......更具体地说,这是:

不幸的是,路径不是标准字符串...所以必须先转换:

然后只需添加文件名:

最后:

谢谢埃比罗布!!