问题标签 [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.
directx - 从 DllMain 调用 IDirect3D9::CreateDevice() 挂起
可能是什么原因?
从 DLL_PROCESS_ATTACH 上的 DllMain() 我正在调用 IDirect3D9::CreateDevice() 并且它挂起
代码很简单,就像:
GetDesktopWindow() 用于简单起见,我尝试创建自己的窗口并使用它,结果相同
directx - Direct3D:从 IDirect3DSurface9(默认池)获取系统内存位图的有效方法?
我有 IDirect3DSurface9,默认池,YUV 格式。如何有效地从中获取位图位?目前我:
- 创建渲染目标:
device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
- 将 YUV 转换为 RGB32:(
device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
完整的矩形,无拉伸)
- 在系统内存中创建普通的屏幕外表面
device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
- 将数据从视频内存复制到系统内存:
device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
- GetDC 从屏幕外表面,创建兼容 DC 和兼容位图,BitBlt 从屏幕外表面 DC 到兼容 DC,并通过 GetDIBits() 将位图位复制到我的缓冲区
这看起来有点开销,因为有很多复制:从原始表面到渲染目标,然后到屏幕外表面,然后到兼容位图,最后到我的缓冲区。如何改进?
谢谢
graphics - 在 WinXP D3D9 上 Xbox360 的 D3DRS_VIEWPORTENABLE 等效项是什么?
我正在为 Xbox360 和 WinXP 维护一个多平台代码库。我在 XP 方面看到一个问题,该问题似乎与 Xbox360 版本上的 D3DRS_VIEWPORTENABLE 相关,但在 WinXP D3D9 上没有等效项。本文有一个有趣的想法,但构造单位矩阵的唯一方法是向 D3DVIEWPORT9::X 和 D3DVIEWPORT9::Height 提供负数,但它们是无符号数。(无论如何我都尝试输入负数,但没有发生任何有趣的事情。)
那么,如何在 WinXP/D3D9 下模拟 D3DRS_VIEWPORTENABLE 的行为呢?
(为了清楚起见,我看到的结果是 2d 屏幕对齐四边形在 Xbox360 上工作正常,但在 WinXP 上偏移/拉伸。事实上, (0, 0) 在 WinXP 上从屏幕中心开始,而不是由于应用了视口变换,在左下角,就像在 Xbox360 上一样。)
更新:在我写这个问题的时候,我没有 Xbox360 开发套件,但后来我得到了一个。我注释掉了禁用 D3DRS_VIEWPORTENABLE 状态,并且在 Xbox360 上产生了与在 WinXP 构建上完全相同的行为。因此,必须有一些 DirectX 魔法来弥补这里的差距,以便在 WinXP 上模拟 D3DRS_VIEWPORTENABLE 被关闭。
c++ - HDC 的内存管理
我有一个 ID3DXFont(顺便说一下,它是 Direct3D9),它提供了一个 GetDC() 方法,它返回一个设备上下文 (hDC) 的句柄。这个值的内存是如何管理的?MSDN 没有提及它,也没有像 COM 接口那样提供它自己的内存管理。
directx - Direct3D 9 创建和释放线程?
我有一个使用 Direct3D 呈现视口的应用程序,它是作为独立于主应用程序的 DLL 模块制作的,它在运行时链接到它。主应用程序是一个 C# 程序。
Direct3D 设备及其资源的创建和初始化在本地 DLL 端完成。主 C# 程序仅从该 DLL 请求一个窗口。现在,由于主 GUI 循环位于 C# 可执行文件中,因此无论何时关闭/销毁视口,它都必须调用 DLL 函数来请求释放相关的 Direct3D 设备/资源。
问题是在尝试释放 Direct3D 设备时,程序会出现紧急情况。它说与创建设备试图释放它的线程不同(我猜是主 C# 程序,因为它将消息发送到 DLL)。
有解决这个问题的方法吗?有什么想法吗?
我正在使用 Direct3D 9。
帮助表示赞赏。
com - 使用 Direct3D9 时需要调用 CoInitialize() 吗?
我的理解是因为 D3D 使用的是 COM,所以答案是肯定的。但在 Ogre 渲染引擎中,这似乎从未被调用过。这是罚款还是疏忽——如果是这样,它会产生一些实际后果吗?
visual-c++ - 创建 Direct3D9 设备的最少代码
这不适用于稳定的发布代码,我只需要从我的开发 PC 上的 HWND 获取在 C++ 应用程序中创建的窗口化 D3D9 设备以进行测试……它可以默认加载大量选项。
我试图从我拥有的旧 D3D8 类中破解它,但我得到了 D3DERR_INVALIDCALL。
基本上我现在有这个:
我认为某些D3DPRESENT_PARAMETERS
选项可能是罪魁祸首 - 我不关心 z 缓冲区或模板或 AA 的后缓冲区,任何旧的普通设备都可以。
我是否将一些不兼容的标志复制粘贴在一起?
c++ - 将相机旋转到模型的中心
我有 2 个使用 DirectX 9 渲染的网格和一个正在查看 0,0,0 的相机。一个网格位于 0,0,0,另一个位于 5,0,0。我如何将相机旋转 0,0,0 以始终查看两个网格但从新位置?我想按键盘上的箭头键并能够旋转相机
direct3d9 - D3D9 HLSL 矩阵化了我的大脑
我正在向各位 Direct3D 专家寻求帮助。坦率地说,我被 HLSL 的一个非常奇怪的行为弄疯了。这是我指定矩阵的方式。
现在我的问题 D3DX 9 功能:
D3DXMatrixOrthoOffCenterRH 和其他...
他们是否返回以这种形式使用的矩阵: v' = v * M // 主要列
或 v' = M * v // 主行 ???
我注意到 D3DXMatrixTrnaslate 在 Column major 中,我假设所有功能都相同。
现在 D3DX Project 和 Unproject 函数是否采用上述函数返回的相同形式?
有没有人经历过 HLSL 矩阵乘法的疯狂?
谢谢。
directx - 打包自定义 DirectX 可再发行安装程序
按照 MS 的建议,我们已经从 D3D9 应用程序的 DX 安装程序内容中删除了大部分文件,总共将其降至 5Mb。但是现在我想将这些文件打包到一个安装程序中,就像 MS 自己提供的可再发行安装程序一样......所以它可以作为我们应用程序安装过程的一部分运行,使用 /silent 开关,而无需手动解包文件并删除它们。是否有一种简单、标准的方法来执行此操作,以便运行打包的 DXSetup.exe?
还是这一切都太复杂了,我们应该解压文件,运行 DXSetup.exe,然后在安装后删除文件?