C D3D Pixel aus RenderSurface auslesen?

MPi

Cadet 2nd Year
Registriert
Mai 2011
Beiträge
23
Hallo zusammen ... vielleicht hat jemand hier eine gute Idee :)

Ich versuche gerade aus einer RenderToTexture unter D3D einen definierten Pixel auszulesen, nur finde ich irgendwie nirgends einen guten Ansatz um diese zu bewerkstelligen.

Erzeugt wird die Textur so:

LPD3DXRENDERTOSURFACE m_pRenderToSurface
LPDIRECT3DTEXTURE9 g_pDynamicTexture
LPDIRECT3DSURFACE9 m_pTextureSurface

m_pRenderToSurface->BeginScene( m_pTextureSurface, NULL );
renderScene();
m_pRenderToSurface->EndScene( 0 );

Nach diesem Render-Pass würde ich gern einen Pixel aus dieser Textur auslesen, in etwa so: GetPixelColor(m_pTextureSurface, 0.3f, 0.7f) (0.3 und 0.7 sind hier x und y Koordinate)

Warum das? Es geht natürlich um eine Mausabfrage, also Object-Picking.
Warum nicht 'IntersectTri' oder ähnliches, mit vorgeschalteten Bounding Boxen.

Meine 3D Daten liegen mir nur als Mesh vor, ohne Hierarchy, ein Mesh hat dabei durchaus mal 5 Millionen Dreiecke, und darauf die IntersectTri loszulassen, führt zu Wartezeiten die nicht mehr akzeptabel sind.

Danke für Eure Zeit!
 
Danke für den Tip!

Das ganze sieht aktuell so aus:

LPD3DXRENDERTOSURFACE m_pRenderToSurface
LPDIRECT3DTEXTURE9 g_pDynamicTexture
LPDIRECT3DSURFACE9 m_pTextureSurface

m_pRenderToSurface->BeginScene( m_pTextureSurface, NULL );
renderScene();
m_pRenderToSurface->EndScene( 0 );

D3DLOCKED_RECT d3dRect;
HRESULT hResult = g_pDynamicTexture[g_RenderToSurfaceIndex]->LockRect(0, &d3dRect, NULL, D3DLOCK_READONLY);
if(FAILED(hResult)) { handleError }
else { readPixels and unlock }

LockRect gibt mir beim Aufruf 8876086c in hResult zurück, müsste D3DERR_INVALIDCALL sein.

Hat jemand eine Idee?
 
Wenn ich ehrlich bin, weiß ich gar nicht genau was ich hier mache :)

Ich habe die Zeile

HRESULT hResult = g_pDynamicTexture->LockRect(0, &d3dRect, NULL, D3DLOCK_READONLY);

in

HRESULT hResult = m_pTextureSurface->LockRect(&d3dRect, NULL, D3DLOCK_READONLY);

umgebaut. Also LockRect von der Textur auf die Surface.

Die Fehlermeldung in hResult bleibt allerdings exakt die gleiche
 
Danke trotzdem für deine Antworten. Ich denke den kompletten Source zu posten wäre doch etwas zu viel des Guten. (sind ein paar 1000 Zeilen)

Ich vermute mal, über einen Pixelshader (3_0) einen globalen Wert zu modifizieren geht auch nicht. Falls doch könnte das Problem über einen Pixelshader gelöst werden, der bei Erreichen einer bestimmten Position (z.B. umgerechnete Mausposition) einen Wert (Object Index) hinausschreibt. Aber das klingt mir irgendwie schon zu abenteuerlich :)
 
hier ein beispiel wie fraps die pixel aus dx rauszieht. vlt kannst davon etwas gebrauchen. ist für dx9. für dx10 könnte ich dir ein anderes beispiel geben.

schau mal auf die GetFrame()-methode
 
Zurück
Oben