воскресенье, 2 ноября 2008 г.

Перехват D3D9 или как устроены StateBlock'и

Когда мы решили полностью отказаться от вызова Get* методов D3D9 в нашей обертке над ним, а перехватывать для этого Set* методы и сохранять значение там мы с толкнулись с некоторыми непредвиденными трудностями.

Перехватив все нужные методы мы столкнулись с одной интересной особеностью реализации StateBlock'ов в D3D9, при вызова BeginStateBlock() D3D9 меняет указатели в таблицы виртуальных функция устройства у следующих методов: SetMaterial, SetRenderState, SetTexture, SetTextureStageState, SetSamplerState, SetFVF, SetVertexShader, SetVertexShaderConstantF, SetVertexShaderConstantI, SetVertexShaderConstantB, SetStreamSource, SetStreamSourceFreq, SetIndices, SetPixelShader, SetPixelShaderConstantF, SetPixelShaderConstantI, SetPixelShaderConstantB, а остальные Set* функции просто не применяю новые значения состояний к устройству и только сохраняют их в StateBlock'е. Насколько я знаю в COM нет легального способа поменять указать в VTBL, т.е. это по сути хак. С этим возникли проблемы когда мы хотели вызвать оригинальные методы внутри BeginStateBlock\EndStateBlock.

Комментариев нет: