问题标签 [direct3d11]

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 投票
2 回答
603 浏览

windows-7 - direct3d11.1 id3d11device1 无法使用 11.1 功能 (win7)

我已成功创建 d3d11.1 设备及其上下文 (ID3D11Device1, ID3D11DeviceContext1)

使用文档中描述的方法:

d3d11.1 对象有效且有效,但我不能使用任何 d3d11.1 特定功能。以及CheckFeatureLevel(D3D11_FEATURE_D3D11_OPTIONS)Returns all FALSE 的结构。ft_level也是D3D_FEATURE_LEVEL_11_0从 ID3D11Device1 获取之后。

我在这里缺少什么吗?我在 windows7 SP1(带有平台补丁)、Windows 8.0 sdk 和我的 AMD 5950 卡的 Catalyst 13.9 驱动程序上。

0 投票
1 回答
268 浏览

sharpdx - 如何按名称获取纹理的插槽号?

使用 Direct3D 11 和 SharpDX,给定在着色器中声明的纹理贴图的名称,我如何知道将我的 Sampler 和 TextureView 分配到哪个插槽?

文档表明我可以使用 ShaderReflection,但不清楚如何...

0 投票
1 回答
6860 浏览

vertex-shader - 为什么这个计算着色器比顶点着色器慢得多?

我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器。我发现计算着色器的执行速度比顶点着色器慢得多,但在我把它写下来之前,我想确定我没有做错什么。

使用我的 100,000 个顶点的测试数据和 300 个骨骼的 1,000 帧动画数据,顶点着色器的运行时间约为 0.22 毫秒,而计算着色器的运行时间是 0.85 毫秒的 4 倍。计时是通过 D3D API 计时器查询(而不是 cpu 计时器)完成的。

变形结构体.hlsl

bone_deform_cs.hlsl

bone_deform_vs.hlsl

缓冲区运行后比较它们的内容,它们是相同的并且包含预期值。

我怀疑我可能错误地执行了计算着色器,产生了太多线程?我传递给Dispatch错误的号码吗?由于它是一维数据行,因此对我来说使用[numthreads(64,1,1)]. 我尝试了 32-1024 的各种值。64 似乎是最佳选择,因为它是高效使用 AMD GPU 所需的最低要求。反正。当我调用时Dispatch,我要求它执行(vertex_count / 64) + (vertex_count % 64 != 0) ? 1 : 0。对于 100,000 个顶点,调用最终为Dispatch(1563,1,1).

这就是顶点着色器的执行方式:

或者答案仅仅是从着色器资源视图读取并写入无序访问视图比从顶点缓冲区读取并写入流输出缓冲区要慢得多?

0 投票
0 回答
404 浏览

directx - 为什么在主显卡上运行着色器时 MRT 渲染失败?

我有一台带有两张显卡的笔记本电脑:集成的英特尔显卡和一张 NVidia GeForce 610M 显卡。我使用 MRT 使用 Direct3D 11(使用 D3D_FEATURE_LEVEL_11_0)执行一些 GPGPU 任务。我遇到了混合问题(显卡应该支持后像素着色器混合),而且行为非常奇怪。

如果启用了混合,则会启动 Windows,将集成显卡选为首选显卡,并在 NVidia 上运行渲染,一切都按预期工作。

如果启用了混合,并且 Windows 启动时将 NVidia 显卡选为首选显卡并在 Nvidia 上运行渲染,则显卡驱动程序会挂起;d3d11 调试层已启用并正常工作,但我没有收到任何错误。

如果混合被注释掉一切正常,但我需要混合。我多次测试了这些场景。每次更改首选显卡后,我都必须重新启动计算机。

我的理论是 GeForce M610 不足以同时处理 Windows 和我的应用程序(Windows 使用它自己的资源),这就是为什么当我使用第二种情况时程序挂起的原因;但我怀疑这太不稳定以至于实际上是正确的。如果显卡 API 说支持 D3D_FEATURE_LEVEL_11_0,我怎么能写出稳定的应用程序,然后就挂了?我应该怎么做才能防止这种情况发生?我的理论错了吗?

挂起发生在 Map 调用期间。

0 投票
1 回答
447 浏览

c++ - 为什么我的方块会这样做(索引缓冲区问题)?

为什么我的方块会这样做(索引缓冲区问题)?

在此处输入图像描述

我设置了以下顶点和索引:

我已经完成了这样的初始化:

传递给着色器设置的常量缓冲区如下所示:

我的输入布局如下所示:

我的绘图部分如下所示:

我已经像这样设置了我的视角和相机:

额外信息

如果我将 IASetIndexBuffer 2nd 参数更改为 DXGI_FORMAT_R16_UINT 它会绘制:

在此处输入图像描述

0 投票
1 回答
881 浏览

c# - 基于 SharpDX DataStream 的缓冲区初始化失败

我正在尝试使用 D3D11 创建一个非常基本的网格渲染器,以便在我的学校期末项目中使用。尽管我严格按照 rastertek 网站和 Frank De Luna 的书之类的基本在线教程,使用了可以想象到的最简单的直通着色器等,但我无法让我的三角形出现在屏幕上。最后我发现了 VS 2013 的图形调试能力,我能够看到我的顶点和索引缓冲区被垃圾数据填充。如果您想运行代码,我已经在此处托管了解决方案,但是熟悉 D3D 和/或其 SharpDX C# 包装器的人可以告诉我我在以下代码中做错了什么吗?

这是我的几何数据。Vertex 结构有 Vector4 位置和颜色字段,Index 是 ushort 的别名。

这是无法使用上述数据初始化我的顶点和索引缓冲区的代码。

但是,如果我用以下代码替换上面的代码,它就可以工作。我不知道我做错了什么。

0 投票
1 回答
138 浏览

windows-phone-8 - wp8 D3D11,中断时,我无法释放当前使用的SRV

我使用模板 Direct3D & XAML 为 winphone8 创建项目,当我按下 win 按钮时,它调用 OnNavigatedFrom 进行中断,这里我释放所有 D3D11 ID3D11ShaderResourceView* 并希望在回到我的游戏时重新创建它们。我在释放每个 SRV 时打印应用程序内存日志。我发现当我为 SRV 调用 Release() 时,内存实际上已被释放,但当前使用的 SRV 除外。所以内存泄露了。我该如何解决这个问题?

0 投票
1 回答
335 浏览

direct3d - (D3D11)在单独的线程上读取纹素

在 D3D10 中,我将暂存纹理加载到我的 GPU 内存中,然后对其进行映射,以便在 CPU 上访问其纹理数据。这是在一个单独的线程上完成的,而不是我渲染的线程。我只是调用设备方法,它可以工作。

在 D3D11 中,我将暂存纹理加载到我的 GPU 上,但要访问它(即映射它),我需要使用上下文,而不是设备。不能使用即时上下文,因为即时上下文一次只能由单个线程使用。但我也不能使用延迟上下文从纹理读取到 CPU:

“如果在延迟上下文中调用 Map,则只能将 D3D11_MAP_WRITE_DISCARD、D3D11_MAP_WRITE_NO_OVERWRITE 或两者都传递给 MapType 参数。延迟上下文不支持其他 D3D11_MAP 类型的值。”

http://msdn.microsoft.com/en-us/library/ff476457.aspx

好的,那我现在该怎么办?使用纹理来存储某些数据(例如高度图)是很常见的,显然您必须能够访问该数据才能使其有用。我没有办法在 D3D11 的单独线程中执行此操作吗?

0 投票
0 回答
792 浏览

directx - 将逐顶点数据渲染到纹理 (Direct3D 11)

我生成简单的二维网格,三角形带代表水面。第一个生成的顶点位置为 [0,0],最后一个顶点的位置为 [1,1]。对于我的水模拟,我需要将顶点的当前位置存储到纹理中,然后从下一帧的纹理中采样这些值以获得水面的先前状态。

所以,我创建了顶点大小的纹理。例如,如果我将有一个 10x10 的顶点网格,我将使用具有 10x10 像素的纹理(一个像素对应一个顶点数据)。并将此纹理设置为渲染目标以将所有顶点数据渲染到其中。

根据这个:MSDN Coordinate Systems,如果我将使用网格中顶点的当前位置(左下角 [0;0],右上角 [1;1]),渲染纹理如下所示:

在此处输入图像描述

所以我需要对 NDC 做一些转换。我将它转换为这样的顶点着色器:

[顶点.x * 2 - 1; 顶点.y * 2 - 1]

考虑这个 3x3 网格:

在此处输入图像描述

现在,网格被拉伸到整个纹理大小。纹理坐标与 NDC 不同,显然我可以使用网格的原始坐标(转换之前)从纹理中采样值并获取顶点的先前值(位置)。

这是我的顶点/像素着色器代码示例:

此顶点着色器转换坐标并将其发送到具有 SV_POSITION 语义的像素着色器(描述像素位置)。

这是像素着色器在定义的像素位置(SV_POSITION)保存顶点着色器的值。

我们终于解决了我的问题!我在 Visual Studio 2012 中使用图形调试器,它允许我查看渲染的纹理及其值。我希望在像素位置 [0,1] (在纹理坐标系中)应该是值 [0,0] (或者 [0,0,0,1] 是精确的,对于 RGBA 格式),但似乎最终像素的值在 3 个顶点之间插值,并且给定顶点的值错误。

VS 图形调试器的屏幕截图:

渲染的 3x3 纹理(纹理坐标系中的 [0;1] 位置):

在此处输入图像描述

来自顶点和像素着色器的值:

在此处输入图像描述

如何将顶点着色器的精确值渲染到给定像素的纹理?我对计算机图形和 Direct3D 11 还很陌生,所以请原谅我的不足。

0 投票
0 回答
276 浏览

c++ - 编组 D3D11Device 和 D3D11DeviceContext 对象

这篇文章说:

ID3D11DeviceContext 方法(除了那些存在于 ID3D11DeviceChild 上的方法)不是自由线程的,也就是说,它们需要单线程。一次只有一个线程可以安全地调用它的任何方法(Draw、Copy、Map 等)。

我想知道我是否可以让 COMID3D11DeviceContext为我做同步。

假设我这样做(在简化代码中):

然后我要么编组它:

或者我们一个 GIT 表:

不幸的是,这似乎不起作用。 CoMarshalInterThreadInterfaceInStream返回REGDB_E_IIDNOTREG( 0x80040155, Interface not registered) 并pStreamD3D11DeviceContext保持为 NULL。

GIT 方法更进一步。我得到了 cookie,但是当我尝试在另一个 MTA 线程上使用它时,GetInterfaceFromGlobal 返回 E_INVALIDARG。

参数GetInterfaceFromGlobal似乎没问题,我测试了将指针返回到原始线程并且它有效。

D3D11DeviceD3D11DeviceContext似乎是不可编组的。显然,我既没有代理 DLL,也没有 d3d11 的类型库。

我错过了什么吗?

谢谢你。