JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Textur zur Laufzeit ändern

 
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: 21.05.2010, 10:17    Titel: Textur zur Laufzeit ändern Antworten mit Zitat

Hallo ihr lieben Leute,

ich wende mich heute mit zwei Fragen an Euch, da ich sonst niemanden habe, den ich fragen könnte.

1. Wie kann ich eine Textur zur Laufzeit verändern? Ich habe eine Textur im D3DPOOL_DEFAULT, mit USAGE_DYNAMIC erzeugt und wollte mit der DRAW-Methode einige SPRITES dort hinein zeichnen. Also habe ich mit LOCK die Textur zum verändern geöffnet und dann DRAW und UNLOCK geschrieben. Allerdings kam nicht das gewünschte Ergebnis dabei heraus. Das Sprite wurde nicht in die Textur gezeichnet, sondern auf den Bildschirmbereich. Wie kann man also zur Laufzeit in eine Textur ein SPRITE hineinzeichnen?

2. Ich verwende Visual Studio.net und möchte die Debug dll von Directx SDK anwenden. MVP schrieb dazu:

Zitat:
Um die zu aktivieren gehe ins DXSDK Verzeichniss, dann Utilities und starte das DX steuerungsprogramm (dürfte dxcpl.exe oder so heissen).

Sollte das Programm nicht da sein dann gehe in Start->Systemsteuerung->Direx´ctX rein, dies ist das selbe. Dort aktivierst du dann die Debug Dlls.


Ich habe die Debug Dll nicht gefunden und habe stattdessen das Programm >Spy< vorgefunden, welches offenbar eine ähnliche Funktion hat. Allerdings funktioniert es bei mir nicht. Scheinbar ist es für Visual Studio 7 ausgelegt (ich kenne nur Visual Studio 6).

Wie kann ich die Debug dlls von Directx SDK anwenden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.05.2010, 15:18    Titel: Antworten mit Zitat

Man muss im Linker die Debugvarianten der Libraries linken. Sie haben meisstens ein D am Ende des Namens - Statt "Bibliothek.lib" einfach "BibliothekD.lib" linken.

Zu dem Sprite kann ich nicht all zuviel sagen. Du solltest aber auf das Sprite und nicht auf den Screen zeichnen^^

Schätzungsweise nutzt du GDI-Funktionen zum Malen auf das Sprite?
Dann sind neben dem Locken noch das Selektieren nötig.
Siehe => SelectObject()

Leider ist das ganze für mich schon mehr als 4 Jahre her, seit ich mit massiv C oder C++ gearbeitet habe. Auch scheint mir Version 6 von Visual Studio doch SEHR alt zu sein. (was nicht heisst, dass diese Version nicht mehr funktionieren würde) Die Aktuelle Version ist 10 (VS 2010) von der es auch wieder die beliebten Expressversionen gibt.

MfG, AFE-GmdG

PS.: MVP ist ein Titel, kein Name Wink
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
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: 26.05.2010, 21:30    Titel: Nocheinmal Antworten mit Zitat

Ich möchte nocheinmal auf das Problem zu sprechen kommen, welches ich versucht habe zu schildern. Offenbar habe ich das Problem nicht richtig erklärt. Also will ich es nocheinmal versuchen.

Nehmen wir z.B. einen Würfel. Angenommen man wollte auf eine Fläche eines Würfels eine Textur aufbringen - so gibt man die Eckpunkte der Würfels als Texturkoordinaten an und kann mit der Funktion >SetTexture< eine Textur auf die Fläche aufbringen.

Mein Problem ist nun folgendes:

- ich möchte diese Textur für den Würfel aus vielen kleinen, quadratischen Bildelementen aufbauen. So, wie ein Schachbrettmuster. Und dieses Schachbrettmuster soll man während das Programm läuft aus dem Programm heraus verändern können.

- Die Bildelemente selbst sollen dabei unverändert bleiben und im Grafikspeicher abgelegt sein. Man soll sie um 90°, 180°, bzw. 270° drehen können, und dann zu einem beliebigen neuen Schachbrettmuster neu zusammenstellen können, welches dann auf der Seite des Würfels erscheinen soll.

Ich habe mit den Funktionen >StretchRect<, >UpdateSurface< und >UpdateTexture< herumexperimentiert, aber es ist mir nicht gelungen die gewünschten Bildelemente auf die Textur zu bekommen. Die Funktion >UpdateSurface< kopiert rechteckige Flächen von einer Surface zur anderen. Sie macht genau das, was ich haben möchte, allerdings nur zwischen zwei Surfaces. Selbst wenn ich den Umweg über diese Funktion in Kauf nehmen würde, nützt mir das nichts, wenn es mir nicht gelingt, die Surface in eine Textur umzuwandeln. Gewiß könnte man die Surface als Datei speichern und danach eine Textur aus der Datei erzeugen, aber dieser Vorgang würde viel zu viel Zeit in Anspruch nehmen.

Bitte helft! praying
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: 28.05.2010, 12:33    Titel: Antworten mit Zitat

Ich habe noch nie gehört, dass man Draw innerhalb einer Lock-Unlock-Operation benutzt.
In der Regel muss man dann manuell die Daten in den Speicherbereich der Textur kopieren.

Das sollte ein funktionierendes Beispiel dafür sein:
http://www.gamedev.net/community/forums/topic.asp?topic_id=149710&whichpage=1&#845318
_________________
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: 30.05.2010, 11:59    Titel: Antworten mit Zitat

Danke für die Antwort!

Für das Programm, das ich schreiben will erscheint mir die beschriebene Methode als zu zeitaufwändig und, in meinem Fall, bringt es mir Probleme, was den Speicherplatzbedarf angeht. Meine Überlegung geht inzwischen in eine andere Richtung:

Ich habe die Fläche des Würfels genommen und die Anzahl der Texturkoordinaten erhöht. D.h. ich habe für den unteren, rechten Punkt der Textur nicht >1< angegeben, sondern >8<. Dadurch wird nun die Textur 8*8 mal auf der Fläche des Würfels angezeigt.

Das Problem ist nur, das es immer die gleiche Textur ist, die dort angezeigt wird. Weiß vielleicht jemand, wie man den Texturkoordinaten eine jeweils eigene Textur zuweisen kann? Mit >SetTexture< können maximal 8 verschiedene Texturen und unterschiedliche Datensätze für die dazugehörigen Texturen angewendet werden. Das reicht für das, was ich vor habe nicht aus. Bzw. ich möchte vermeiden unnötig viele Vertices zu verwenden, da die Texturen ja ohnehin auf eine ebene Fläche projeziert werden, würde es genügen mit den Texturkoordinaten zu arbeiten.

Beispielsweise ist es mit einer X-Datei möglich verschiedene Texturen auf einem Mesh nebeneinander anzuzeigen. Ist das vielleicht die beste Lösung?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 31.05.2010, 08:09    Titel: Antworten mit Zitat

WIE dynamisch müssen denn die Texturen sein?
Sprich - Ändern sie sich während einer Prozessinstanz ein oder zweimal - oder eher mit jedem Frame...

Wenn die Anzahl der Änderungen vergleichsweise gering ist, würde ich die nötigen Texturen einfach in der "Laderoutine" generieren.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
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: 31.05.2010, 16:24    Titel: Antworten mit Zitat

Es handelt sich um eine Landkarte auf der sich nur gelegentlich ein paar Linien ändern sollen. D.h. die meiste Zeit über ändert sich gar nichts an den Texturen.

Trotzdem bin ich darauf angewiesen viele kleine Texturen auf einer Fläche mit möglichst wenig Raumkoordinaten (Vertices) unterzubringen. Wollte ich die Landkarte in dem gewünschten Maßstab einfach in Texturen zerlegen und auf die vorgesehenen Flächen projezieren, würde ein riesenhafter Speicherbedarf entstehen. Daher habe ich mir gedacht, schaffe ich mir so eine Art Baukasten aus Landschaftsbausteinen, aus denen ich dann diese große Landkarte zusammensetze.

Im Moment versuche ich es mit einer X-Datei. Es handelt sich um eine Fläche mit 9 Vertices, der ich versuchsweise 8*8 Texturkoordinaten zugewiesen habe. Da ich die X-Dateien im Textformat erstellt habe, kann ich darin herum probieren. Es gibt dort eine sogenannte >MeshMaterialList<, in der man die Anzahl der verwendeten Materialien (Texturen) angeben kann und dann eine Reihenfolge, mit der diese den vorhandenen Texturkoordinaten zugeordnet werden. Das funktioniert sogar leidlich, d.h. mit einigen Fehlern in der Ausrichtung der Texturen, wie ich mir das mit dem MeshViewer ansehen konnte.

In meinem Programm wird die X-Datei leider nicht so dargestellt, wie im MeshViewer. Die Texturen werden so dargestellt, wie im Modus D3DTADDRESS_CLAMP. D.h. die Ränder der Textur werden über die ganze Fläche ausgedehnt.

Das Problem hängt vermutlich mit einem bestimmten Template zusammen, welches für die richtige Behandlung der >MeshMaterialList< zuständig ist.

In dem Buch von Christian Rousselle ist nichts spezifisches über diese Templates beschrieben und die, in seinen Programmbeispielen enthaltene, Klasse, >D3DOBJECT<, zeigt auch keine speziellen Funktionen für die Behandlung dieser Templates.

Seit Tagen probiere ich nun herum und es ist immer noch keine Lösung für das Problem in Sicht. Da ich keine Ahnung von diesen Templates habe, versuche mir jetzt mal den Quellcode von der MeshView.exe irgendwo runterzuladen. Vielleicht kann ich dort sehen, was MeshView anders macht als mein Programm...

Falls Du eine bessere Idee hast, wie ich das Problem lösen kann, dann laß es mich bitte wissen.
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.06.2010, 19:32    Titel: Antworten mit Zitat

Ich bin mir nicht sicher, ob ich dein Ziel richtig verstanden habe.
Aber versuch dich doch mal an Rendertargets. Man muss nicht die gesamte Textur locken, um Daten von einer Textur in die andere zu kopieren. Du kannst auch schlichtweg die eine Textur auf die andere rendern. Für "gelegentliche" kleine Operationen sicherlich effizienter als das Lock-Unlock-Geraffel.

CPP:
//Rendertarget erstellen
LPDIRECT3DTEXTURE9 new_rendertarget=NULL;
cDevice->CreateTexture(Width,Height,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&new_rendertarget,NULL);

//[...]




//Die Textur als Rendertarget für alle künftigen Renderoperationen wählen
if(new_rendertarget) cDevice->SetRenderTarget(0,new_rendertarget);



//Ziel auf Backbuffer zurück stellen
LPDIRECT3DSURFACE9 backbuffer=NULL;
cDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backbuffer);
if(backbuffer) cDevice->SetRenderTarget(0,backbuffer);



Du musst halt eventuell aufpassen, dass die View&Projection-Matrix stimmt (ggf. neu setzen!), damit du nicht irgendwelche komisch im Raum stehende Sprites auf dein Rendertarget projizierst, sondern letztenendes eine 2D-Kopie ausführst.
_________________
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
Kampfhund
Super JLI'ler


Alter: 41
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 04.06.2010, 21:07    Titel: Antworten mit Zitat

telebeppo hat Folgendes geschrieben:
Es handelt sich um eine Landkarte auf der sich nur gelegentlich ein paar Linien ändern sollen. D.h. die meiste Zeit über ändert sich gar nichts an den Texturen.

Sollen die Linien nur über die Textur gelegt werden (so wie in einer Minimap in einem Spiel) oder soll wirklich die originaltextur im Speicher geändert werden (zB geändertes Gelände)?

Zitat:

Trotzdem bin ich darauf angewiesen viele kleine Texturen auf einer Fläche mit möglichst wenig Raumkoordinaten (Vertices) unterzubringen. Wollte ich die Landkarte in dem gewünschten Maßstab einfach in Texturen zerlegen und auf die vorgesehenen Flächen projezieren, würde ein riesenhafter Speicherbedarf entstehen. Daher habe ich mir gedacht, schaffe ich mir so eine Art Baukasten aus Landschaftsbausteinen, aus denen ich dann diese große Landkarte zusammensetze.

Wie groß ist die Textur denn bzw wie groß soll/könnte sie sein? Sieht man die Landkarte immer komplett oder zoomt & scrollt man drüber?
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
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: 04.06.2010, 22:59    Titel: Antworten mit Zitat

Zitat:
Wie groß ist die Textur denn bzw wie groß soll/könnte sie sein? Sieht man die Landkarte immer komplett oder zoomt & scrollt man drüber?


Es geht um die Darstellung eines Globus. Stellt Euch vor man blickt auf einen Globus und behält immer den gleichen Abstand zur Oberfläche der Kugel. Daraus ergibt sich eine gleichbleibende Perspektive.

Man sieht in etwa einen Bereich von der Größe Englands.

Zoomen ist nicht erforderlich, aber der Globus soll sich flüssig drehen können.

Die gewählte Auflösung entspricht in etwa einer Kugeloberfläche von 54.000 mal 27.000 Bildpunkten (wollte man eine Textur nehmen und auf die Kugel ziehen).

Stellt Euch vor, daß auf dem Globus verschiedene Länder und sonstige geografische Elemente zu sehen sein sollen, die im Spiel verändert werden können (Provinzen wechseln den Besitzer, Ländergrenzen verschieben sich, Flüsse können über die Ufer treten oder zufrieren, etc.) Ich habe daher daran gedacht mit einer weiteren Texturstage zu arbeiten: die eine Texturstage soll die Erde im physikalischen Zustand zeigen - die andere soll die politischen Verhältnisse präsentieren.

Aber keine Sorge - ich brauche deshalb nicht zwei Texturen von 54.000 mal 27.000 Bildpunkten - was absolut unpraktikabel wäre. Zwei Drittel der Erde sind ja von Ozeanen bedeckt. Daher konzentriert sich der aufwändige Teil der Programmierung auf die Landflächen. Es müßte also irgendwie machbar sein.

Zur Zeit sieht es so aus, daß ich diese 'riesige' Weltkugel mit einer 256*256 Bildpunkten großen Textur erstmal 'tapeziert' habe, so daß jetzt der Globus komplett mit Ozean bedeckt ist. Dazu habe ich 'Triangelfans' benutzt, die in Abhängigkeit vom Drehungs- und Neigungswinkel des Betrachters zu dem Mittelpunkt der Kugel angezeigt werden. Der Rechenaufwand für die Darstellung der Ozeane ist also minimal.

Nun habe ich für die Darstellung der Landflächen die betreffenden 'Triangelfans' ganz fein aufgeteilt und die Daten in ein dafür vorbereitetes X-File eingespeichert. Das alles steht jetzt erst in der Erprobungsphase. Ich will mit dieser Technik versuchen die physikalische Darstellung der Landmassen (in Grautönen) zu bewerkstelligen, die dann mit einer zweiten Textur für die politische Darstellung farbig eingefärbt werden sollen.

Zuerst hatte ich gedacht, ich könnte irgendwie die Materiallisten der X-Files manipulieren, um so ganz bequem alle möglichen Variationen vornehmen zu können, jedoch habe ich mir falsche Hoffnungen gemacht. Jedenfalls weiß ich nicht, wie ich auf die Materiallisten der X-Files zugreifen kann. Leider - denn aufgrund dessen benötige ich nun eine zweite Texturstage zum Einfärben. Dieses Manko bereitet mir einiges Kopfzerbrechen.

Zitat:
Ich bin mir nicht sicher, ob ich dein Ziel richtig verstanden habe.
Aber versuch dich doch mal an Rendertargets. Man muss nicht die gesamte Textur locken, um Daten von einer Textur in die andere zu kopieren. Du kannst auch schlichtweg die eine Textur auf die andere rendern. Für "gelegentliche" kleine Operationen sicherlich effizienter als das Lock-Unlock-Geraffel.


Danke- die Idee ist nicht schlecht. Mal sehen ob sie irgendwie nutzbringen einsetzen kann!

Die Rendertargets-Technik will ich ohnehin auch noch zum Einsatz bringen - allerdings um Möglichkeiten zu schaffen die diversen Bildelemente mit der Maus anwählen zu können.

Da die physikalische Ansicht der Erde sich nicht großartig verändert, werde ich wohl mit den X-Files die Landflächen hinbekommen. Fraglich ist, ob der Speicherplatz für die immer noch gewaltigen Ausmaße der Texturen für die politische Darstellung ausreicht und ob es nicht irgendwie einfacher zu machen geht.

Ich hoffe ich konnte Euch einen Einblick in die Problematik geben. Bilder sagen oftmals mehr als tausend Worte - das ist natürlich klar.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
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