Retrieving data from current D3D9 context

Started by
3 comments, last by Evil Steve 12 years, 1 month ago
Hi,
How can I get, say, projection matrix, from the current D3D9 context? By current I mean from a certain game, to which I am hooked through a DLL. Such thing is done i.e. in ENB Series, as far as I know.

Regards,
MK
Advertisement
As far as I'm aware, there's a bit of extra magic going on whereupon shader constants are also examined and saved externally. Unfortunately there's no perfect way to do this w/ the programmable pipeline.
clb: At the end of 2012, the positions of jupiter, saturn, mercury, and deimos are aligned so as to cause a denormalized flush-to-zero bug when computing earth's gravitational force, slinging it to the sun.
With the fixed pipeline you can use IDirect3DDevice9::GetTransform, and there are other Gets for other states available. You need to be aware that if the device was originally created as a Pure Device, many of these Gets won't work, however - if it can be captured in a State Block you can't Get it.

With the programmable pipeline there is no concept of "state" for many things; even a matrix could come from many different souces: it could be passed along with other vertex attributes, constructed on the fly in a shader, or any number of other ways. TextureStageState doesn't exist and Sampler State could be set via an Effect rather than SetSamplerState calls.

One thing you could do - if you know that the program uses Effects - is create an ID3DXEffectStateManager and use that to capture settings. But you'll never really get the full picture with a program using shaders.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

And what with the frame and depth data (from current framebuffer)? How to retrieve them?
IDirect3DDevice9::GetBackBuffer and IDirect3DDevice9::GetDepthStencilSurface.

This topic is closed to new replies.

Advertisement