问题标签 [directx-11]

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 回答
9459 浏览

directx - 以编程方式创建directx 11纹理,三种不同方法的优缺点

msdn 文档解释说,在 directx 11 中,有多种方法可以以编程方式填充 directx 11 纹理:

(1) 使用默认使用纹理创建纹理并使用内存中的数据对其进行初始化

(2)使用动态使用创建纹理,使用DeviceContext Map获取指向纹理内存的指针,写入它,然后使用Unmap指示您已完成(此时我猜它已复制到gpu)

(3) 使用 staging 使用创建纹理,并按照与动态纹理相同的步骤,但遵循调用 ID3D11DeviceContext.CopyResource 以使用此 staging 纹理依次填充(非不可变)默认或动态纹理。

但是文档根本没有解释每种方法的优缺点,而且我对directx还是很陌生,所以对我来说根本不清楚。

在directx 11中以编程方式创建纹理的每种方法的优缺点是什么?

旁注:我已经读过在暂存纹理的上下文中,从 gpu回的内容没有缓冲,因此您必须自己进行双缓冲。但我不知道这是否准确,以及它是否适用于使用 staging 纹理(甚至它的真正含义)的写作。

第二个注意事项: Map 方法文档说它获取指向子资源中数据的指针,并拒绝 GPU 访问该子资源。当 GPU 想要访问其底层数据已被 Map 调用的纹理时,它会做什么?地摊?(我问是因为这听起来像是我询问的利弊的一部分)

0 投票
2 回答
5563 浏览

graphics - directx中许多不同复杂对象的典型渲染策略?

我正在学习directx。它为如何做事提供了很大的自由度,但可能不同的策略执行不同,并且它几乎没有提供关于性能良好的使用模式可能是什么的指导。

使用directx时,每次渲染都需要多次交换一堆新数据吗?

最明显的,也可能是非常低效的使用方式是这样的。

策略 1

在每一个渲染

  1. 加载模型 0 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  2. 加载模型 1 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  3. ETC...

我猜如果要加载的最大的东西有专用的插槽,你可以部分提高效率,例如,如果模型 0 的纹理真的很复杂,不要在每一步都重新加载它,只需将它加载到插槽 1 中并保留它那里。当然,由于我不确定 DX11 中每种类型肯定有多少个寄存器,所以这很复杂(有人能指出这方面的文档吗?)

策略2

选择一些纹理槽用于加载,另一些用于永久存储最复杂的纹理。

只有一次

将最复杂的模型、着色器和纹理加载到专用于永久存储的插槽中

在每一个渲染

  1. 使用您为加载和渲染而留出的插槽(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)加载模型 0 尚未存在的所有内容

  2. 使用为加载和渲染预留的插槽(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)加载模型 1 尚不存在的所有内容

  3. ETC...

策略3 我不知道,但以上可能都是错误的,因为我真的很陌生。

在directx(特别是DX11)上进行高效渲染以使其尽可能高效的标准策略是什么?

0 投票
1 回答
311 浏览

graphics - 在directx中,如果重用一个插槽,gpu是否会将以前的资源保留在其内存中?也可以安全地更改原始处理器资源吗?

我正在写这个关于directx的问题,以下问题是其中的一部分,但我意识到我需要将它们分开。

如果某些东西不在 GPU 上的“槽”(寄存器)中,是否必须将其重新传输到 GPU 才能再次使用,即如果将纹理 A 放入寄存器 t0,然后将纹理 B 放入寄存器 t0,是纹理 t0 在 GPU 上不再可用?还是它仍然驻留在 GPU 内存中,但我必须调用以将其加载到纹理寄存器中才能获取它?还是完全不同的东西?

以类似的方式调用 PSSetShaders、PSSetShaderResource 或 IASetVertexBuffers 等......在返回之前将数据阻塞并复制到 GPU,因此在调用之后可以更改甚至释放它们所基于的资源,因为它现在是驻留在 GPU 上?

我想这不仅仅是一个问题,但我希望如果我尝试在一天内提出太多 directx 问题,我会遇到麻烦(我认为这些确实是体面的问题,msdn 文档对此保持沉默,即使它们是所有新手问题)。

0 投票
1 回答
1949 浏览

c# - SlimDX 11 深度缓冲区问题

我遇到了 SlimDX March SDK 的问题(我相信对于 DXSDK11 June 2010)。问题是,每当我将附加深度视图转到输出合并状态时,我都不会在屏幕上得到任何输出。我已经将我的代码与 DX11 样本进行了比较,它似乎是正确的。我已经为深度测试尝试了各种标志和格式(包括始终通过等),但似乎没有任何效果。如果有人能发现错误,我将不胜感激。这是代码。以下是步骤:

  1. 初始化后台缓冲区:

    /li>
  2. 然后初始化深度缓冲区:

    /li>
  3. 设置渲染目标:

    /li>

一旦我从 OutputMerger.SetTargets 中删除 DepthView,我就会开始在屏幕上看到图像(当然没有深度测试),反之亦然。

0 投票
1 回答
1767 浏览

wpf - 为什么不同的directx版本需要共享表面队列才能协同工作,更具体地是为了互操作WPF和directx 11

我想让 Directx 11 在 WPF 中工作。从这个问题的答案可以看出这是可能的。第二个答案指向一些实现“共享表面队列”的微软代码。

