问题标签 [directx-9]

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

c++ - 将 BITMAPINFOHEADER 图像数据写入 IDirect3DTexture9

我正在编写一个 DX9 渲染器,目前正在研究播放 AVI 电影文件的能力。我已经能够使用 检索任何指定的帧AVIStreamGetFrame(),它返回一个打包的 DIB,并且从那里我希望能够将该位图数据复制到一个已经存在的IDirect3DTexture9 *.

我的问题是对位图文件格式缺乏了解,并且不知道如何将给定的像素数据转换为可以解释BITMAPINFOHEADER的格式。IDirect3DTexture9

我首先像这样创建我的 DX9 纹理:

我在这里的问题列在上面的评论中。当我得到 BITMAPINFO 并且例如它读取 bmpInfo.bmiHeader.biBitCount = 8 (或 16 等)时,这是否意味着我需要相应地更改 D3DFMT_*?

稍后当我得到一个LPBITMAPINFOHEADER我想要渲染的帧时,我不知道如何处理pBitsIDirect3DTexture9::LockRect()函数返回的内容。这是我到目前为止所拥有的:

是否有任何我没有见过的 API 调用可以为我执行此操作?或者有人知道比这更简单的方法吗?感谢阅读/帮助。

0 投票
3 回答
5875 浏览

delphi - D3D9 挂钩 - 使用 Direct3D9 覆盖

好的,所以我正在尝试为 Direct X 游戏上的一些额外按钮做一些覆盖。

我在这里找到了一个很好地覆盖的 c++ 示例:http ://www.gamedev.net/topic/359794-c-direct3d-hooking-sample/

所以我开始将它转换为Delphi。通过一些日志记录,我可以看到它启动了正确进程的钩子并正确地钩子 Direct3DCreate9()。

接下来 TMyDirect3D9 创建成功。但是该过程从这里崩溃。

我有根据的猜测(基于 Ollydbg 中的一些调试),当我通过挂钩的 Direct3DCreate9() 将 MyDirect3D9 返回到原始进程并尝试调用其中一个类(接口)函数时,它失败了。

代码如下。如果我可以提供任何其他信息来帮助让我知道。

主DLL:

自定义 IDirect3D9:

更新: 因此,由于 Delphi 接口的行为似乎与真正的接口不同(Delphi 有一个介于两者之间的中间,以便它成功地与其他接口对话)。所以我只是将接口转换为指针数组。

现在程序成功调用了 CreateDevice()。我可以在日志中看到这一点,也可以在 Ollydbg 中单步执行。

现在发生的情况是,当 CreateDevice 调用原始的 IDirect3D9.CreateDevice() 时,它再次崩溃。当我在 Ollydbg 中调试时,我注意到它对指针的取消引用太多了。

更新 2: 好的,修复了 PIDirect3D9 与 IDirect3D9 在不同位置的一些指针问题。所以原来的 IDirect3D9.CreateDevice() 被调用。但它与 D3DERR_INVALIDCALL 错误!

如此混乱。

更新3: 好的,经过更多调试,似乎当我调用该函数时,一个额外的参数被推入堆栈。这使得第一个参数无效。DirectX Debugging 进一步证明了这一点,它说 iAdapter 参数无效(第一个参数)。

更新 4: 使用 IntRefToMethPtr() 来获取指向原始 CreateDevice 调用的直接指针,我能够让它与堆栈相同。结果相同。看起来我在尝试将它挂在 Delphi 中时走错了路。

更新 5: 重写了挂钩方法。现在我只是在本质上挂钩 EndScene()。Hook 现在可以在测试程序中正常工作(Vertices.exe 随附于本文第一个 URL 中的 hook 演示)。但是在主游戏中它会导致游戏崩溃。无论哪种方式,我都学到了很多东西。

0 投票
1 回答
1066 浏览

directx - (DirectX9) 混合后的 sRGB 转换

我最近看到了这篇博客文章又一篇关于伽马校正的文章,它教会了我D3DPMISCCAPS_POSTBLENDSRGBCONVERT功能标志的可用性。

这应该允许在 DirectX9 上混合后进行正确的 sRGB 转换。

我不明白如何处理它?我可以查询我的设备 Direct3D 9Ex 设备以获取此功能,但如果支持,我该如何启用它?我可以在混合转换前和混合后选择吗?如果是,如何?

谢谢你的帮助!

0 投票
2 回答
1053 浏览

directx - DirectX 中#greyscale 渲染目标的格式是什么?

我有一个 Directx9 游戏引擎,它使用以下格式创建其普通适配器:D3DFMT_X8R8G8B8 我有一个系统,我将一些对象渲染到屏幕外渲染目标,作为光照贴图。然后,我使用该光照贴图数据合成回后台缓冲区,在那里它们充当全屏“蒙版”,让我在黑暗场景中获得手电筒或其他光源的效果。一切都很好。问题是,我知道我的大屏幕外光照贴图渲染目标每个都是 16MB,分辨率很高,我只需要它们的 8 位数据(灰度),所以 32 位渲染目标内存的 75% 是浪费。(我的目标是低规格卡)。我尝试将渲染目标创建为 D3DFMT_A8 但directx 默默地失败了(如果我添加 CheckDeviceFormat() 我看到它发生了)并且无论如何都会创建 32 位。

谢谢你的帮助,我不擅长渲染目标相关的东西:)

0 投票
2 回答
2257 浏览

directx - (DirectX9) Gamma correction applied implicitely

UPDATE:

Thank you all very much for your answers. As Jesse Hall suggested, it looks like it is a driver (or hardware) problem. I tried the same app on other configurations and it worked as expected.

I tested the app on other computers which share the same GPU (ATI 4800 HD) but different versions of the driver and they all showed the same erroneous behavior (what seems to be a double gamma correction on write). On these computers, if have to set D3DRS_SRGBWRITEENABLE to false to fix the display. Anyone knows if this is a known bug on this hardware?

Even more strange is that I get the same end results with these two configurations:

  • D3DRS_SRGBWRITEENABLE = FALSE and D3DSAMP_SRGBTEXTURE to TRUE
  • D3DRS_SRGBWRITEENABLE = FALSE and D3DSAMP_SRGBTEXTURE to FALSE

In the pixel debugger, I see that linearization is applied properly in case 1 but (automatic) correction on write gives the same output as case 2 (which performs no conversion at all)...

// -- END OF UPDATE

I'm having some trouble fixing the gamma correction of a DirectX9 application.

When I enable texture linearization in the samplers (D3DSAMP_SRGBTEXTURE) and sRGB write for output (D3DRS_SRGBWRITEENABLE), it looks like gamma correction is applied twice.

Here is my setup. I used the following texture (from here) to draw a fullscreen quad: enter image description here

The results were visually too bright on the right side of the picture. I used PIX to debug one of those grey pixels and, if everything was set up properly, I would have expected an output value of 0.73 (=0.5^(1.0/2.2)). Unfortunately, the output of the pixel shader was 0.871 (which looks like it could be a gamma correction applied twice ?). I stepped inside the pixel shader with the debugger and the texture fetch returned a value of (0.491, 0.491, 0.491), which should mean linearization on read worked properly.

enter image description here

When I disable D3DRS_SRGBWRITEENABLE, the output of the pixel shader is 0.729 which looks much more correct to me.

enter image description here enter image description here

Any idea where does this conversion come from (in the debugger the pixel shader output was 0.491)? What other flags/render states should I check?

Thank you very much for your help!

0 投票
2 回答
3243 浏览

performance - DirectX9 - 高效绘制精灵

我正在尝试创建一个平台游戏,我正在使用各种精灵块,并将它们拼凑在一起以绘制关卡。这需要每帧在屏幕上绘制大量精灵。一台好的计算机在处理所有精灵的绘制时没有问题,但它开始影响旧计算机的性能。由于这不是一款大型游戏,我希望它能够在几乎任何计算机上运行。现在,我正在使用以下 DirectX 函数来绘制我的精灵:

有没有更有效的方法在屏幕上绘制这些图片?有没有办法可以使用不太复杂的图片文件(我现在正在使用常规 png)来加快速度?

总结一下:在 DirectX 中绘制精灵最性能友好的方式是什么?谢谢!

0 投票
1 回答
1155 浏览

c++ - DirectX 9“未解析的外部符号”问题

几天来我一直在学习 DirectX,但遇到了一个问题。我一直在关注一个书籍示例,并解决了几个出现的烦人问题,但未能解决我最近的一个问题。编译器指出,每当我尝试编译时,我都有一个未解析的外部符号。这是下面的错误代码。

我正在运行:[编译器:Visual Studios 2008] [操作系统:Windows 7 64bit Professional]

这是代码示例以及它似乎发生的位置。(我希望我提供了足够的信息)

我已将 d3d9.lib 和 d3dx9.lib 链接到我的项目,并包含了我知道的所有必需的头文件(d3d9.h、d3dx9.h)。任何帮助是极大的赞赏!提前致谢!!!

0 投票
1 回答
255 浏览

volume - 如何在 C++ 中使用 DShow.h 和 strmiids.lib 实时调整声音片段的音量

我试图弄清楚如何在我的 C++ 程序中实时设置我的声音剪辑播放的音量,并做一些事情,比如随着 2 个对象彼此靠近而增加声音的音量。现在,我正在使用“DShow.h”以及“strmiids.lib”,并且我正在使用以下数据成员指针提供的接口:

使用这些提供的接口,有没有办法改变媒体流播放的音量?

0 投票
1 回答
836 浏览

vb.net - DirectX AudioVideoPlayback 和选择设备和/或平移

目前使用VS2010、DirectX 9、Winforms、.Net 3.5、VB。

我正在创建一个应用程序,它将通过声卡的左右声道播放 MP3 文件。它还需要在触发时通过中/后通道播放另一个 MP3 文件。我目前正在使用 DirectX Audio 类播放 MP3 文件,效果很好,但我看不到选择每个声音流发送到的设备或通道的方法。

我查看了一些库,例如 OpenTK 和 BASS.Net。BASS.Net 似乎很有希望,但如果可能的话,我需要尽量避免许可费。

谢谢。

0 投票
1 回答
550 浏览

directx - 在directx 9中使用带有固定功能管道的setvertexdeclaration

我正在尝试使用我自己的顶点结构,将顶点上传到顶点缓冲区(索引到索引缓冲区,没有 FVF 代码),设置顶点声明和流源并使用,并使用带有固定着色器的 DrawIndexedPrimitive 绘制它们(但不是FVF)。

我是否必须编写自己的着色器才能使用 directx 9 SetVertexDeclaration ?我可以使用带有 SetVertexDeclaration 和 fixed-pipeline 的自定义顶点结构吗?如果可以,对固定管道和顶点声明有任何限制吗?

自定义顶点结构: