JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=6663abe38aeec22f933ec87c219d4965Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Surface in eine Textur umwandeln
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 30.12.2010, 14:40    Titel: Surface in eine Textur umwandeln Antworten mit Zitat

Ich habe da ein Problem, bei dem ich Hilfe benötige. Ich möchte eine Szene auf dem Bildschirm darstellen, bei der drei verschiedene Texturen oder, falls möglich, auch Surfaces mittels verschiedener Texturestages zu einem Bild übereinander geblendet werden.

Soweit ich weiß, kann ich dies nur erreichen, indem ich ein 3D-Objekt erschaffe und darauf mit drei Texturestages die jeweiligen Texturen darstelle. Dazu habe ich mir ein Rechteck aus zwei Dreiecken geschaffen, welches mir sozusagen als Leinwand oder Projektionsfläche dient.

Das dumme ist nun, daß die Ausgangsbilder in Form von Surfaces anfallen, die bereits genau die richtige größe haben, um den Bildschirm auszufüllen. Nun muß ich also diese schönen Surfaces in Texturen umwandeln, um sie auf die Leinwand projezieren zu können. Ich habe es mit der Funktion UpdateSurface() versucht. In der Hilfedatei steht dazu unter anderem:

This function has the following restrictions.

The source surface must have been created with D3DPOOL_SYSTEMMEM.
The destination surface must have been created with D3DPOOL_DEFAULT.

The following table shows the supported combinations.

Dest formats
Texture RT texture RT Off-screen plain
Src formats

Texture Yes Yes Yes* Yes
RT texture No No No No
RT No No No No
Off-screen plain Yes Yes Yes Yes

Leider funktioniert die Umwandlung von Off-screen plain in Texture nicht, obwohl es laut der Hilfedatei funktionieren müßte. Ich bekomme die Fehlermeldung, daß der Parameter der Funktion eine Surface sein müßte.

Warum geht es nicht?

Kann ich irgendwie die Surfaces direkt verwenden, um drei davon übereinander zu blenden?

Falls das nicht möglich ist, wie kann ich eine Surface in eine Textur umwandeln.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.01.2011, 18:17    Titel: Antworten mit Zitat

Hast du mal CreateTextureFromSurface() versucht?
Sieht nach einer Lösung für das Problem aus Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 03.01.2011, 23:01    Titel: Antworten mit Zitat

Bei mir funktioniert es nicht. Kann das daran liegen, daß ich mit directx9 arbeite?

Ich gebe zu, daß ich nicht gerade eine Konifere in Sachen Programmierung bin. Crying or Very sad

Diesen Text habe ich im Internet gefunden:
Zitat:

HRESULT CreateTextureFromSurface (LPCTSTR tszTextureFile)
{
HRESULT hr;
D3DDISPLAYMODE d3ddm;
RECT rc;
D3DLOCKED_RECT d3dRect;
BYTE* pbyImage = NULL;
D3DSURFACE_DESC d3dDesc;
IDirect3DSurface8* pSurface = NULL;

g_pD3D->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm);
[...]
}


Wie man sieht bezieht sich dieser Text auf eine directx8 surface. Dann müßte das doch auch unter directx9 funktionieren?! Jedenfalls existiert für meinen Compiler (VisualStudio.Net) die Funktion >CreateTextureFromSurface< nicht. Da kommt folgende Fehlermeldung:
Zitat:
error C2039: 'CreateTextureFromSurface' : Ist kein Element von 'IDirect3DDevice9'
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 04.01.2011, 22:52    Titel: Antworten mit Zitat

Dann weiß ich auch nicht, wie genau DirectX sich das vorstellt.
Kannste die "Bilder" nicht einfach als Texturen laden?
Was genau willst du eigentlich damit anstellen? Vielleicht gibts ja eine andere, einfache Lösung Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 05.01.2011, 09:27    Titel: Antworten mit Zitat

Danke für Dein Mitgefühl!

Um auf Deine Fragen zu antworten - ich möchte folgendes erreichen:

1. Soll eine 3D Szene gerendert werden. (Eine Nahansicht auf einen Globus.)
2. Sollen auf der Oberfläche der Kugel einzelne Gegenstände plaziert werden.
3. Sollen einige der Gegenstände einen Sichtkreis bekommen, in welchem die anderen Gegenstände sichtbar werden.

Dazu habe ich mir folgenden Programmablauf gedacht: Ich nutze eine Off-screen surface als Rendertarget und erhalte so die 3D-Szene (Punkt 1).

Dann nehme ich eine weitere Surface und plaziere auf einem weißen Hintergrund die Grafiken für die Gegenstände in 2D-Technik, wobei die Bildschirmkoordinaten der Grafiken so berechnet sind, daß sie sich auf der Kugeloberfläche zu befinden scheinen (Punkt 2).

Schließlich nehme ich eine dritte Surface mit einem Farbkanal für Transparenz und plaziere dort entsprechende Grafiken, die den Sichtkreis der 'sehenden' Gegenstände wiedergeben (Punkt 3).

Abschließend wandele ich alle drei Surfaces in Texturen um, und projeziere sie mit drei Texturestages auf ein 3D-Objekt, welches mir als Projektionsfläche dient.

Dabei kommt es darauf an, daß der ganze Prozeß so schnell wie möglich abläuft, um eine flüssige Bewegung beim Bewegen der Kamera zu gewährleisten. Daher glaube ich nicht, daß mit lock und unlock und dem pixelweisen übertragen der Bilddaten das Ziel erreicht werden kann. Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 07.01.2011, 08:31    Titel: Antworten mit Zitat

Howdi, wie genau erstellst du deine Surfaces, könntenn wir evtl ein wenig Code sehen um besser helfen zu können?

Ansonsten kannst du auch versuchen eine Textur Roh ohne dein Surface zu erstellen und dein Orignal auf das Surface der neu erstellten textur zu laden, dies geht mithilfe von:

D3DXLoadSurfaceFromSurface
http://msdn.microsoft.com/en-us/library/bb172904%28v=VS.85%29.aspx

Der GameDev.net Thread den du anscheinend sogar schon gefunden hast nutzt diese Funktion auch:

http://www.gamedev.net/community/forums/topic.asp?topic_id=141253

CPP:
// We suppose you have a valid texture created. IT could be empty or filled with data.

// Create and load a file to your first surface
LPDIRECT3DSURFACE9 surface = NULL;
D3DXIMAGE_INFO info;
hr = m_pD3DDevice->CreateOffscreenPlainSurface(32,32, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT,&surface,NULL);
hr = D3DXLoadSurfaceFromFile(surface, NULL,NULL, "base3.bmp", NULL,D3DX_DEFAULT,D3DCOLOR_XRGB(0,0,0),&info);

// This is the fun part.  Get a surface from the texture you want to copy *to*. You will load your first surface to this second surface which is basically a pointer to your texture.
LPDIRECT3DSURFACE9 tempSurf;
m_pMeshTextures[0]->GetSurfaceLevel(0,&tempSurf);

// Load the first surface to the texture (second surface)
D3DXLoadSurfaceFromSurface(tempSurf,NULL,NULL,surface,NULL,NULL,D3DX_FILTER_NONE,0);

// Finally, copy your new surface to your texture.  I do that by locking my surface, copying it to my texture, unlocking and so on...

surface->LockRect(&rect,NULL,0);
surface->UnlockRect();


Wobei einige Stellen dieses Beispiels keinen Sinn für mich ergeben, allerdings habe ich ihn auch nicht getestet. So sollte es meiner Meinung nach gehen:

CPP:
LPDIRECT3DSURFACE9 tempSurf;
myTexture->GetSurfaceLevel(0,&tempSurf);

D3DXLoadSurfaceFromSurface(tempSurf,NULL,NULL,surface,NULL,NULL,D3DX_FILTER_NONE,0);

tempSurf->Release();


mfg Mark

Edit:

Zu dem was du eigentlich vorhast,.. habe ich es so richtig verstanden das du eine "Textur" für den Globus hast bei dem alle extra Objekte enthalten sind, bzw neue hinzugefügt werden um diese Textur dann per MultiTexturing über den Globus zu rendern?

Nutzt man nicht normalerweise Decals oder Projektionen für sowas? Wink
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 10.01.2011, 16:09    Titel: Surface in eine Textur umwandeln Antworten mit Zitat

Hallo Fallen,
erst mal vielen Dank für die Hilfe! Ich habe das so gemacht, wie Du es gesagt hast und es funktioniert sehr gut! Die Bildwiederholfrequenz ist nur um rund 20% verringert worden - das ist weitaus weniger, als ich befürchtet hatte.

Um Deiner Bitte nachzukommen, hier der relevante Teil aus dem Programm:

1. Die Initialisierung:

CPP:
void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpDevice, CRechnerVerwaltung* Verwaltung)
{
Grafikkarte->CreateOffscreenPlainSurface(
             BSchirmbreite,
             BSchirmhoehe,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT ,
             &Hintergrund,
             0);
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);

Grafikkarte->CreateOffscreenPlainSurface(
             BSchirmbreite,
             BSchirmhoehe,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT ,
             &Vordergrund,
             0);

Grafikkarte->CreateTexture(
             BSchirmbreite,
             BSchirmhoehe,
             1,
             D3DUSAGE_RENDERTARGET,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT,
             &ZielTextur,
             0);
ZielTextur->GetSurfaceLevel(0, &Vordergrund);
}




2. Der Teil in der Programmschleife:

CPP:
while (msg.message != WM_QUIT)
{
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {     
     TranslateMessage(&msg);
     DispatchMessage(&msg);
    }   
      if (physikalisch)
      {
         ZeichnePhysikalisch();
         Einheiten_Bearbeiten();

         D3DXLoadSurfaceFromSurface(Vordergrund,NULL,NULL,Hintergrund,NULL,NULL,D3DX_FILTER_NONE,0);

         D3DXMatrixLookAtLH(&m_Perspektive,
            &m_Standort,
            &Blickpunkt,
            &m_Orientierung);

         Grafikkarte->SetTransform(D3DTS_VIEW,&m_Perspektive);
         Grafikkarte->SetTransform(D3DTS_PROJECTION, &m_Projektion);
         Grafikkarte->SetViewport( &Buehne_Drei );

         Grafikkarte->SetStreamSource(0,TexturPuffer,0,20);
         Grafikkarte->SetTexture(0,Tex_Weiss);
         Grafikkarte->SetTexture(1,Tex_Grau);
         Grafikkarte->SetTexture(2,ZielTextur);
         Grafikkarte->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);

         Grafikkarte->SetTexture(0,NULL);
         Grafikkarte->SetTexture(1,NULL);
         Grafikkarte->SetTexture(2,NULL);
      }
}


Zitat:
Zu dem was du eigentlich vorhast,.. habe ich es so richtig verstanden das du eine "Textur" für den Globus hast bei dem alle extra Objekte enthalten sind, bzw neue hinzugefügt werden um diese Textur dann per MultiTexturing über den Globus zu rendern?


Ja, das hast Du im Prinzip richtig verstanden - nur daß ich nicht eine Textur für den Globus habe, sondern der Globus ist in viele Facetten aufgeteilt, die gesondert behandelt werden.

Zitat:
Nutzt man nicht normalerweise Decals oder Projektionen für sowas?


Wie ich eingangs schon sagte, bin ich leider nicht der Oberprogrammierer. Ich muß noch viel lernen - das weiß ich auch. Embarassed
Da ist es gut, daß ich von Dir solche wertvollen Hinweise erhalte. Ich habe mich mal etwas umgesehen und einige Informationen zum Thema > Texturprojektion< gefunden.

http://olli.informatik.uni-oldenburg.de/Grafiti3/grafiti/flow12/page20.html#Ref_ID403

In der Tat könnte eine Anwendung dieser Technik in meinem Programm einige Vorteile bringen. Allerdings habe ich die Absicht auch Gebirgszüge auf meinem Globus darzustellen und dies wollte ich mit triangel-lists machen. Daher kommt die Technik der Texturprojektion wohl doch nicht für mein Programm in Frage (?).

Im Moment versuche ich zu ergründen, wie das mit den Decals funktioniert. Dazu habe ich einen schicken Artikel gefunden:

http://developer.valvesoftware.com/wiki/Decals



Ich vermute, daß da irgendwie rechteckige Bereiche von Bilddaten in eine Textur kopiert werden. Vermutlich muß dazu die Textur mittels >lock< gesperrt werden, bevor pixelweise Daten übertragen werden. Ich versuche der Sache auf den Grund zu gehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.01.2011, 08:49    Titel: Antworten mit Zitat

Ein par Anmerkungen zu deinem Code:

CPP:
ZielTextur->GetSurfaceLevel(0, &Vordergrund);


Hiermit bekommst du ein Surface geliefert, wodurch du das hier überhaupt nicht mehr brauchst:

CPP:
Grafikkarte->CreateOffscreenPlainSurface(
             BSchirmbreite,
             BSchirmhoehe,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT ,
             &Vordergrund,
             0);


Genau das selbe mit

CPP:
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);


hier kann das hier entfallen:
CPP:
Grafikkarte->CreateOffscreenPlainSurface(
             BSchirmbreite,
             BSchirmhoehe,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT ,
             &Hintergrund,
             0);


GetBackBuffer liefert dir wie gesagt das BackBuffer Surface zurück was bereits existiert, dieses Surface hat dann rein gar nichts mehr mit dem zuvor erstellten zu tun. Genau das selbe passiert bei GetSurfaceLevel.

So wie ich das sehe möchtest du einfach nur deinen berenderten Backbuffer in eine Textur kopieren:

CPP:
D3DXLoadSurfaceFromSurface(Vordergrund,NULL,NULL,Hintergrund,NULL,NULL,D3DX_FILTER_NONE,0);


Daas geht aber um einiges schneller, entweder du renderst gleich in eine Textur direkt hinein (RenderTargets) oder du kopierst dir den Inhalt auf eine andere Art und weise, zB mit StretchRect. Leider habe ich dafür grade nicht den passenden Code parat.

Auch möglich ist diese Methode http://msdn.microsoft.com/en-us/library/bb174405%28v=vs.85%29.aspx vermutlich wäre es sogar das schnellste ohne das du gross was ändern musst.

Zitat:
Ich vermute, daß da irgendwie rechteckige Bereiche von Bilddaten in eine Textur kopiert werden. Vermutlich muß dazu die Textur mittels >lock< gesperrt werden, bevor pixelweise Daten übertragen werden. Ich versuche der Sache auf den Grund zu gehen.


Decals sind einfach nur kleine Rechtecke welche die Decaltextur haben und planar zur Zieloberfläche positioniert werden.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 11.01.2011, 10:06    Titel: Antworten mit Zitat

@telebeppo: Ich hab mal in deinem Beitrag aus den Code-Tags Cpp-Tags gemacht, dann kann man den Code schöner lesen.
(Hätte ja nicht gedacht, dass ich in diesem Forum von meinen Moderator Rechten nochmal sinnvoll Gebrauch machen kann Very Happy)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 11.01.2011, 12:58    Titel: Rendertarget Antworten mit Zitat

Danke Jonathan!

Das ist ja ein richtiges Wohlfühl-Forum! Jetzt habe ich auch den CPP-Knopf entdeckt und gleichzeitig geschnallt, was CPP-Tags sind. Man lernt doch nie aus...

Hallo Mark,

ich habe eben mal ausprobiert, was passiert, wenn ich das weg lasse, was Du gesagt hast. Leider hat sich der Compiler ohne irgend eine Fehlermeldung ins Nirvana verdrückt, als ich es compilieren ließ. Mit anderen Worten: ich muß den Programmtext so lassen, damit es funktioniert.

Zitat:
Daas geht aber um einiges schneller, entweder du renderst gleich in eine Textur direkt hinein (RenderTargets) oder du kopierst dir den Inhalt auf eine andere Art und weise, zB mit StretchRect. Leider habe ich dafür grade nicht den passenden Code parat.


Das mit den Rendertargets ist vielleicht ein Krampf! Das hatte ich ja von Anfang an vor gehabt, direkt auf die Textur zu rendern. Aber da gibt es tausend Bedingungen, woher die Daten stammen dürfen und wohin sie gehen dürfen usw. Wobei die Angaben in der DirectX-Dokumentation teilweise falsch zu sein scheinen.

Der folgende Programmauschnitt zeigt, wie ich versucht habe auf die Textur zu rendern:
CPP:
ID3DXRenderToSurface *Apparat;


D3DXCreateRenderToSurface(
              Grafikkarte,
              BSchirmbreite,
              BSchirmhoehe,
              D3DFMT_X8R8G8B8,
              FALSE,
              D3DFMT_D16,
              &Apparat);

Grafikkarte->CreateOffscreenPlainSurface(
              BSchirmbreite,
              BSchirmhoehe,
              D3DFMT_X8R8G8B8,
              D3DPOOL_SYSTEMMEM ,
              &Flaeche,
              0);

inline void HintergrundBildErstellen(void)
{         
 Grafikkarte->SetViewport (&Buehne_Eins);
 Grafikkarte->SetTransform (D3DTS_VIEW, &Perspektive);
 Grafikkarte->SetTransform (D3DTS_PROJECTION, &Projektion);

 Apparat->BeginScene (Flaeche, &Buehne_Eins);
                 ZeichneGebiete();
 Apparat->EndScene (D3DX_FILTER_NONE);
}

Das Problem war immer, daß bei der Funktion: Apparat->BeginScene() nur eine Surface als Zielobjekt erlaubt ist.

Von meinen Bemühungen, direkt auf die Textur zu rendern zeugt noch, daß ich die 'Zieltextur' mit der Option >D3DUSAGE_RENDERTARGET< erschaffen habe, wie Du in meinem vorigen Beitrag sehen kannst.

Ich habe nun mal ausprobiert was passiert wenn ich anstatt D3DUSAGE_RENDERTARGET, NULL oder D3DUSAGE_DYNAMIC angebe und siehe da – es funktioniert nur mit der Option D3DUSAGE_RENDERTARGET. Mit anderen Worten: ich bin nun stolzer Besitzer eines funktionierenden Rendertargets ohne zu wissen wie ich dazu gekommen bin. thinking

Zitat:
Auch möglich ist diese Methode http://msdn.microsoft.com/en-us/library/bb174405%28v=vs.85%29.aspx vermutlich wäre es sogar das schnellste ohne das du gross was ändern musst.


Das Problem ist hier wieder, daß nur Surfaces erlaubt sind:

CPP:
HRESULT GetRenderTargetData(
  [in]  IDirect3DSurface9 *pRenderTarget,
  [in]  IDirect3DSurface9 *pDestSurface
);


Im Hinblick auf mein Programm ist bei dieser Funktion das Problem, daß das Ziel im Systemspeicher liegen muß, was für meine Zwecke hinderlich ist.
Zitat:
The destination surface must be either an off-screen plain surface or a level of a texture (mipmap or cube texture) created with D3DPOOL_SYSTEMMEM.


Wenn da steht mipmap oder cube Textur, heißt das, daß es keine normale Textur akzeptiert?

Ich verstehe nicht, wieso bei DirectX so viele Schwierigkeiten bestehen Surfacedaten in eine Textur zu bekommen. Schade, daß es so etwas wie DirectX nicht auf deutsch gibt, dann wäre es wahrscheinlich nicht so wirr und unlogisch. Beispielsweise die Funktion LoadSurfaceFromSurface, oder GetRenderTargetData - die machen doch so ziemlich das gleiche, wie StrechtRect. Oder sehe ich das falsch?

Ich habe übrigens die Funktion LoadSurfaceFromSurface ausgetauscht mit der Funktion StretchRect, wie Du gesagt hast, kann aber keinen deutlichen Geschwindigkeitsunterschied feststellen.

Zu den Decals wollte ich noch sagen, daß ich hier im Forum auch gelesen habe, daß das einkopieren von solchen kleinen Bildchen in eine Textur auch als 'Decals' bezeichnet wurde. Es ging dabei darum, daß bei vielen Einschußlöchern in einer Wand diese Methode unter Umständen einen Geschwindigkeitsvorteil bringen würde.

Wie ich so weiter am schmökern war, habe ich ein Thema von Dir aus dem Jahr 2004 entdeckt, da ging es um ein Spiel wo die Mitspieler die KI von Panzern entwickeln sollten, um dann zu sehen, welcher Panzer 'schlauer' ist. Leider funktionierten die Verknüpfungen nicht mehr, so daß ich dort nichts herunterladen konnte. Was ist denn aus der Sache geworden?


Zuletzt bearbeitet von telebeppo am 11.01.2011, 13:29, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.01.2011, 13:24    Titel: Antworten mit Zitat

Zitat:
Hallo Mark,

ich habe eben mal ausprobiert, was passiert, wenn ich das weg lasse, was Du gesagt hast. Leider hat sich der Compiler ohne irgend eine Fehlermeldung ins Nirvana verdrückt, als ich es compilieren ließ. Mit anderen Worten: ich muß den Programmtext so lassen, damit es funktioniert.


Was genau geht denn daran nicht und wie sieht dein Code denn aus wenn du diese Fehler bekommst?

Zitat:
Das mit den Rendertargets ist vielleicht ein Krampf! Das hatte ich ja von Anfang an vor gehabt, direkt auf die Textur zu rendern. Aber da gibt es tausend Bedingungen, woher die Daten stammen dürfen und wohin sie gehen dürfen usw. Wobei die Angaben in der DirectX-Dokumentation teilweise falsch zu sein scheinen.

Der folgende Programmauschnitt zeigt, wie ich versucht habe auf die Textur zu rendern:


So sollte es gehen:

CPP:
IDirect3DTexture9* tex;
Grafikkarte->CreateTexture(BSchirmbreite, BSchirmhoehe, D3DX_DEFAULT, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &tex, NULL);

IDirect3DSurface9* Flaeche;
tex->GetSurfaceLevel(0 ,  &Flaeche);

Grafikkarte->SetViewport (&Buehne_Eins);
Grafikkarte->SetTransform (D3DTS_VIEW, &Perspektive);
Grafikkarte->SetTransform (D3DTS_PROJECTION, &Projektion);

Apparat->BeginScene (Flaeche, &Buehne_Eins);
ZeichneGebiete();
Apparat->EndScene (D3DX_FILTER_NONE);


Zitat:
Wie ich so weiter am schmökern war, habe ich ein Thema von Dir aus dem Jahr 2004 entdeckt, da ging es um ein Spiel wo die Mitspieler die KI von Panzern entwickeln sollten, um dann zu sehen, welcher Panzer 'schlauer' ist. Leider funktionierten die Verknüpfungen nicht mehr, so daß ich dort nichts herunterladen konnte. Was ist denn aus der Sache geworden?


2004 ist schon eine ganze Weile her, die Seite gibt es nicht mehr und die Daten habe ich wohl allerhöchstens noch auf meiner Projektepartition Wink

mfg Mark
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 11.01.2011, 13:45    Titel: Antworten mit Zitat

Hallo Mark,
das ging ja schnell. Ich hatte meinen Beitrag noch gar nicht ganz fertig bearbeitet, da war schon die Antwort da. Very Happy
Zitat:
Was genau geht denn daran nicht und wie sieht dein Code denn aus wenn du diese Fehler bekommst?


CPP:
void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpDevice, CRechnerVerwaltung* Verwaltung)
{
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);

Grafikkarte->CreateOffscreenPlainSurface(
             BSchirmbreite,
             BSchirmhoehe,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT ,
             &Vordergrund,
             0);

ZielTextur->GetSurfaceLevel(0, &Vordergrund);
}


Eine Fehlermeldung bekam ich nicht, sondern der Compiler stürzt ab (VisualStudio.Net).

Zitat:
2004 ist schon eine ganze Weile her, die Seite gibt es nicht mehr und die Daten habe ich wohl allerhöchstens noch auf meiner Projektepartition


Ist denn da ein funktionierendes Spiel daraus geworden? Würdest Du mir das Projekt eventuell zukommen lassen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.01.2011, 14:02    Titel: Antworten mit Zitat

Dass dein Compiler abstürzt ist ungewöhnlich und sollte auf keinen Fall am verwendeten Code liegen, was für eine Version von VisualStudio hast du denn?

So sollte die Methode übrigens korrekt sein:

CPP:
void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpDevice, CRechnerVerwaltung* Verwaltung)
{
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);

Grafikkarte->CreateTexture(
             BSchirmbreite,
             BSchirmhoehe,
             1,
             D3DUSAGE_RENDERTARGET,
             D3DFMT_X8R8G8B8,
             D3DPOOL_DEFAULT,
             &ZielTextur,
             0);
ZielTextur->GetSurfaceLevel(0, &Vordergrund);
}


Zitat:
Ist denn da ein funktionierendes Spiel daraus geworden? Würdest Du mir das Projekt eventuell zukommen lassen?


Wenn ich es denn noch finde, dafür müsste ich zu Hause mal danach suchen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 17.01.2011, 08:49    Titel: Antworten mit Zitat

Zitat:
Dass dein Compiler abstürzt ist ungewöhnlich und sollte auf keinen Fall am verwendeten Code liegen, was für eine Version von VisualStudio hast du denn?


Die Versionsnummer ist 7.0.9514. Das ist glaube ich vom Jahr 2002. Seit ich Windows 7 verwende gibt es Probleme mit dem Programm.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 17.01.2011, 09:47    Titel: Antworten mit Zitat

Warum nicht aufrüsten? VS 2010 C++ Express gibts immerhin kostenlos und ist ein wirklich gutes Tool.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum