问题标签 [direct3d10]

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 投票
0 回答
637 浏览

bitmap - 如何更有效地将位图绘制到 Direct3D 后备缓冲区?

据我所知,使用 Direct3D 10 有两种方法可以在后台缓冲区上绘制位图:

  1. 锁定后台缓冲区的表面,将位图复制到表面,解锁表面。
  2. 锁定一个纹理,将位图复制到纹理,解锁纹理,让纹理经过所有渲染阶段,最后到达后台缓冲区。

现在我有一个位图动画,即每个位图只显示一次。无论哪种方式,位图都会发送到 GPU 并被丢弃。似乎第一种方式应该更快,但我不确定。最糟糕的是,我现在无法自己测试...

0 投票
0 回答
744 浏览

interop - 多重采样和 Direct3D10 / D3DImage 互操作

我正在尝试使用 Direct3D 10 (SlimDX) 和 WPF 实现渲染引擎。

我使用正确的 MultiSample 参数(1,0 / 2,0 和 4,0 正在工作)创建我的设备和 rendertargetview

然后我在尝试为 D3DImage 创建共享纹理时遇到了问题......

...

...

我错过了什么?

0 投票
2 回答
401 浏览

direct3d - DirectX 架构资源

任何人都可以张贴到DX 驱动程序架构的链接,该架构涵盖了块管理器等主题。大量的谷歌搜索,但我对我从谷歌得到的不满意。首选 nvidia 特定资源。
MSDN 似乎也只关注 DX API。它不会诅咒他们,因为他们无法控制司机。

0 投票
2 回答
719 浏览

direct3d - 为什么我们仍然在 D3D11 等中使用固定函数混合操作?

我一直在试图理解为什么我们仍然在较新的 3D API(如 D3D11)中使用固定功能混合模式。在 D3D10 中,移除了固定功能 Alpha Clipping,以支持使用着色器。为什么,因为它在几乎任何情况下都是一种更强大的方法。

那么为什么我们不能计算或拥有混合操作(也就是我们当前正在渲染的 RenderTarget 中的纹理样本)?视频卡流水线中是否存在一些硬件设计问题使得这难以完成?

这很有用的原因是因为您可以做一些事情,例如使折射着色器运行得更快,因为您不必在每个折射对象叠加的两个渲染目标之间来回交换。例如用于操作系统或游戏 UI 的折射窗口系统。

哪里可能是提出这样一个想法的最佳地点,因为这不是一个讨论论坛,因为我希望在 D3D12 中看到这个?或者这在 D3D11 中已经可以实现了吗?

0 投票
2 回答
1355 浏览

nvidia - nvapi 在 d3d10 中使用 NvAPI_Stereo_SetDriverMode

我目前正在尝试使用函数 NvAPI_Stereo_SetDriverMode 将 nvapi 设置为在直接模式下工作。

根据 Nvidia nvapi站点(在手册中),如果您想进行 direct3d 实现,您需要初始化 nvpai ,然后设置直接模式,然后创建设备 (d3d10device) ,然后创建立体声句柄......(继续该程序)。

我试过了,但是函数 NvAPI_Stereo_SetActiveEye(它告诉我要渲染我的网格的哪只眼睛)说该模式不是直接模式。

当我查看头文件时,我发现应该在创建句柄后调用该模式。但是当我这样做时,它返回了 NVAPI_INVALID_ARGUMENT (我再次无法设置活动眼)。

有没有人遇到同样的问题?

我试图在网上查看带有 nvapi 的示例,但它似乎是新的,并且 nvidia 开发人员区已关闭(由于一些技术问题)。

0 投票
0 回答
2261 浏览

directx - 禁用 DWM 的窗口模式下的 Direct3D 10 垂直同步问题

在禁用 DWM 的窗口模式下,Direct3D 10 上的 vsync 出现问题。

我们有一个应用程序,它呈现并呈现一些输出。它必须在窗口模式下工作,并且必须至少产生稳定的 60 fps。一个版本的应用程序使用 Direct3D 9 和另一个 Direct3D 10。当我们在窗口模式下工作时,有时我们会降低 fps(它不是​​“稳定”降低。在大多数情况下,我们产生稳定的 60 fps,有时它会突然降低几秒钟,然后恢复到 60 fps)。在这两个版本的应用程序中,fps 降低约为 10-20 fps。这是不可接受的。

在 Windows Vista 和 Windows 7 中,有新的图形系统,称为“桌面合成”,它改变了应用程序在屏幕上显示像素的方式。桌面合成由桌面窗口管理器 (DWM) 执行。您知道,当启用 DWM 时,应用程序会绘制到显存中的屏幕外表面,而不是由 DWM 渲染并在一段时间内呈现在显示器上。因此,我们注意到,当任务管理器中的 dwm.exe 不执行任何操作(处理时间约为 0%)时,我们的 fps 会降低,而当 dwm.exe 占用 1-3% 的处理时间时,会有稳定的 60 fps 并且一切正常好的。

我们无法影响它。因此,我们必须关闭 DWM 才能获得高稳定的 fps。当我们关闭它时,一切正常。两个版本的应用程序都有稳定的 60 fps。但是DWM是在窗口模式下做vsync的,所以当我们关闭它的时候,我们必须自己做vsync。

但是当我们关闭 DWM 时,Direct3D 10 在窗口模式下的 vsync 会出现问题。显示器顶部有图像撕裂。Direc3D 9 一直运行良好。

因此,我们有一台刷新率为 60 Hz 的显示器。

在创建交换链时,我们设置了这样的参数:

在演示时,我们设置了一个标志来打开 vsync:

并有下一个垂直同步问题。有垂直线,从左侧快速移动到右侧。并且显示器顶部有图像撕裂。
http://bit.ly/POQoFq

起初我们认为,我们做错了什么。所以我用旋转立方体安装了微软的示例“Tutorial 07: Texture Mapping and Constant Buffers”。使立方体更大,将其放置得更高,使其旋转更快并遇到相同的问题(见图)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu

因此,在全屏模式下的 Direct3D 10 上一切正常。垂直同步完美运行。在 Direct3D 9 上也一切正常,在禁用或启用 DWM 的情况下,vsync 效果很好。在禁用 DWM 的窗口模式下的 Direct3D 10 上存在问题。

