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

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

11

25.05.2012, 15:34

Ähm, das weiß ich nicht zu 100%. Aber ich war/bin der Meinung 0 war komplett transparent, 255 das Gegenteil.
Aber ich hab es durch die Masken oben ja im Grunde schon mit beidem probiert. Oder etwa nicht?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

25.05.2012, 15:38

Nein, die Masken sagen darüber nichts aus, weil die nur spezifizieren welche Bits zu welchem Kanal gehören sollen. Die sagen aber nicht mit welchem Wert es initialisiert wird.
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]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

13

25.05.2012, 15:40

Ok, und was wäre deine Idee?
Beim recherchieren habe ich das hier gefunden:

Laut dieser Doku Seite

Zitat

Note: This function and the semantics of SDL alpha blending have changed since version 1.1.4. Up until version 1.1.5, an alpha value of 0 was considered opaque and a value of 255 was considered transparent. This has now been inverted: 0 (SDL_ALPHA_TRANSPARENT) is now considered transparent and 255 (SDL_ALPHA_OPAQUE) is now considered opaque.

Ich gehe mal davon aus, dass das nicht in SDL 2.0 geändert wurde. Das würde meine Annahme dann bestätigen.

Aber was mich etwas stutzig macht, ist ein Kommentar von dieser Seite:

Zitat


if (source surface has alpha channel (that is,format->Amask != 0))
blit using per-pixel alpha, ignoring any colour key


edit:
Ich habe es auch bisher mit diesen beiden Funktionen versucht:
SDL_SetSurfaceAlphaMod
SDL_SetSurfaceColorMod

Dabei konnte ich allerdings mit "AlphaMod" lediglich die "Helligkeit" des Gesamtbildes ändern und mit ColorMod erhielt ich, bei der richtigen Farbe (welche 0, 0, 0, 0 ist), ein komplett schwarzes Bild.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (25.05.2012, 15:47)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

25.05.2012, 15:45

Gute Doku, in der Tat. Egal wie, versuch einfach mal (wie weiß ich wie gesagt leider nicht) den Kanal auf 0xD0 zu bekommen... k.A. ob man da irgendwie direkt reinkopieren oder reinschreiben kann. Dann wirste ja sehen, ob der Hintergrund eher schwarz oder eher transparent ist und kannst Dir den richtigen Wert ableiten. ;)
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]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

15

25.05.2012, 15:54

Da fielen mir, neben den im edit oben genannten beiden Funktionen, noch SDL_ConvertSurface & SDL_SetSurfaceBlendMode ein. Aber ich wüsste nicht wie ich bspw. den AlphaMod, ColorMod und BlendMode kombinieren könnte (mangels Erfahrung) damit das schwarz als Transparente Farbe durchgeht. Ansonsten sehe ich keine Möglichkeit, den Kanal direkt zu manipulieren, außer evtl. mit dem Pixelformat. Aber das hatte ich eig. schon probiert, damit bekam ich genausolch schwarze Surface wenn ich nicht irre.
Es ist wirklich furchtbar, dass man den Alpha Kanal nicht ganz einfach mit einer Funktion/Wert einstellen kann, damit es wirklich transparent ist, und kein schwarz. Dachte eig. dazu diene der Colorkey, aber der wirkt ja allem Anschein hierbei nicht einmal. Sehr merkwürdig das ganze.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

16

30.05.2012, 18:14

Ich hab das nochmal in klein nachgebaut. Solange ich Tiles nehme, deren gesamte Fläche eine Grafik, also mit normalen Pixeln befüllt, ist, klappt alles.
Doch sobald ich Tiles mit hinzunehmen, die an sich Transparenz sein sollen, kommt so etwas dabei heraus: http://s1.directupload.net/file/d/2906/vb58zq3f_png.htm
Also an und für sich müsste das doch mit korrekten Blending weg zu bekommen sein, oder bin ich ganz blöd?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

31.05.2012, 06:52

Jein. Also Du bist sicher nicht ganz blöd ;) Aber mit "korrektem" Blending kannste das nicht so einfach wegbekommen, wenn Dir der Alpha-Kanal fehlt. Du kannst zwar alle anderen möglichen Wege über Source-Colour und so probieren, das wird aber nie das sein, was Du willst.
Wenn das mit dem Alpha nicht so recht über SDL klappen will, dann lock doch einfach das Surface und kopiere die Pixel-Daten manuell inklusive dem Alpha-Kanal. Das sollte doch gehen.
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]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

18

31.05.2012, 09:24

Das Problem ist ja eig. dass ich vorher nur die notwendigen Tiles ausschneide und auf eine neue Surface klebe. Wenn diese Surface fertig ist, also alles Tiles enthält, die benötigt werden, dann packe ich die Pixel dieser Surface in eine GL Textur. Nur scheinbar wird dieses neue Tileset nur mit einer Tiefe von 24 Bit erstellt, statt wie ich eig. anfordere von 32. Das sollte wohl die Erklärung sein, was? Hab leider auch nicht gefunden, wie man das umgeht.

Zu deiner manuellen Pixelkopier Idee: hört sich an sich gut an, aber es besteht ja obiges Problem das ich die benötigten Tiles erst einmal ausschneide und dann der Textur als Pixel übergebe.
Nun hät ich zwei Ideen:
1. Ich schneide keine Tiles aus sondern speichere ihre Pixel aus dem originalen Tileset direkt und gebe das dann der Textur
2. Ich gehe, nachdem ich das neue Tileset (welches ja 24 Bit ist), dieses durch und speichere Tile-Width * Tile-Height Pixel Blöcke und ergänze manuell den Alpha Kanal (oder geht das nicht?), der ja verloren gegangen ist, und übergebe diese Pixel dann der Textur.

Hälst du irgendeine davon für besser/schlechter? Oder ist die Idee murks?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

31.05.2012, 11:08

Bist Du denn sicher, dass das neue Tileset nur 24 Bit sind? Ich denke nämlich, dass einfach das Kopieren mit der SDL-Variante nicht das liefert, was Du willst, weswegen ich beide Surfaces locken und die Daten manuell kopieren würde. Oder du kopierst halt direkt von deiner Quelle in die Ziel-Textur, ohne den Zwischenschritt des Ausschneidens.
Generell ist mir eigentlich nicht so klar, warum Du einzelne Texturen erstellen wollen würdest, im Normalfall will man ja eher das Gegenteil: eine riesige Textur, in welcher alle Tiles drin sind, damit man sich State-Switches spart.
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]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

20

31.05.2012, 11:15

Ich hab auch nur eine Textur.
Ich habe zu Beginn ein riesiges Tileset von 256x2368 Pixeln.
Immens also. Aber ich benötige ja im Normalfall nur einen Bruchteil davon. Also schneide ich mir die, die ich laut der .tmx Datei auch wirklich brauche einmalig aus und blitte sie danach auf einer kleinen Surface. Diese Surface habe ich mir auch danach gespeichert und nachgeguckt, daher weiß ich, dass sie lediglich 24 Bit hat, statt 32.
Von dieser neuen, kleineren Surface hole ich mir dann die Pixel und überführe sie in eine OpenGL Textur.
Nun habe ich eine kleinere Textur die wirklich nur die benötigten Tiles enthält die ich brauche und muss keine riesen Textur immer wieder binden. Oder ist das womöglich eine schlechte Idee?

Jedenfalls dachte ich mir nun, diese neue Surface auszulesen, in Tile-Width x Tile-Height Pixel Blöcke und den Alpha Kanal dann irgendwie manuell zu ergänzen und danach diese Pixel in eine Textur zu überführen.
Blöd, zu umständlich oder gibt es 'ne bessere Lösung?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige