| Другое > Разное |
| Помогите кто-нибудь с хуком DX11? |
| (1/1) |
| xttx:
Я понимаю, что это немного не тот форум, где нужно спрашивать такие вещи, но на ru-board.com и stackoverflow мне отвечать не торопятся, а тут, я точно знаю, есть товарищи, которые в этом хорошо разбираются. Вопрос собственно: есть хук, который должен рисовать оверлей в контексте хукаемого процесса. В случае с DX11, оно рисуется, но после его отключения, в окне приложения остаётся только пустой чёрный экран. Так ведут себя не все приложения: Dolphin и большинство игр нормально рендерят свою картинку после отключения хука, а вот PCSX2 и COD-AW - дают чёрный экран. А в demul с плагином dx11_old, после отключения хука вообще каша из полигонов (а с новым плагином dx11 - вообще оверлей не отображается, но с этим я уже позже буду разбираться). Видимо я забываю ресторить какой-то стейт, но какой??? :neznayu: Вот кусок кода, из хука функции present, и всё что я возвращаю в изначальное состояние: --- Код: ---if (showOverlay) { sb.Begin(); sb.Draw(srv, rect, Color.White); sb.End(); } elseif (reset) { reset = false; Direct3D11.Device d = swapChain.GetDevice(Of Direct3D11.Device); DeviceContext dc = d.ImmediateContext; dc.InputAssembler.PrimitiveTopology = orig_prim; dc.InputAssembler.InputLayout = orig_inp; dc.Rasterizer.State = orig_st_rs; dc.VertexShader.Set(orig_vs); dc.VertexShader.SetConstantBuffers(0, 1, orig_cst_buf); dc.PixelShader.Set(orig_ps); dc.PixelShader.SetSampler(0, orig_st_sm(0)); dc.PixelShader.SetShaderResources(0, 1, orig_shr_res); dc.OutputMerger.SetBlendState(orig_st_bl, orig_st_bl_clr, orig_st_bl_int); dc.OutputMerger.SetDepthStencilState(orig_st_dc, orig_st_dc_int); if (d.FeatureLevel) >= Direct3D.FeatureLevel.Level_10_0 { dc.GeometryShader.Set(orig_gs); dc.GeometryShader.SetConstantBuffers(0, 1, orig_gs_cb); dc.GeometryShader.SetShaderResources(0, 1, orig_gs_sr); if (d.FeatureLevel >= Direct3D.FeatureLevel.Level_11_0) { dc.HullShader.Set(orig_hs); dc.DomainShader.Set(orig_ds); } } if (orig_vrt_buf AndAlso orig_vrt_buf.Count > 0) dc.InputAssembler.SetVertexBuffers(0, orig_vrt_buf, orig_vrt_int1, orig_vrt_int2); dc.InputAssembler.SetIndexBuffer(orig_ind_buf, orig_ind_frm, orig_ind_int); Main.interfaceClass.callBack_txt("DX11 Hook: States restored."); } --- Конец кода --- Я почти совсем не знаком с DX11, и возникла мысль что может я просто все эти стейты/буферы просто не в том порядке ресторю, я даже не знаю важен ли порядок вобще? |
| Навигация |
| Главная страница сообщений |