【问题标题】:Texture from Surface in DirectX 8.1DirectX 8.1 中的 Surface 纹理
【发布时间】:2010-12-22 19:47:04
【问题描述】:

我正在做双缓冲,方法是创建一个渲染目标及其相关的深度和模板缓冲区,绘制到它,然后绘制一个全屏、可能拉伸的四边形,并将后台缓冲区作为纹理。

为此,我使用 CreateTexture() 调用来创建后台缓冲区,然后使用 GetSurfaceLevel() 调用从 Surface 获取纹理。这很好用。

但是,我想直接使用 CreateRenderTarget()。它返回一个表面。但是我需要一个纹理来将一个四边形绘制到前缓冲区。

问题是,我找不到从表面获取纹理的函数。我一次又一次地搜索 DX8.1 文档,但没有成功。这样的功能还存在吗?

【问题讨论】:

  • 你为什么用这么旧的DirectX版本?
  • 使用这么老的 DirectX 有什么理由吗?
  • 兼容性。我们的发行商和发行合作伙伴经常坚持支持低端且从未更新过的系统...

标签: c++ directx direct3d


【解决方案1】:

您可以创建与表面大小和颜色格式匹配的空白纹理。然后将表面的内容复制到纹理的表面。

这是我的 DirectX9 代码中的 sn-p,没有错误处理和其他复杂情况。它实际上创建了 mipmap 链。 注意StretchRect 通过拉伸表面以匹配目标表面的几何形状来进行实际复制。

IDirect3DSurface9* srcSurface = renderTargetSurface;
IDirect3DTexture9* tex = textureFromRenderTarget;
int levels = tex->GetLevelCount(); 

    for (int i=0; i<levels; i++)
    {
        IDirect3DSurface9* destSurface = 0;
        tex->GetSurfaceLevel(i, &destSurface);
        pd3dd->StretchRect(srcSurface, NULL, destSurface, NULL, D3DTEXF_LINEAR);
    }

当然,这适用于 DirectX 9。对于 8.1,您可以尝试 CopyRect 或 Blt。

在 Dx9 上有 ID3DXRenderToSurface 可以直接使用纹理中的表面。我不确定 Dx8.1 是否可行,但上面的复制方法应该可以工作。

【讨论】:

  • 您必须在 D3D9 中显式地双缓冲?
  • 没有。无需双缓冲。可以使用 ID3DXRenderToSurface 将来自纹理的表面设置为渲染目标。那段代码实际上构建了简单的 mipmap-chain。
【解决方案2】:

如果向后兼容是您使用 D3D8 的原因,请尝试改用 SwiftShader。 http://transgaming.com/business/swiftshader

它是 D3D9 的软件实现。当您没有视频卡时,您可以使用它。不过它的成本约为 12k。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多