我正在浏览共享表面队列代码,但我不知道它实现了什么目的(除了需要使不同版本的 Directx 很好地共享一个表面)。创建共享表面队列以共享 directx 表面的目的是什么?(特别是 WPF 与 directx 11 的组合)。

注意:与我引用的问题不同,我没有使用 slimDX

0 投票
1 回答
2648 浏览

c++ - 映射动态纹理导致“已映射错误”

我刚开始使用 Direct3D11,我正在尝试创建一个动态纹理,我计划每秒用新数据更新几次。我的问题是每次我用新数据更新纹理时,我都会从 D3D 调试器中得到这个错误:

D3D11:错误:ID3D11DeviceContext::Map:此资源已被映射![RESOURCE_MANIPULATION 错误#2097213:RESOURCE_MAP_ALREADYMAPPED]

在运行应用程序一段时间后,最终会从 Map 调用中变成 E_OUTOFMEMORY 错误。

我正在创建这样的纹理:

并像这样更新其数据:

在创建纹理并将数据映射到它之前,我在程序中所做的就是初始化 Direct3D 设备。我完全被自己做错了什么难住了。我一直在尝试在 msdn 上尽可能多地阅读有关此内容的信息,但没有任何东西可以帮助我弄清楚出了什么问题。根据 msdn,我正在采取适当的步骤:

http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic

我相当确定我也正确填写了纹理描述。

问题可能源于我对 d3d 设备的初始化吗?我是否滥用了地图功能?我没有提供足够的背景信息吗?关于发生了什么的任何想法?

附加信息:当我尝试将数据映射到顶点着色器的常量缓冲区时,出现相同的“资源已映射”错误。另外,我在另一台计算机上对其进行了测试,并遇到了相同的映射问题。

更新:我下载了一些 D3D11 的教程代码,并在教程代码完成初始化 d3d 后立即将我的纹理创建和映射代码放入其中。我只是想看看我是否会收到映射错误。正如预期的那样,我没有收到“资源已映射”错误。此外,当我从教程中复制 d3d 初始化代码并将其替换为我的时,我仍然得到资源已映射错误,这甚至让我更加困惑,因为我在初始化 d3d 之前所做的只是创建一个窗口。

0 投票
1 回答
832 浏览

directx - 首先处理着色器。最初对 DirectX 教程感到困惑

我正在关注 DirectX 教程,但对 Visual C++ 2010 上的 C++ 知识知之甚少。到目前为止,我已经足够了解/理解所有内容,但现在我正在尝试包含一个 HLSL 着色器。我有我需要的内容,但我不知道 HLSL 需要什么样的文件。是否需要制作文件的格式?我尝试将着色器代码放入 .cpp 文件,但在使用 CreateVertexShader 函数时出现访问冲突。我把它放在一个头文件中,但它像 C++ 一样读取 HLSL 代码并出现语法错误。教程在这里:http ://www.directxtutorial.com/Tutorial11/BA/BA5.aspx

页面底部代码中的代码相同,并且可以编译,但在调试时出现访问冲突。谁能告诉我我需要做什么才能正常运行?

谢谢。

0 投票
2 回答
11749 浏览

c++ - 如何正确使用 XMVECTOR 成员变量

我有一个简单的 IRenderable 类,它具有位置、缩放和旋转的成员:

我正在尝试使用构造函数设置它们。这里的第一种方法给出了访问冲突 0x00000000 试图设置 _rotation (_position 和 _scaling 都设置好):

将 _rotation 改为 XMVECTOR* 并在构造函数中使用 _rotation(new XMVECTOR()) 将其设置为空 XMVECTOR,但稍后在尝试设置身份四元数时会引发访问冲突:

在创建对象时,在构造函数中使用 XMQuaternionIdentity 的地址可以正常工作,

但是四元数本身在需要用于渲染时包含垃圾数据。_position 和 _scaling 在所有这些情况下都可以正常工作。

在这种情况下使用 XMVECTOR的正确方法是什么?

0 投票
1 回答
221 浏览

fullscreen - 为什么我的纹理无法在全屏模式 DX11 游戏中显示

我在 DX11 游戏中绘制纹理。奇怪的是,纹理从未在全屏模式下出现。

我在这里列出我的状态设置以供参考。

最可能的问题是什么?

谢谢,马歇尔

0 投票
1 回答
3786 浏览

directx - 在 DirectX 11 中,如何在 SwapChain (DXGI_SWAP_CHAIN_DESC) 中创建和注册两个缓冲区

我是 DirectX 11 的初学者,在《Beginning DirectX 11》一书的第 2 章中,有一个使用以下代码创建缓冲区的代码:

我的问题是,在交换链的描述中,显然只有一个缓冲区的空间,因为只有一个 BufferDesc(DXGI_MODE_DESC 结构)。那么如果 BufferCount 设置为 2 或更大,那么第二个缓冲区是如何注册的呢?是否使用另一个 DXGI_SWAP_CHAIN_DESC?请发布一些示例代码。

BufferCount 也有 UNIT 类型,这意味着可以添加两个以上的缓冲区。而双缓冲技术中使用了2个缓冲区,其中一个缓冲区用于绘制,另一个缓冲区用于在场景上显示,并交换缓冲区。两个以上的缓冲区有什么用,有什么好处?