2010-12-22 101 views
1

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

为此,我使用CreateTexture()调用来创建后台缓冲区,然后调用GetSurfaceLevel()以从Surface中获取纹理。这工作正常。

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

问题是,我找不到从表面获取纹理的函数。我已经搜索了DX8.1 doc一次又一次没有运气。这样的功能是否存在?

+0

为什么你使用这样一个旧版本的DirectX? – 2010-12-22 20:49:34

+0

有没有理由使用如此古老的DirectX? – Virne 2010-12-22 20:55:38

回答

1

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

这是从我的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是否可行,但上面的copy-method应该可以工作。