DX9c中提供了非常简单的多渲染目标的使用方法。它的原理就是在一次绘制中,将一些不同的信息绘制到许多张纹理中,以便之后对这些纹理进行合成处理,以实现一些不可思议的效果。比如将法线,深度,颜色等信息分别保存到几张纹理中,可以进行关照计算,并且可以实现HDR的效果。D3D9中支持超过4个以上的渲染目标。
具体步骤十分简单。
假设我们已经创建了几张RenderTarget的纹理。pTexDepth, pTexColor, pTexNormal;
在C++中
pTexDepth->GetSurfaceLevel( 0, &pSurfDepth); // 得到深度纹理的Surface
pDevice->SetRenderTarget( 0, pSurfDepth );// 设置该Surface为渲染目标0
pTexColor->GetSurfaceLevel( 0, &pSurfColor);// 得到色彩纹理的Surface
pDevice->SetRenderTarget( 1, pSurfColor );// 设置该Surface为渲染目标1
pTexNormal->GetSurfaceLevel( 0, &pSurfNormal);// 得到法线纹理的Surface
pDevice->SetRenderTarget( 2, pSurfNormal );//设置该Surface为渲染目标2
在Effect中:
定义PS_OUT struct
{
Position: POSITION;
Tex: TEXCOORD0;
Norm: TEXCOORD1;
rt0: COLOR0;
rt1: COLOR1;
rt2: COLOR2;
};
然后PS中
PS_OUT Out = (PS_OUT)0;
...
Out.rt0 = 某个float4;
Out.rt1 = 某个float4;
Out.rt2 = 某个float4;
这样经过渲染之后,我们输入的三张纹理就会各自保存深度,颜色,和法向信息。在之后的渲染中。我们就传和屏幕四角相同位置的4个顶点进渲染管线,然后在纹理空间对图像做处理了。可以实现很多的效果。