问题标签 [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 回答
1913 浏览

winapi - 将 IDirect3DSurface 的数据复制到另一个使用两个 Directx 设备创建的 IDirect3DSurface

有一个带有自己的 Direct3D 设备的窗口,我们称之为 mainWindow。mainWindow 及其东西是由其他人创建的。他们给了我一些他们在主窗口上绘制的 Direct3D 表面(IDirect3DSurface9 指针)。
我已经从他们的一个回调中启动了一个线程,并使用 winAPI 创建了我自己的窗口。(我在这个问题上有一点类似的情况)
我想在我的窗口上绘制那些 RTT 输出。所以我试图将表面复制到我在自己的directx设备中创建的表面/纹理中,该设备在我的窗口上绘制。

我在尝试这样做时发现的一些东西,

  • 这可以使用D3DXSaveSurfaceToFileInMemory(...)D3DXCreateTextureFromFileInMemory(...)函数轻松完成。
  • StrechRect(...)功能不适用于使用两个设备创建的两个表面。

我尝试锁定表面并将数据从一个复制到另一个,但它似乎不起作用。但我会再试一次。(同时锁定两个不同设备的表面是否非法?)

你们有什么方法知道或建议这样做吗?

---编辑---
MSDN说(链接到页面

在 Windows Vista 中,CreateTexture 可以从系统内存指针创建纹理,从而允许应用程序更灵活地使用、分配和删除系统内存。例如,一个应用程序可以传递一个 GDI 系统内存位图指针并围绕它获得一个 Direct3D 纹理接口。将系统内存指针与 CreateTexture 一起使用具有以下限制。

  • 纹理的间距必须等于宽度乘以每个像素的字节数。
  • 仅支持具有单个 mipmap 级别的纹理。Levels 参数必须为 1。
  • Pool 参数必须是 D3DPOOL_SYSTEMMEM。
  • pSharedHandle 参数必须是指向可以保存系统内存点的缓冲区的有效指针;*pSharedHandle 必须是指向系统内存的有效指针,其大小以纹理宽度 * 纹理高度 * 纹理格式的每像素字节数为单位。

我找不到以这种方式创建纹理的任何示例,但我尝试这样做,我得到的只是一个充满噪音的输出,没有别的。如果有人可以帮助我,我想我的问题会在一定程度上得到解决....msdn在这里所说的有什么好的例子..??

0 投票
2 回答
308 浏览

direct3d - direct3d 是否初始化新​​创建的纹理

如果您创建一个新的空纹理,例如

IDirect3DDevice9::CreateTexture 或 D3DXCreateTexture

是否保证用零填充-通过测试在我看来?有人有微软关于此声明的链接吗?我什么也找不到。

0 投票
1 回答
2023 浏览

c++ - 如何使用 Direct3D 设备管理器?

我想在我的 Direct3D 应用程序中的多个线程和对象之间共享一个 Direct3D 设备。我遇到了 Direct3D 设备管理器,它看起来像我想要的,虽然我没有做任何视频处理或视频加速:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa965267( v=vs.85).aspx

在我的代码中,我正在执行以下操作:

我的问题是,一旦我创建了 Direct3D 设备管理器,如何在不传递指向设备管理器的指针的情况下与其他对象共享 direct3d 设备管理器?微软明确表示要执行以下操作,但我不知道以下内容的真正含义是什么:

设备所有者必须为其他对象提供一种方法来获取指向 IDirect3DDeviceManager9 接口的指针。标准机制是实现 IMFGetService 接口。服务 GUID 是 MR_VIDEO_ACCELERATION_SERVICE。

有人可以告诉我如何使用 IMFGetService 接口共享设备管理器吗?

0 投票
0 回答
387 浏览

alphablending - 预乘 alpha 的粒子混合问题

我试图从 3D 渲染场景中保存一些纹理,然后让它们重用。
最大的问题是rgb值不能匹配它的alpha值。我需要一些没有黑边的图片,所以我必须使用rgb颜色来划分它的alpha值(Photoshop等图像处理软件只能处理alpha通道未预乘的图片.)
不幸的是,颜色太浅以至于某些结果值被截断为 1。
所以我转向了一种称为预乘 alpha 的技术。(查看更多)。我没有使用着色器,而是使用单独的 alpha 计算。
例如:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.InverseSourceAlpha;
现在我添加一些渲染状态。
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.InverseSourceAlpha;
它运作良好。但是当我尝试处理以下事情时:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.One;
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.One;
结果完全错误,有人可以告诉我原因吗?
PS:现在我明白了。当我使用非预乘混合状态,即SourceAlpha和inverseSourceAlpha。rgba值肯定控制在0~1之间。但是当我切换到加法状态,即SourceAlpha和1时,rgb值可能超过一个,从而导致不正确的值。
现在我的问题是如何控制 alpha 值,以确保它保留所有细节并且不会同时溢出?

0 投票
1 回答
1237 浏览

c++ - 同一函数中的“此声明没有类型说明符”和“预期声明”错误

我有这个代码:

在第 5 行它说“这个声明没有存储类或类型说明符”它在 FORCE_EXIT(10) 处说这个;也。在第二个 if 语句 (if(dwTestPtr....) 上,它说“需要一个声明”。它们有什么问题?

0 投票
1 回答
189 浏览

vector - 初始化 Direct3D 向量

我正在使用它来初始化 Directx 向量。

即使我尝试不做数组,我总是得到同样的错误:

错误 C2440:“正在初始化”:无法从“浮点”转换为“LPD3DXVECTOR3”

我试着做双打,但我遇到了类似的错误

0 投票
4 回答
522 浏览

c++ - 在 .NET Web 应用程序中重用 C++/CLI 用户控件

我有一个非常复杂的类,它扩展了System.Windows.Forms.UserControl. 它是用带有开关的 C++/CLI 编写的/clr,因为它使用本机 C++ dll。该类的主要职责是充当非托管 Direct3D9 dll 的包装器,该 dll 在纹理、缩放、平移等上呈现图像。

有没有办法在 .NET Web 应用程序中重用这个类?换句话说,我想让我的用户控件在浏览器中运行。这里的主要不确定因素是对本机 dll 的访问以及 Direct3D 的使用。我正在设置一个小测试,看看我是否可以让它工作,但我想要其他人的一些输入。

更新:我遵循了本指南。在第一次尝试时,我收到一条错误消息,说它无法加载控件的 dll 或其依赖项之一。所以,只是为了测试,我将它使用的所有非托管 dll 复制到 system32。现在我可以毫无错误地加载页面,但我仍然看不到控件。About我在默认 C# Web App 项目的页面中放置了对它的引用,如下所示:

我现在将尝试 ActiveX 方法,但即使可行,我想这也会迫使我的客户使用 Internet Explorer,或安装一些插件,不是吗?那真的很麻烦。

编辑:到目前为止,我愿意尝试其他方法。例如,由于我的 C++/CLI 类只是一个包装器,我愿意用其他语言编写另一个包装器。如果我这样做,该语言应该尽可能与 Web 应用程序友好。

0 投票
1 回答
403 浏览

directx - 如何在 Direct3D 9 中使用无窗口?

我知道 directshow 可以通过 VMR-9 使用无窗口。VMR-9 基于 Direct3D。我可以直接使用 Direct3D 编写无窗口应用程序吗?

0 投票
2 回答
2180 浏览

c++ - Direct X 9 - 三角形未出现

目前,在开始编写程序之前,我正在使用 DirectX 做一些测试用例。现在,我已经把下面的代码弄乱了一天左右。我在网上查看类似问题时修改了代码。但最终,它也没有按照我想要的方式工作。有人能告诉我我到底做错了什么吗?也许其他人可以解决这个问题。

0 投票
0 回答
637 浏览

c++ - 如何将 D3D9 表面的 D3DPOOL 类型从 D3DPOOL_DEFAULT 转换为 D3DPOOL_SYSTEMMEM?

我有一个 D3DPOOL_DEFAULT 类型的表面,我想将其转换为 D3DPOOL_SYSTEMMEM。我知道 UpdateSurface 正好相反。