我正在通过创建一个渲染目标及其相关的深度和模板缓冲区,绘制到它,然后使用后缓冲区作为纹理绘制一个全屏,可能是拉伸的四边形来进行双缓冲。
为此,我使用CreateTexture()调用来创建后台缓冲区,然后使用GetSurfaceLevel()调用从Surface获取纹理。这很好。
但是,我想直接使用CreateRenderTarget()。它返回一个Surface。但后来我需要一个纹理来将四边形绘制到前缓冲区。
问题是,我找不到从曲面获取纹理的函数。我一次又一次地搜索DX8.1文档但没有运气。这种功能是否存在?
答案 0 :(得分:1)
您可以创建表面的空纹理匹配大小和颜色格式。然后将曲面的内容复制到纹理的表面。
以下是我的DirectX9代码的代码段,没有错误处理和其他复杂情况。它实际上创建了mipmap-chain。 注意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是否可行,但上面的复制方法应该可行。
答案 1 :(得分:0)
如果向后兼容性是您使用D3D8的原因,请尝试使用SwiftShader。 http://transgaming.com/business/swiftshader
它是D3D9的软件实现。您可以在没有视频卡时使用它。它的成本约为12k。