【XBOX360 Porting Tricks】三

Posted on 2008-11-07 17:36  活着就是幸福  阅读(344)  评论(0)    收藏  举报
1. Datatype misalignment解决办法
指针地址未对齐(float必须为4字节对齐)
解决方法:拷贝源数据到新的float数组里,使用数组里的副本进行运算,对于PC上原始未对齐的数据可以免于修改。

2. PC上由于可以直接将Texture作为RenderTarget进行渲染,所以在切换RenderTarget时只要保存当前的RenderTarget的指针即可。但在XBOX360上由于EDRAM内的不同RenderTarget有可能是重叠的,所以不只能是简单的保存指针,还要将RenderTarget先Resolve到Texture上,在还原RenderTarget的时候再将Texture弄回到RenderTarget上,会产生两次Resolve,效率比较低下。
(resolve对于1280x720是0.25ms), 具体步骤如下:

1.Save the pointer pointing to the current render-target:[pOldOne] and
resolve the current render-target to a texture[pOldTex].
2.Set another render-target[pNewOne], render, and reslove the result to the
texture[pNewTex].
3.Set the [pOldOne] as the original render-target.
4.Clear and render from pOldTex to the render-target [pOldOne].

Step 1 and 3 on PC are not needed because textures can be set as
render-target on PC directly.

对于保存的原始RenderTarget和Depth/Stencil的Texture, 在Restore的时候,
1. Render-target使用DrawPrimitiveUP方法,覆盖到原始Surface上(无需Clear)PixelShader
float4    psMainRTSwitch( float2 Tex0 : TEXCOORD0 ) : COLOR0
{
    return tex2D( sam0, Tex0 );
}
2. Depth/Stencil使用DrawPrimitiveUP方法,覆盖到原始Surface上(无需Clear)PixelShader(对于D24S8格式)
struct PS_SWITCH_OUTPUT
{
    float4    col : COLOR0;//由于pixelshader必须输出颜色,所以depth不能单独使用
    float    dep : DEPTH0;
};

PS_SWITCH_OUTPUT psMainRTDSSwitch(    float2 TexColor : TEXCOORD0,    
                    float2 TexDepth : TEXCOORD1 )
{
    PS_SWITCH_OUTPUT Out;
    Out.col = tex2D( sam0, TexColor );
    Out.dep = tex2D( sam1, TexDepth ).x;//原depth保存在x分量中
    return Out;
}

在render target时要保存先前状态然后
    pDevice_->SetRenderState( D3DRS_VIEWPORTENABLE, FALSE );
    pDevice_->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
    pDevice_->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
最后恢复

在render stencil时还要设置
    pDevice_->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
    pDevice_->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );

3. Game:始终是相对于当前执行的xex来说的。
4. 一个technique存在两个以上的pass会导致debug失败(??)