| 1065 | } |
| 1066 | |
| 1067 | bool AppFrame::PostEffect(fcyRefPointer<f2dTexture2D> rt, ResFX* shader, BlendMode blend)LNOEXCEPT |
| 1068 | { |
| 1069 | f2dEffectTechnique* pTechnique = shader->GetEffect()->GetTechnique(0U); |
| 1070 | |
| 1071 | if (!pTechnique) |
| 1072 | { |
| 1073 | LERROR("PostEffect: 无效的Shader数据"); |
| 1074 | return false; |
| 1075 | } |
| 1076 | |
| 1077 | // 纹理使用检查 |
| 1078 | if (CheckRenderTargetInUse(rt)) |
| 1079 | { |
| 1080 | LERROR("PostEffect: 无法在一个RenderTarget正在使用时作为后处理输入"); |
| 1081 | return false; |
| 1082 | } |
| 1083 | |
| 1084 | // 终止渲染过程 |
| 1085 | bool bRestartRenderPeriod = false; |
| 1086 | switch (m_GraphType) |
| 1087 | { |
| 1088 | case GraphicsType::Graph2D: |
| 1089 | if (m_Graph2D->IsInRender()) |
| 1090 | { |
| 1091 | bRestartRenderPeriod = true; |
| 1092 | m_Graph2D->End(); |
| 1093 | } |
| 1094 | break; |
| 1095 | case GraphicsType::Graph3D: |
| 1096 | if (m_Graph3D->IsInRender()) |
| 1097 | { |
| 1098 | bRestartRenderPeriod = true; |
| 1099 | m_Graph3D->End(); |
| 1100 | } |
| 1101 | break; |
| 1102 | } |
| 1103 | |
| 1104 | // 更新渲染状态 |
| 1105 | updateGraph3DBlendMode(blend); |
| 1106 | |
| 1107 | // 关闭fog |
| 1108 | IDirect3DDevice9* pDev = (IDirect3DDevice9*)m_pRenderDev->GetHandle(); |
| 1109 | DWORD iFogEnabled = FALSE; |
| 1110 | pDev->GetRenderState(D3DRS_FOGENABLE, &iFogEnabled); |
| 1111 | if (iFogEnabled == TRUE) |
| 1112 | pDev->SetRenderState(D3DRS_FOGENABLE, FALSE); |
| 1113 | |
| 1114 | // 设置effect |
| 1115 | shader->SetPostEffectTexture(rt); |
| 1116 | shader->SetViewport(m_pRenderDev->GetViewport()); |
| 1117 | shader->SetScreenSize(fcyVec2((float)m_pRenderDev->GetBufferWidth(), (float)m_pRenderDev->GetBufferHeight())); |
| 1118 | m_Graph3D->SetEffect(shader->GetEffect()); |
| 1119 | if (FCYFAILED(m_Graph3D->Begin())) |
| 1120 | { |
| 1121 | // ! 异常退出不可恢复渲染过程 |
| 1122 | LERROR("PostEffect: 内部错误 (f2dGraphics3D::Begin failed)"); |
| 1123 | return false; |
| 1124 | } |
nothing calls this directly
no test coverage detected