标签:style blog http color ar os 使用 for sp
pixout FogPassPS(vert2fragFog IN) { pixout OUT; float sceneDepth; half4 localFogColor; float3 worldPos,cameraToWorldPos; FogPassCommon(IN,sceneDepth,localFogColor,worldPos,cameraToWorldPos); localFogColor.a=1.0-localFogColor.a; localFogColor.xyz*=HDRParams2.y; HDROutput(OUT,localFogColor,1); return OUT; }
从shader的名字看,确实是FogPass的问题,先把代码回滚回正确的版本后,对两个版本fogpass的shader代码做比对,没有任何区别,排除了shader source code 出错的可能性。
PROFILE_LABEL_PUSH("ZPASS"); FX_ProcessZPassRenderLists(); PROFILE_LABEL_POP("ZPASS");
CD3D9Renderer::FX_ProcessZPassRenderLists,而它通过调用CD3D9Renderer::FX_ZScene,来设置rendertarget
if( bRenderNormalsOnly ) { FX_PushRenderTarget(0,CTexture::s_ptexSceneNormalsMap,&m_DepthBufferOrigMSAA,false,-1,true); } else { FX_PushRenderTarget(0,CTexture::s_ptexZTarget,&m_DepthBufferOrigMSAA,false,-1,true); FX_PushRenderTarget(1,CTexture::s_ptexSceneNormalsMap, NULL); }
这里FX_PushRenderTarget并不会立即调用d3d的api设置rendertarget,而是把信息保存在RT的stack里,等commit时再统一进行设置,条件语句if成功的分支,就是把ZTarget设置到RT0的阶段,但从
if(NewRenderTargets== NULL ||!RTs[i]->GetRenderTargetView()) { mNativeD3D9Device->SetRenderTarget(i, NULL); } else { IDirect3DSurface9* pSurf =(IDirect3DSurface9*)RTs[i]->GetRenderTargetView()->GetNativeResource(); mNativeD3D9Device->SetRenderTarget( i, pSurf ); }
上面是同事修改过后的SetRednerTarget函数,在这里设置断点,结果发现传递进去的pSurf指针也是正确的,那么说明,这部分API的调用是没问题的,很有可能是SetRenderTarget失败,导致前一个pass里,设置的RT0 surface,也就是R32F ZTarget被保留到了下一个pass里继续使用了。
D3D9Device->SetRenderTarget(0,ZTarget); D3D9Device->SetRenderTarget(1,SceneNormal); D3D9Device->SetRenderTarget(0,SceneNormal);//错误
D3D9Device->SetRenderTarget(0,ZTarget); D3D9Device->SetRenderTarget(1,SceneNormal); D3D9Device->SetRenderTarget(1,0); D3D9Device->SetRenderTarget(0,SceneNormal);//正确
而我们修改过的代码,因为某些逻辑问题,设置RT1为NULL的操作被跳过了
LPDIRECT3DDEVICE9 dv = gcpRendD3D->GetD3DDevice(); bool sRGBRead = gRenDev->IsLinearSpaceShadingEnabled()&&( m_bIsSRGB || s_TexStates[nTS].m_bSRGBLookup &&(m_nFlags& FT_USAGE_ALLOWREADSRGB)); STexState*pDTS =&TexStages[nTUnit].m_State; if(pDTS->m_bSRGBLookup != sRGBRead ) { pDTS->m_bSRGBLookup = sRGBRead; dv->SetSamplerState(nTUnit + nVtxTexOffSet, D3DSAMP_SRGBTEXTURE, sRGBRead ? TRUE : FALSE); }
然后,又回到了SceneDiffuseAcc渲染错误的问题上了。这个问题略坑,还没找到正确解决方法,
具体现象是,在正确版本里,把法线,UV,以及其他定值作为output输出
标签:style blog http color ar os 使用 for sp
原文地址:http://www.cnblogs.com/TracePlus/p/4079816.html