DirectX 8.1 中的表面纹理

发布于 2024-10-09 11:27:43 字数 301 浏览 4 评论 0原文

我正在通过创建一个渲染目标及其关联的深度和模板缓冲区来进行双缓冲,绘制到它,然后绘制一个全屏(可能是拉伸的)四边形,并将后台缓冲区作为纹理。

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

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

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

I'm doing double-buffering by creating a render target with its associated depth and stencil buffer, drawing to it, and then drawing a fullscreen, possibly stretched, quad with the back buffer as the texture.

To do this I'm using a CreateTexture() call to create the back buffer, and then a GetSurfaceLevel() call to get the texture from the Surface. This works fine.

However, I'd like to use CreateRenderTarget() directly. It returns a Surface. But then I need a Texture to draw a quad to the front buffer.

The problem is, I can't find a function to get a texture from a surface. I've searched the DX8.1 doc again and again with no luck. Does such function even exist?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤城病女 2024-10-16 11:27:43

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

这是我的 DirectX9 代码的一个片段,没有错误处理和其他复杂情况。它实际上创建了 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 是否可行,但上述复制方法应该有效。

You can create empty texture matching size and color format of the surface. Then copy contents of the surface to the surface of the texture.

Here is a snippet from my DirectX9 code without error handling and other complications. It actually creates mipmap-chain.
Note StretchRect that does the actual copying by stretching surface to match geometry of the destination surface.

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);
    }

But of course, this is for DirectX 9. For 8.1 you can try CopyRect or Blt.

On Dx9 there is ID3DXRenderToSurface that can use surface from texture directly. I am not sure if that's possible with Dx8.1, but above copy-method should work.

君勿笑 2024-10-16 11:27:43

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

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

If backwards compatibility is the reason your using D3D8, try using SwiftShader instead. http://transgaming.com/business/swiftshader

It a software implementation of D3D9. You can utilize it when you don't have a video card. It costs about 12k though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文