它在不同的计算机、不同的显卡(Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试。问题稳定重现。我们使用的是 Windows 7。

那么,为什么会出现这样的问题呢?如何解决它以及下一步该怎么做?

UPD1。如果上面的图像不可用,则有一些镜子。

https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313。 JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG

UDP2。我还想注意,我正在创建带有标志 WS_POPUP 的窗口以隐藏标题栏(它必须被隐藏)。图像撕裂出现在不同的地方。它总是在屏幕的顶部,但它可以是 20 像素,也可以是 50 像素。因此,在创建带有标题栏的窗口时,有时图像的顶部可能根本看不到图像撕裂。

0 投票
1 回答
538 浏览

c++ - D3DX10CreateEffectFromFile 在另一台计算机上返回 E_FAIL

我有一个小型应用程序,它可以加载模型并在没有照明或其他任何东西的情况下显示它。我一直在尝试构建一个版本并在另一台计算机上运行它,但 D3DX10CreateEffectFromFile 不断返回 E_FAIL。

效果文件在我的开发机器上完美编译并且完美运行,但在另一台 PC 上却不行。pc的规格没有那么不同。两者都是Windows7,都有GeForce显卡。唯一真正的区别是我尝试运行该版本的计算机具有兼容 DirectX 11 的显卡。

我的发布版本的文件夹看起来像这样......

G:\模型加载器

d3dx10_43.dll

模型查看器.exe

简单的.fx

test.txt(模型文件)

这在我的开发机器上运行得非常好(我已经注释掉了大部分代码,所以我所做的就是打开一个窗口,initD3D10 并尝试加载一个效果)。在另一台 PC 上一切正常,直到...

我认为着色器不包含任何错误,因为它可以在我的开发电脑上正确编译

L"simple.fx" 也是正确的文件路径,因为我可以使用 std::ifstream 从中读取。我已经搜索了几个小时并且无法找到答案,所有相关问题都证明是效果文件中的错误,该文件可以在我的开发机器上编译。

当我将错误添加到效果文件并在我的开发机器上运行它时,错误会显示在消息框中。当我在我的另一台电脑上运行相同的错误代码时,没有打印错误并且 l_pBlob_Errors == 0

它可能真的很菜鸟和容易,但我只是不明白发生了什么。任何帮助将不胜感激

0 投票
1 回答
123 浏览

mozilla - Mozilla NPAPI AsyncDrawing 中的 NPDrawingModelAsyncBitmapSurface 有什么用?

Mozilla 公开了一个AsyncDrawing API,它可以在 NPAPI 插件中启用硬件加速渲染。
虽然NPDrawingModelAsyncWindowsSharedSurface模式需要 Vista 和更高版本,
NPDrawingModelAsyncBitmapSurface也适用于 Windows XP。
但是在他们的示例代码中,在函数 drawAsyncBitmapColor 中,
插件使用 memcpy 并在像素上循环来绘制位图:

这是否意味着昂贵的复制必须由 CPU 而不是 GPU 完成?
这是否意味着 NPDrawingModelAsyncBitmapSurface 不允许您利用硬件加速?

谢谢

0 投票
1 回答
1223 浏览

multithreading - 如何修改现有的基于 Direct2D 的库以同时从多个线程访问函数?

我正在使用现有的图形库,其中一个实现使用 Direct2D。(它也可以使用 GDI+、Quartz 等。)它有位图对象、钢笔、画笔等,所有这些都作为 Direct2D 对象的包装代码实现。该库是封闭源代码,不幸的是我可能无法在此处发布大量内容。

我发现当使用多个线程时 - 一个线程生产者,创建位图并绘制到它们,一个线程消费者,在屏幕上绘制它们 - 有时生产者线程产生的位图是完全空白的:图像数据(内部纹理)全为零. (位图是纹理周围的包装器对象,但表示位图就像您可能会想到的 GDI+ 位图对象一样。我相信您熟悉一般范例。)请注意,它永远不会崩溃,只是有时默默地失败。一个典型的症状是绘制位图数据,调用Unmap从缓冲区复制回纹理,然后当您稍后尝试绘制它时发现纹理是空白的。

我认为正在发生的是:

  • 为了直接写入像素数据,正如我的生产者线程所做的那样,库提供了直接访问像素数据的函数MapUnmap有一个 DirectX10 设备,一个“共享设备”,它用于调用CopyResource从内部纹理复制到缓冲区,然后可以自由写入,然后以另一种方式取消映射复制回来。我认为有时这会默默地失败。
  • 共享设备的这种做法在整个库中都有使用:有一个共享渲染目标(ID2D1RenderTarget)用于创建共享位图(对它们的操作是通过一个设备、一个渲染目标等完成的。ID2D1Bitmap
  • 当多个线程同时使用“位图”时,几个操作可能会失败:(CopyResource上面提到的)返回voidnot HRESULT,有时会失败;ID2D1RenderTarget::DrawBitmap也默默地失败了。

所以,我想解决这个问题并侵入库足够的线程安全性,我可以可靠地实现我的生产者 - 消费者线程系统。我该怎么做呢?

我一直在阅读有关从多个线程使用 Direct2D 的正确方法的大量内容。

  • 所有工厂都已使用D2D1_FACTORY_TYPE_MULTI_THREADEDflag创建。

  • 我尝试使用ID2D1MultiThread接口通过工厂进行同步。但是,这似乎只在 Windows 7 及更高版本上可用:我需要使用 DirectX10 级别的 Vista+ API。

  • 我也尝试过使用ID3D10Multithread 接口进行同步。我遇到了一些问题:

    我不确定我应该在哪里同步,或者围绕什么同步。如果是细粒度的,比如aroundMapUnmapcalls,或者PresentMSDN指示的需要round,同步是没有效果的:上面的方法调用还是失败。如果它是粗粒度的,在调用ID2D1RenderTarget::BeginDraw时进入锁,在所有绘图中都持有它,然后在和/或被调用之后离开锁ID2D1RenderTarget::EndDraw,它似乎工作得很好......直到几秒钟后我进入僵局。MSDN 对此进行了描述,ID2D1RenderTarget::FlushIDXGISwapChain::Present

    请注意,当您使用全屏交换链时,您永远不会让消息泵线程在渲染线程上等待。例如,调用 IDXGISwapChain1::Present1(从渲染线程)可能会导致渲染线程在消息泵线程上等待。发生模式更改时,如果 Present1 调用 ::SetWindowPos() 或 ::SetWindowStyle() 并且这些方法中的任何一个调用 ::SendMessage(),则这种情况是可能的。在这种情况下,如果消息泵线程有一个临界区保护它,或者如果渲染线程被阻塞,那么这两个线程将死锁。-来源

    ...但没有关于如何避免它的指导。我的死锁似乎是由两个线程同时尝试访问图形(例如调用BeginDraw)引起的。似乎有第二个锁在起作用,因为如果只有一个锁,那么就不会有死锁。

  • 我已经尝试保留“共享”设备、渲染目标等的每个线程实例。也就是说,每种类型的对象的每个线程都有一个实例,然后由该线程中运行的所有代码使用。这很好用,除了纹理:似乎访问在另一个线程上下文(由另一个设备)中创建的纹理不起作用 - 根本没有。在编码这种技术时,我经常遇到方法失败的问题 - 最常见的是CreateSharedBitmap失败D2DERR_UNSUPPORTED_OPERATION,其中纹理来自另一个线程(因此,另一个设备)。这是关键位,因为位图对象(包装在一个线程中创建的纹理)需要能够在另一个线程中绘制。根据其编码方式,线程和设备、渲染目标等之间可能存在也可能不存在 1:1 关系。

    如果我能解决这个问题,我认为我编写的其余代码足以让我实现所需的目标。有可能 - 以及如何?ID3D10Texture2D- 在s 之间交叉ID3D10Device1s?是否需要跨线程使用单独的设备?

总之,我有点难过,正在向那些熟悉 Direct3D 10 和 Direct2D 的人寻求关于最佳方法的建议。我认为有两种可行的可能性:

  1. 找出ID3D10Multithread 接口锁定。Google 上没有太多关于避免 MSDN 死锁的建议。

  2. 继续使用每个线程都有自己的设备、共享渲染目标等的机制。(这有多少是必要的 - 有没有可能,比如说,只有一个设备,但每个线程有单独的渲染目标?)如果是这样,纹理资源如何从一个线程交叉到另一个线程,这可能意味着从一个设备到另一个设备?基本上,使用在一个线程中创建的内部纹理的包装位图对象需要在第二个线程上可用。

但我也很想知道其他任何可能性。任何关于正确 Direct2D 线程实现的建议都将非常感激地听到。

0 投票
0 回答
538 浏览

windows-7-x64 - 尽管有支持 DirectX11 的图形适配器,但 DirectX 不允许我使用 D3D_DRIVER_TYPE_HARDWARE

我想将 SharpDX 用于 WPF 项目(Windows 7、64 位、DirectX10 / 11)的渲染引擎,但我在让样本工作时遇到了问题。我可以使用 DirectX 9 示例。该问题可能与 SharpDX 没有直接关系,因为我也看到 SlimDX 和其他 DirectX 示例的类似问题。

使用 Direct3D 10 / 11 时唯一有效的 DirectX 驱动程序类型是 D3D_DRIVER_TYPE_REFERENCE 和 D3D_DRIVER_TYPE_WARP。D3D_DRIVER_TYPE_HARDWARE 似乎没有工作。这不仅影响 SharpDX,C++ 示例也让我只能在 RFERENCE 和 WARP 驱动程序之间进行选择。

我的理解是这些驱动程序类型仅仅是软件光栅化器。这意味着我的 directx 安装无法正常工作。但是我没有看到任何错误,安装了最新的驱动程序并且系统报告了 DirectX 11 驱动程序并且图形适配器支持 DirectX 11。

  • dxdiag 没有报告任何错误
  • dxdiag 确认已安装 DirectX 11 驱动程序
  • 我使用的是 GT 460,它应该支持 DirectX 11
  • 系统是Windows 7 (64bit) / VS2013

SharpDX 能够创建设备,但是一旦创建了 VertexShader 或设置了 SwapChain,我就会收到 DXGI_NOT_SUPPORTED 或 E_NOINTERFACE 错误。

我已经将显卡从 Radeon HD 5450 换成 Nvidia Geforce GT 460 无济于事。Shardx 样本在另一台装有 Windows 7 和英特尔板载显卡的计算机上运行良好。谁能告诉我这里发生了什么?为什么尽管有支持 DirectX11 的图形适配器,但我只能使用 Warp 和 Reference 驱动程序?

任何帮助是极大的赞赏。我在网上找到的关于此类问题的唯一参考资料是有人在没有适当 3d 驱动程序的 VM 中运行 IDE。