问题标签 [direct3d9]

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

c++ - DirectX alpha 遮罩

我正在使用 DirectX 9 开发游戏。这是我正在尝试做的事情:

渲染场景后,在它之上我想渲染一些精灵:整个场景上的黑色封面和一些精灵,它们是显示封面应该有洞的地方的面具。到目前为止,我尝试弄乱混合模式,但没有运气。我设置它的代码如下所示:

我想最好的方法是将每个精灵 alpha 相乘,但根据http://msdn.microsoft.com/en-us/library/windows/desktop/bb172508%28v=vs.85%29.aspx没有这种模式支持。还有另一种方法可以做到这一点吗?

按照 Nico Schertler 的回答,这是我想出的代码:

不幸的是,应用程序在恢复旧的渲染目标时崩溃。有什么建议吗?

0 投票
2 回答
131 浏览

direct3d - Direct3D 9 API 调用的延迟

我最近一直在寻找使用 Direct3D 9 进行渲染的应用程序中的 PIX for Windows。我注意到的是,给定帧对渲染目标或包装它们的纹理的第一次操作似乎需要很长时间。系统运行的是 Windows 7,并且没有出现图形内存不足。因此不应该发生颠簸。我发现有趣的是,在 16 位浮点表面上的操作所花费的时间大约是在 8 位整数表面上的两倍。

有人对这种现象有任何解释吗?

-蒂莫

0 投票
1 回答
2779 浏览

c++ - 如何以与显示器不同的分辨率渲染全屏帧?

我正在自学 DirectX 开发,同时浏览http://directxtutorial.com/上的所有教程。我遇到了一个我认为与我拥有多个显示器有关的问题。

我的显示器是 1920 x 1080。当我的代码在当前状态下运行时,我的主显示器变黑,光标在中间。当我将代码顶部的 SCREEN 定义设置为 1920 x 1080 时,我的程序运行良好,并以海军背景显示我的精灵。当我离开屏幕定义为 1440 x 900 并禁用我的第二个监视器时,我的程序运行良好。这就是让我相信我的第二台显示器出现问题的原因。

任何帮助,将不胜感激!

以下是我当前的代码:

编辑:这是我的输出窗口中的调试信息。

这是触发断点的地方。当我单击继续时,将显示以下其余部分。

0 投票
1 回答
236 浏览

c++ - IDirect3DDevice9 释放死锁

什么可能导致这种情况?我在 Windows 8 上使用来自 dll 的 direct3d9。没有来自 DllMain 的调用。

我的窗口对 api 和 winapi 的所有调用都是从同一个线程完成的。与设备关联的所有资源均已释放。

0 投票
1 回答
97 浏览

winforms - 升级到VS2012后调试时死锁和崩溃

我的应用程序使用 C++/CLI 类,该类扩展System.Windows.Forms.UserControl和包装了原生 C++ 类,该类使用效果框架进行 Direct3d9 渲染。在我们将解决方案从 VS2010 SP1 升级到 VS2012 之前,一切都运行良好。

在生产机器中,应用程序运行良好,甚至比以前快一点。但是在调试时,我随机得到两个可能的错误之一:

  1. LockRect对纹理的调用永远被阻止
  2. C:\Windows\SysWOW64\nvd3dum.dll我在版本中遇到访问冲突9.18.13.3182

我使用的是 Windows 7 Ultimate,64 位,所有最新更新。我正在使用由双头 Nvidia GeForce 210 GPU 提供的双显示器设置(一个来自 VGA 输出,另一个来自带有 DVI 到 VGA 适配器的 DVI)。

由于这似乎是图形适配器的问题,我所能想到的就是将 Nvidia 驱动程序升级到最新版本。这只会使错误更加频繁,使我的开发箱无法用于调试。我的同事有类似的环境,根本没有遇到这个问题。

也许GPU有一些物理损坏?我该如何检查?关于解决此问题的任何其他提示?

0 投票
2 回答
1011 浏览

c++ - Direct3D9 BackBuffer 到 PixelArray

我正在尝试挂钩 DirectX 游戏。我成功加载了我的钩子,并且可以使用以下方法将图像/后备缓冲区保存到磁盘:

它成功保存,我很高兴。但是,我想保存到像素阵列而不是磁盘。我尝试使用:

但是,它永远不会锁定,如果我尝试访问 LR.pBits,它会引发访问冲突。我不知道为什么它不会锁定。有没有另一种方法可以将后缓冲区中的像素抓取到字节数组中?游戏的最大视口为 1366x768。

编辑:我试过:

但我的图像是黑色的。有任何想法吗?

0 投票
1 回答
431 浏览

c++ - 插入第二台显示器时,全屏 Direct3D9 设备仅以本机分辨率显示

使用单个监视器,我的程序可以在窗口模式和全屏模式下工作(使用从 EnumAdapterModes 选择的任何分辨率),但是当我插入第二个监视器(运行相同的代码)时,我可以从 EnumAdapterModes 创建任何分辨率的全屏设备,但只有在原始分辨率 (1600 x 900) 下才会显示场景,否则屏幕只是黑色以及下面列出的其他问题。

到目前为止我发现了什么:

  • 在窗口或多头模式下不会出现此问题
  • 我仍然可以渲染到纹理(我必须切换模式才能显示它)
  • 所有函数调用都返回成功代码(包括 TestCooperativeLevel)
  • 如果我尝试使用 Clear 或 DrawPrimitive 函数或调用 Present(仍然留下黑屏)绘制到后台缓冲区,则调用 GetRenderTargetData 失败并且尝试锁定体积纹理将在子级别返回不同的切片间距
  • 使用 Direct3D9 (Portal) 的商业游戏在插入第二台显示器的情况下在分辨率之间切换没有任何问题,因此必须有解决方案

问题似乎与 Direct3D9 运行时创建的后台缓冲区有关,但我能想出的唯一解决方案是在具有多个显示器的设备上强制使用多头模式,有什么想法吗?

似乎有同样问题但缺乏解决方案的问题:如何渲染分辨率与显示器不同的全屏帧?

0 投票
1 回答
395 浏览

memory - Direct3d9 加载纹理失败

我正在做一个大项目。在项目结束时,我一直面临着一个致命的问题。我想可能是内存泄漏,无论如何请听我的声音。

我第一次启动该程序时,它运行良好。我玩了大约一个小时,然后当它移动到下一个场景时(这意味着从内存中销毁所有东西并在内存中加载新东西)。

我收到一条错误日志说

类似的东西。

消息后,纹理消失了。我的意思是世界(在游戏中)是黑色的。没有纹理。这个问题与显存卡有关吗?物理内存?还是虚拟内存?我不是这方面的专家。

任何人都可以给我一个提示?拜托,我需要什么。谢谢。

0 投票
1 回答
868 浏览

geometry - DirectX (D3D9) 中的圆角边/角

我用 DirectX 创建了自己的小 2D 引擎(好吧,最终应该更像一个 GUI)并尝试为简单的矩形创建圆角边缘。因为在我不知道如何提供它之前,我从来没有用图形框架做过这个。现在,我只是重叠了 5 个矩形和 4 个圆圈(圆圈用于圆边)。它确实适用于不透明的颜色,但如果我将 alpha 添加到矩形中,圆圈就会出现问题。(如下图所示 - 我应该选择其他颜色...)

<# 打开图片 #>

我自己找不到解决方案(我用谷歌搜索并发现我没有发现 DirectX 中的圆边),我相信有一种更强大、更快的方法可以做到这一点。所以我的最后一个问题是,在 Direct3D9 中创建圆角矩形的常用算法是什么?

0 投票
1 回答
106 浏览

c++ - 平移顶点缓冲区

我创建了一个顶点缓冲区,它保存半径为 2.5 的 (0, 0) 处的圆的顶点。

我想在鼠标所在的任何地方绘制这个圆圈,因此我WM_MOUSEMOVE将鼠标的位置存储在点 P 中。我已经在创建窗口时按世界、视图和投影进行了设置(我的外观很好)。

在创建窗口时,我做了:

要绘制顶点缓冲区,我会这样做:

然而,这些转变并没有发生。我的圆圈画得很好,但仍然画在(0, 0).

任何想法为什么我的转换没有被应用?