Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.08.2014, 11:24

Bestimmten Bereich einer Textur laden

Guten Tag,
ich vermute ich habe eine relativ einfache Fragen, nur hilft mir weder Google noch MSDN weiter. Ich versuche gerade eine Textur mit C++ und DirectX9 zu laden. Dazu benutze ich die Funktion D3DXCreateTextureFromFileEx. Wenn ich die Doku richtig verstehe gibt es keine Möglichkeit ein Rechteck anzugeben, welches man von der angegebenen Bilddatei als Textur verwenden möchte. Es wird immer das komplette Bild geladen und im Speicher gehalten. Das möchte ich vermeiden, habe aber noch nicht rausgefunden wie ich die Textur "zuschneiden" kann. Ich habe versucht eine DirtyRegion zu definieren und dann mit UpdateTexture nur diese zu kopieren, was aber nicht funktioniert hat. Ich bin mir eigentlich ziemlich sicher, dass jemand von euch weiß wie man sowas macht bzw. ob sowas überhaupt geht.

Viele Grüße

newby

2

26.08.2014, 11:40

Du kannst das manuell machen, indem du via IDirect3DTexture9::LockRect() direkt auf diesen Pixelbereich zugreifst und die Bytes in eine neue Textur schreibst. Bei belieben, die alte dann löschen.

Ob es eine Funktion von Microsoft dafür gibt, weiß ich nicht - das wird google dir sicher auch verraten, wenn du mal nach "D3D9 Crop Texture" suchst oder so.

Wenn du die Textur direkt nach dem Laden beschneiden möchtest - warum machst du das nicht mit einem Bildbearbeitungsprogramm und lädst diese beschnittene dann?

Hinweis: DirectX9 und damit D3DX veraltet immer mehr. Noch mag es funktionieren (ich nehme an, du arbeitest auf Win 7). Sobald du aber auf Windows 8.1 umsteigst, wirst du keine Direct3D9-Debug-Runtime mehr zur Verfügung haben und D3DX nurnoch über das alte DirectX SDK beziehen können. Falls du da also längerfristige Anwendungen schreiben möchtest, wirst du so oder so eines Tages auf DirectX11 umsteigen müssen / wollen. ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

3

26.08.2014, 11:44

Danke für deine Antwort!
Manuelles kopieren der einzelnen Pixel scheint mir etwas umständlich, aber wenn ich keine andere Möglichkeit finde werde ich das wohl machen müssen ;)
Ich möchte diese Funktionalität in einer Methode anbieten, entsprechend benutze ich kein Bildbearbeitungsprogramm ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

26.08.2014, 12:22

Wenn Du kein eigenes Grafik-Programm baust, was Bilder bearbeiten können soll, ist das Vorgehen grob falsch. Vielleicht solltest Du mal beleuchten, wozu Du meinst so eine Funktionalität zu benötigen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

26.08.2014, 15:14

Es geht darum eine Animation aus einem einzigen Bild, welches mehrere kleine Bilder enthält, zu erstellen. Ich weiß, dass es auch möglich ist, einfach das ganze Bild zu laden und beim Anzeigen einfach nur einen kleinen Bereich auszuwählen. Das Kniffelige ist aber, dass ich die 1-Bild-Animation auf einen Fall reduzieren möchte, den ich bereits programmiert habe, nämlich die Animation aus mehreren Bildern. Das erlaubt mir ein einfacheres Interface zu gestalten, wobei ich mir bewusst bin, dass das etwas Performance kostet.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

26.08.2014, 15:58

Oder du gestaltest die Schnittstelle der Animation so, dass sie für einen gegebenen Zeitpunkt das richtige Bild, den richtigen Ausschnitt und die richtige Ausrichtung (sofern erforderlich) liefern kann. So kann es dann im Hintergrund unterschiedliche Implementierungen geben, die auf einem einzigen Bild, einem Bild je Frame oder einer Mischung dieser beiden bestehen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

26.08.2014, 15:59

Wieso willst du jedes Frame deiner Animation in eine separate Textur packen?

8

26.08.2014, 16:26

@dot Ich möchte nicht jeden Frame meiner Animation in eine separate Textur packen, ich möchte nur die Möglichkeit dazu haben ;)
@Sacaldur So ähnlich soll die Schnittstelle auch aussehen. Das Anzeigen des aktuellen Bildes soll unabhängig davon sein, ob die Animation jetzt auch einer oder mehreren Texturen besteht. Die Frage war eher wie ich intern die Animation aus einer Textur verwalte.
Ich habe jetzt den Vorschlag von Smokiie umgesetzt und bin damit auch ganz gut zufrieden ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

26.08.2014, 16:29

wobei ich mir bewusst bin, dass das etwas Performance kostet.
Nicht nur etwas, sondern ganz böse viel. Eigentlich versucht man daher nämlich genau das Gegenteil: So viele Bilder wie möglich (im Idealfall alle) in so wenige Texturen (im Idealfall eine!) zu packen. Alle Frames in einzelne Texturen zu laden ist ganz ganz schlecht. Wirklich. Sieh lieber zu, dass der Fall, dass Du viele Bilder hast, so funktioniert, dass alle diese einzelnen Bilder in eine gemeinsame Textur geworfen werden. Aber nicht andersrum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

26.08.2014, 17:45

Ja, für eine Animation ist eine einzelne Composite-Textur etwas perfomanter (besseres Caching auf GPU, weniger Streamchanges).
Einfach dann je nach Frame die Texturkoordinaten ändern, anstatt sich die Arbeit zu machen, einzelne Bereiche zu streamen.

Ich vermute aber dass du, solltest du nicht grad ein Crysis bauen, diesen Performanceschub vernachlässigen kannst. Ich habe dazu allerdings keine Werte und vermute wie gesagt nur ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige