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失败(??)
指针地址未对齐(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失败(??)
-----------------------------------------------------------
每天进步一点
浙公网安备 33010602011771号