问题标签 [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 - ID3DXFont 使用的缩放算法是什么?
我正在尝试补充 ID3DXFont 功能,将文本渲染到纹理,然后根据需要进行 ID3DXSprite.Draw()-ing。
旧(直接)方式:
新(优化)方式:
直接渲染时,无论缩放如何,文本都很好且可读,但在渲染到纹理然后缩放为纹理时会变得丑陋。
看这张图:第一行是通过纹理缩放渲染的,第二行是 ID3DXFont 缩放。
为了确保没有双重缩放,我将(假定未缩放)纹理保存到文件中。它确实是未缩放的(即使是 BMP 中的纯 $000 和 $FFF 像素,所以没有平滑工作)。
我错过了什么吗?我一直认为 ID3DXFont 做同样的事情,将字形渲染到纹理中,然后使用 Sprite.Draw() 将它们放到视图中。为什么它可以更好地缩放文本呢?
c++ - 如何在屏幕空间中平铺纹理的一部分?
如果之前有人问过这个问题,请原谅我,我整天都在寻找这个问题的答案,而我想出的只是基于瓷砖的 2D 游戏的帮助。x~x
我正在尝试在 Direct3D 9 中创建一个可换肤的 GUI,使用一个 XML 文件,该文件具有每个元素的位置以及拉伸或平铺它们的选项。拉伸是一个足够简单的过程,但我一直无法找到一种方法来平铺纹理的一小部分。传统上平铺纹理我只需将 UV 坐标设置为 > 1.0,但源纹理坐标只会是整个纹理的一小部分,例如 0.4 到 0.5。
我有一种感觉我错过了一些非常明显的东西,但是我将如何简单地平铺而不是拉伸呢?我最好的猜测是它与拥有一组以上的纹理坐标有关,但从那里开始,我不知道该去哪里。
该项目目前使用固定功能管道,所以如果可能的话,我更喜欢使用它的答案,但如果这是唯一的方法,我不会拒绝使用着色器的答案。
c++ - DirectX 等效于 glBlendFunc(............)
我在 OpenGL 中创建了一个运行良好的粒子系统。当我想要获得火焰或光束或其他东西的燃烧效果时(系统会“发光”并将所有颜色融合在一起),我使用 OpenGL 调用此方法。
我现在正在尝试使用 Direct3D 做同样的事情
这是我尝试过的:
但这对我的游戏外观完全没有影响!任何人都知道可能是什么问题?
c++ - 如果 Windows 资源管理器正在运行,Direct3D 应用程序运行良好,否则速度会非常慢
如果我们完全启动 Windows,然后启动它,我们的 Direct3D9 应用程序就可以完美运行。但是,如果我们调整 Windows 的启动过程,使资源管理器不运行,而只启动 Windows 和我们的应用程序,我们的应用程序就会慢得可怕。CPU 消耗达到 50%,即使在空闲时(通常接近 0)。
这可以通过启动任务管理器、启动资源管理器并重新启动我们的应用程序来解决。但这是不可接受的;我们的应用程序必须在没有 Explorer 的情况下运行。
这可能是 Direct3D 的东西吗?我们的应用程序是全屏的,Windows 版本是包含所有最新更新的 XP SP3,Direct3D 版本是 9.0.c。如果这与 Direct3D 无关,我该如何调试呢?
antialiasing - 如何关闭 Direct3D 输出过滤
我正在使用 DirectX9 将视频输出渲染到屏幕上。使用的库是 SlimDX。
创建的软件用于标记输出设备中的坏像素,因此不进行纹理过滤/平滑至关重要。
我禁用了所有的纹理过滤选项,禁用了抗锯齿,并以 1:1 的比例在后台缓冲区和渲染纹理之间将纹理与屏幕对齐。问题是,在某些设备上,DirectX 似乎正在对输出进行一些双线性过滤/模糊处理。
我需要所有输出都是块状的,并带有 -0- 过滤。由于所有调整大小的代码都是在控件本身上操作的(没有调整后缓冲区大小等),所以我没有调整后缓冲区大小的选项。
奇怪的是,这只发生在某些设备上,而不是全部。
我如何告诉 DirectX 不要平滑它呈现给控件的内容?(禁用对后/前缓冲区进行的任何纹理过滤)
在此先感谢您的帮助(:
对于那些不明白我要摆脱什么的人 - 当渲染图像的分辨率低于绘制区域的分辨率时,Direct3D 会在像素之间创建平滑过渡。我想要的是将每个像素绘制为一个简单的矩形,绝对没有过滤,我在哪里可以找到控制这种行为的设置?
direct3d - 表面上的 D3D9 Alpha 混合
我有一个表面(OffScreenPlain 或带有 D3DFMT_A8R8G8B8 的 RenderTarget),我将像素 (ARGB) 从第三方函数复制到该表面。在像素复制之前,Bits 由 LockRect 访问。
然后这个表面是 StretchRect 到 Backbuffer,即 (D3DFMT_A8R8G8B8)。Surface 和 Backbuffer 是不同的维度。过滤设置为 D3DTEXF_NONE。
在创建 d3d 设备后,我设置了以下 RenderState 设置
但我没有看到 alpha 混合发生。我已经验证了 alpha 是以像素为单位指定的。
我通过创建一个顶点缓冲区并绘制一个三角形(DrawPrimitive)来完成一个简单的测试,该三角形使用 alpha 混合显示。
在这个测试中,表面首先是 StretchRect,然后是 DrawPrimitive,表面内容显示时不使用 alpha 混合,而三角形显示时使用 alpha 混合。
我在这里想念什么?谢谢
c++ - win32 线程在 activeX (C++) 中意外终止
我正在开发一个 ActiveX 视频播放器。它是 DLL 中的进程内组件。我正在使用 Visual Studio 2010。
我需要它有一个单独的线程,它会在加载组件时启动一次,创建 Direct3D9 对象和 Direct3D9 设备,然后停止组件卸载并销毁这些对象。在组件运行时,如果需要,我希望该线程定期调用TestCooperativeLevel
和重置 D3D 设备。
我这样做是因为客户端应用程序可以创建我的播放器的多个实例,但强烈建议只有一个 D3D9 对象和设备实例。
我已经声明了一个带有静态方法和成员的类,它的构造函数调用_beginthreadex()
并启动线程。
这是代码摘录(有错误)。
我的组件嵌入在 WindowsForms 表单中,用 C# 编写。
问题是当我关闭表单时,线程在 while 循环内终止,并且永远不会访问它之后的代码。我从未见过来自 的文本OutputDebugString
,release_d3d()
也从未调用过,而且我看到来自 d3d debug 的很多关于内存泄漏的消息。如果我设置断点,它永远不会被击中。
我看到的只是消息:
当我在析构函数中设置断点时,我遇到了它,但是在有关视频内存泄漏的消息之后。
我还在 Studio 中启用了 C++ 异常和 Win32 异常的调试中断,但没有触发。
更新。在 MSDN 中读到所有线程都被终止,当它们中的任何一个调用exit
,_exit
或abort
orExitProcess
并尝试在构造atexit
函数处理程序中设置时:
仍然没有运气。release_d3d
在我收到有关视频内存泄漏的消息后调用。此外,我有异常错误。
更新 2。
这是编辑后的代码
hook - 挂钩 IDirect3DDevice9::EndScene 方法以捕获游戏视频:无法摆脱录制视频中的文本覆盖
事实上,它是多种技术的组合,但我的问题的答案(我认为)最接近 Direct3D 9。我正在连接任意 D3D9 应用程序,在大多数情况下它是一个游戏,并注入我自己的代码来修改EndScene 函数的行为。后缓冲区被复制到一个表面,该表面设置为指向推送源 DirectShow 过滤器中的位图。过滤器以 25 fps 的速度对位图进行采样,并将视频流式传输到 .avi 文件中。在游戏的屏幕上显示了一个文本叠加层,告诉用户应该停止游戏捕获的热键组合,但这个叠加层不应该出现在录制的视频中。除了一个令人讨厌的事实外,一切都运行得又快又漂亮。在随机的情况下,带有文本的帧过度进入录制的视频。这不是一个真正想要的人工制品,最终用户只想在视频中看到他的游戏玩法,而不是别的。我很想听听是否有人可以分享为什么会发生这种情况的想法。这是 EndScene 挂钩的源代码:
delphi - 在辅助显示器上时 CPU 使用率高(窗口模式)
我们的自定义 DirectShow 视频渲染器使用 Direct3D9。当在主显示器/显示器上以窗口模式(覆盖整个显示器表面)显示时,它在 CPU 使用率低的情况下表现良好,但是当它显示在辅助显示器上时,由于 DirectX 使用 cpu 来执行 CPU(内核)使用率非常高进行设备之间的传输。这只发生在 Windows XP 上。我使用适当的适配器创建 Direct3DDevice9,至少我认为是这样。首先,我获取指定窗口句柄的监视器句柄,然后使用 GetAdapterMonitor() 搜索与此监视器对应的 D3D 适配器。移动窗口并重新初始化设备时,我可以看到适配器从 0 变为 1,正如预期的那样。还有什么我应该做的吗?这是相关代码(Delphi)。
其他播放器和渲染器没有这个问题。MPC-HC 和 madVR 有这个问题,但修复了它。查看 MPC-HC 的代码,我找不到与我的操作方式有任何显着差异。
谢谢!