PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auslesen von Texture in DirectX mit C#


pajofego
2004-11-23, 15:22:02
Hallo Leute,

ich habe mal wieder das Problem mit dem Auslesen von Texturen in DirectX. Folgender C++ Code funktioniert tadellos:


//-----------------------------------------------------------------------------
// Name: WriteToFile()
// Desc: Read out the Texture and write the Input of the Textures down to a file
// Channel: means [0,1,2,3] -> Red, Green, Blue, Alpha - Channel
//-----------------------------------------------------------------------------
void clAvalanche::WriteToFile(LPDIRECT3DSURFACE9 pTextureSurface, const char *FileName, const unsigned int Channel)
{

bool FileOK = true;
if ((ms_pFile = fopen(FileName, "w")) == NULL)
FileOK = false;

D3DLOCKED_RECT rfTextureLock;

// transfer data from GPU to CPU
HRESULT hr = m_pd3dDevice->GetRenderTargetData(pTextureSurface, ms_MainMemTexture);

// copy data into user pointer
hr = ms_MainMemTexture->LockRect(0, &rfTextureLock, NULL, D3DLOCK_READONLY);

float *cursor = (float*)rfTextureLock.pBits;
for( unsigned int y = 0; y < ms_iSizeY; y++ )
{
int i = 0;
for( unsigned int x = 0 ;x < 4 * ms_iSizeX; x++ )
{
if (FileOK && (i % 4 )== 0)
fprintf(ms_pFile, "%.12f ", cursor[x+Channel]);
i++;
}
cursor += ms_iSizeX * 4;
fprintf(ms_pFile, "\n");
}
ms_MainMemTexture->UnlockRect(0);
if (FileOK)
fclose(ms_pFile);
}



Das Problem ist jetzt, ich habe mich mal daran versucht das ganze in C# umzuschreiben ;D aber hier hängt es ein bissle. Es werden nicht die richtigen Werte aus dem Speicher gelesen...teilweise Bereichsübertretung. :|

Hat einer eine sichere Methode um unter C# (non unsafe!!!) die Texturen auszulesen?

Danke

Hier nicht ganz funktionierender C#-Code:

#if(DEBUG)
unsafe public virtual void WriteDataToDebugOutput(Surface pTextureSurface, uint fChannel)
{
DefaultTraceListener hWriteToDebugOutput = new DefaultTraceListener();

// transfer data from GPU to CPU
CurrentDevice.GetRenderTargetData(pTextureSurface, m_MainMemSurface);

// copy data into user pointer
float *cursor = (float*)ms_MainMemTexture.LockRectangle(0, LockFlags.ReadOnly).InternalData.ToPointer();

for( uint y = 0; y < m_iSizeY; y++ )
{
int i = 0;
for( uint x = 0 ;x < 4 * m_iSizeX; x++ )
{
if (i % 4 == 0)
hWriteToDebugOutput.WriteLine(cursor[x + fChannel].ToString("00.00"));
i++;
}
cursor += m_iSizeX * 4;
}
ms_MainMemTexture.UnlockRectangle(0);
}
#endif
}
}

grakaman
2004-11-23, 15:57:35
Ich kenne mich zwar nicht mit D3D aus, aber wenn du unsafe Code verwendest, kann es vielleicht an er fehlenden "fixed" Anweisung liegen und du deswegen falsche Werte bekommst?