概述
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的操作被跳过了
CE老版本的设置方法,而DX11风格变成了统一设置,而我们把这个参数忘记了。
-
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输出
转载于:https://www.cnblogs.com/TracePlus/p/4079816.html
最后
以上就是俊逸灯泡为你收集整理的使用Nsight查找CE3的渲染bug的全部内容,希望文章能够帮你解决使用Nsight查找CE3的渲染bug所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复