"Texturen" über Bilder zeichnen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

M0rgenstern

Betreff: "Texturen" über Bilder zeichnen?

BeitragMi, Apr 14, 2010 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.
Ich habe mal ne Frage zu einer bestimmten Sache.
Angenommen, ich habe eine Grafik, die komplett weiß ist und der Rest des Bildes ist Tranzparent. Also, dass im Prinzip nur die Form vorgegeben ist.
Jetzt habe ich andere Grafiken, sagen wir einfach mal in Kreisform, die dann eine bestimmte Farbe haben. Geld/Blau gestreift, Lila/Grün gepunktet etc.
Ist es möglich, diese farbigen Grafiken auf die "Grundfigur" anzupassen?

Da ich keinen Code dazu habe oder so und das nur eine rein theoretische Frage ist, habe ich mir dazu mal ein Beispiel ausgedacht:
Sagen wir ich hab eine "Grundgrafik", die also komplett in weiß ist, in Form einer Autokarosserie.
Nun soll es unterschiedliche "Lackierungen" dazu geben. Diese Lackierungen sind in einer etwa gleichgroßen kreisförmigen oder viereckigen Bilddatei gespeichert.
Ist es nun möglich das Auto mit einer jeweils ausgewählten Lackierung zeichnen zu lassen?

Ich hoffe, dass mein Anliegen verständlich formuliert wurde.

Lg, M0rgenstern

Xeres

Moderator

BeitragMi, Apr 14, 2010 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Komplett weiße Bilder kann man im ganzen mit SetColor einfärben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragMi, Apr 14, 2010 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja klar.
Im ganzen, das war mir klar. Aber wenn diese bestimmte Muster haben sollen.
Wie oben genanntes Beispiel:
Das Auto soll schwarz sein, und einen grünen Streifen haben.
Und die zugehörige Grafik, die eben schwarz mit einem grünen Streifen ist, gibt es, als rundes bzw viereckiges Bild. Und das Auto als komplett weißes.
Das erste BIld soll jetzt in der richtigen Form sozusagen als "Textur" auf diese Grundform gemalt werden.

Lg, M0rgenstern

mpmxyz

BeitragMi, Apr 14, 2010 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das könnte man mit "Multitexturing" machen.
In OpenGL muss man für diesen Effekt den "Modulate"-Modus für das Kombinieren der Texturen nutzen.
Mit GLMax2D ist das ganze aber weniger oder nur eingeschränkt vereinbar.
Man muss nämlich die Texturkoordinaten für jede Textur einzeln setzen und die Bilder müssen gleich groß sein. (Oder funktioniert "glTexCoord" für jede Textur?)
Aber prinzipiell ist es auf alle Fälle möglich.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMi, Apr 14, 2010 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm...
Ich muss ehrlich sagen, dass ich mich mit Multitexture etc noch nicht so auskenne?
Wie müsste ich das ganze denn anlegen?
Also, wie müssten die Grafiken sein und welche Befehle brauche ich im Endeffekt dafür?

Lg, M0rgenstern

mpmxyz

BeitragMi, Apr 14, 2010 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wären OpenGL-Funktionen notwendig:
glActiveTexture, glBindTexture, glTexEnv und ein paar weitere OpenGL-"Allerweltsfunktionen"
Ein Block, der die nötigen Einstellungen macht, würde in etwa so aussehen:
BlitzMax: [AUSKLAPPEN]
glActiveTexture GL_TEXTURE0+1 'Die zweite Textureinheit ist jetzt ausgewählt...
glEnable GL_TEXTURE_2D 'und aktiviert.
glBindTexture GL_TEXTURE_2D, TGLImageFrame(AlphaImage.Frame(frame)).name 'Die Alphatextur wird genutzt.
glTexEnvi GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE 'Die jeweiligen Farbwerte werden jetzt miteinander multipliziert.
glActiveTexture GL_TEXTURE0 'Damit Max2D keinen Unsinn macht, wird wieder die standardmäßige Textureinheit ausgewählt.

So müsste dieser Zeichenmodus wieder deaktiviert werden:
BlitzMax: [AUSKLAPPEN]
glActiveTexture GL_TEXTURE0+1 'Die zweite Textureinheit ist jetzt ausgewählt...
glDisable GL_TEXTURE_2D 'und deaktiviert.
glActiveTexture GL_TEXTURE0 'Damit Max2D keinen Unsinn macht, wird wieder die standardmäßige Textureinheit ausgewählt.

(Der Code ist ungetestet und ihm fehlen Sicherheitsabfragen.)
Dein Bild genau richtig.
Schattierungen in diesem Bild werden übrigens auch von der Lackierung übernommen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMi, Apr 14, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Du, sorry, aber das versteh ich nicht so ganz.
Könntest du mir das vielleicht ein wenig genauer erklären? Wie gesagt, habe damit noch nie gearbeitet.

Lg, M0rgenstern

Xeres

Moderator

BeitragMi, Apr 14, 2010 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
...es läuft darauf hinaus, dass du dir dein eigenes Grafikmodul baust, oder zumindest das Standardmäßige abänderst.
Vielleicht solltest du nach einem fertigen schauen (und kannst im Quellcode freilich etwas ab schauen wenn du es selbst versuchen willst).

Edit: Du kannst ja im brl.mod\glmax2d.mod Ordner den Quellcode anschauen, läuft ja über OpenGL.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragMi, Apr 14, 2010 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das wirklich richtig zu verstehen, muss man OpenGL zumindest ansatzweise kennen.
Der Hauptpunkt beim Multitexturing ist die Tatsache, dass man mehrere Texturen miteinander kombinieren kann. Die dazu notwendigen Einstellungen regelt mein Code.
Aus der Tatsache, dass ich dir zum weiteren Erklären erst einmal OpenGL allgemein erklären müsste, wäre es wahrscheinlich günstiger, wenn du einfach Bilder erstellst und deren Pixmap bearbeitest.
So viele große Autos und häufige Lackierungswechsel wird es ja nicht geben.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMi, Apr 14, 2010 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, eigentlich sollte die "Skin" nur einmal wählbar sein.

Jetzt tötet mich bitte nicht, aber mit Pixmap habe ich auch noch nie gearbeitet.
Hatte noch nie so wirklich was mit Bildbearbeitung zu tun gehabt.

Lg, M0rgenstern

mpmxyz

BeitragMi, Apr 14, 2010 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Kennst du noch Lockbuffer?
In diese Richtung läuft das.
Unterm Strich nimmst du die Alphabits der Alphamap, kombinierst sie mit den Farbbits der Colormap mit "|" und speicherst das Ergebnis im neuen Bild.
An die Pixmap eines Bildes kommst du mit "LockImage".
Einen Pixel kannst du mit "WritePixel" ändern und mit "ReadPixel" auslesen.
Die Informationen und die Hilfe sollten ausreichen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragMi, Apr 14, 2010 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn deine Auto-Grundform immer die Selbe ist, kannst du die Teile als Einzelne Bilder ja übereinander Zeichnen oder zu einem Bild zusammenfügen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Ava

Gast

BeitragDo, Apr 15, 2010 13:22
Antworten mit Zitat
Meinst Du sowas, wie in "Beispiel 2" ?

https://www.blitzforum.de/foru...hp?t=33529

M0rgenstern

BeitragDo, Apr 15, 2010 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, genau sowas meine ich.

Danke Sehr.
Lg, M0rgenstern

M0rgenstern

BeitragFr, Apr 16, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann mir vielleicht jemand erklären, wie ich das mit dem ReadPixel etc machen müsste?
Ich kapier dass nicht so ganz.
Wenn ich ReadPixel mache, dann muss ich ja die x und y koordinaten eingeben.
Das Problem ist halt, dass die "Skin" größer ist als die Grafik auf der gezeichnet werden soll.
Wenn ich die Ergebnisse aus Readpixel in nem Array speichern würde, so wäre das Array größer als die Grundgrafik auf die gezeichnet werden soll.

Ich hab mit sowas ledier nocht nei gearbeitet.

Lg, M0rgenstern
 

Lion

BeitragFr, Apr 16, 2010 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der skin z.b. 200 pixel breit ist, die grafik aber nur 100 pixel breit, dann würd ich einfach ausrechnen (100/200) sodass dann jeder 2. Schritt übersprungen wird.
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

mpmxyz

BeitragFr, Apr 16, 2010 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Pixel 1 zu 1 vermischt werden sollen:
BlitzMax: [AUSKLAPPEN]
For Local destX:Int=0 Until destPixmap.width
For Local destY:Int=0 Until destPixmap.height
Local srcX:Int=destX Mod srcPixmap.width
Local srcY:Int=destY Mod srcPixmap.height
WritePixel destPixmap,destX,destY,ReadPixel(srcPixmap,srcX,srcY) 'Dein Bearbeitungscode kommt hier hin.
Next
Next

Ansonsten wäre das einfachste, eine temporäre Pixmap zu skalieren und dann auszulesen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragFr, Apr 16, 2010 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab das ganze jetzt mal folgendermaßen versucht:

BlitzMax: [AUSKLAPPEN]
Graphics 1024, 768

Local CharPix:Int
Local FlagPix:Int
Local PixMapFlag:TPixmap
Local PixMapChar:TPixmap


PixMapFlag = LockImage(tiFlagUSA, 0, 1, 0)
PixMapChar = LockImage(tiPacChar, 0, 1, 1)

For Local destX:Int = 0 Until PixMapChar.width
For Local destY:Int = 0 Until PixMapChar.height
Local srcX:Int = destX Mod PixMapFlag.width
Local srcY:Int = destY Mod PixMapFlag.height

Local rgbDest:Int = ReadPixel(pixmapchar, destx, desty)
Local aDest:Int = (rgbDest And $FF000000) / $1000000
Local rDest:Int = (rgbDest And $FF0000) / $10000
Local gDest:Int = (rgbDest And $FF00) / $100
Local bDest:Int = rgbDest And $FF

Local rgbSource:Int = ReadPixel(pixmapflag, srcX, srcY)
Local aSrc:Int = (rgbSource And $FF000000) / $1000000
Local rSrc:Int = (rgbSource And $FF0000) / $10000
Local gSrc:Int = (rgbSource And $FF00) / $100
Local bSrc:Int = rgbSource And $FF

If aDest > 20 Then
'rgbSource = aSrc * $1000000 + rSrc * $10000 + gSrc * $100 + bSrc
rgbSource = rgbSource And $FFFFFF
WritePixel PixMapChar, destX, destY, rgbSource 'Dein Bearbeitungscode kommt hier hin.
EndIf
Next
Next

Repeat
Cls

DrawPixmap(PixMapChar, 512, 340)

Flip
Until KeyDown(KEY_ESCAPE)


Aber damit bekomme ich nur einen weißen Kreis.

Den Code von dir habe ich auch getestet, mpmxyz, aber da gab es das Problem, dass im Prinzip nur ein winziger Ausschnitt der Textur genutzt wurde.
Im Grunde soll aber die Textur runterskaliert werden.

Lg, M0rgenstern

d-bug

BeitragSa, Apr 17, 2010 9:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das hier mal flott zu gestalten hab ich mal eben diese Funktion aus den Rippen geschnitten.

Sie benutzt die Transparenz-Komponente der Maske und die Farb-Komponenten der Flagge und
macht daraus eine neue Pixmap. Die Flagge wird auf jeden Fall auf die Größe der Maske verkleinert
oder vergrößert.

Ich weiß, dass man nicht einfach fertige codes hier reinwerfen sollte, aber ihr redet irgendwie alle um den
heißen Brei herum und er verstehts trotzdem nicht so recht. Mal davon ab ist das nicht die schnellste Art
so etwas zu gestalten. Auf keinen Fall ist es Realtime tauglich!

M0rgenstern, tu mir den Gefallen und kopier das nicht einfach nur dumm, sondern lern auch mal was daraus!

BlitzMax: [AUSKLAPPEN]
Function PixmapMask:TPixmap (source:TPixmap, mask:TPixmap)

'source pixmap kopieren und verkleinern
Local s:TPixmap = ResizePixmap(source, mask.width, mask.height)

'neue pixmap erstellen und leeren
Local d:TPixmap = CreatePixmap(mask.width, mask.height, mask.format)
ClearPixels(d, $00000000)

Local argb:Int, dest_argb:Int, a:Int, r:Int, g:Int, b:Int

For Local x:Int = 0 Until mask.width
For Local y:Int = 0 Until mask.height

'masken farbe auslesen
argb = ReadPixel(mask, x, y)

'wir brauchen nur die alpha-komponente der maske
a = (argb Shr 24) & $FF

'es gibt einen farbigen pixel in der maske
If a > 0

'source farbe auslesen und in komponenten aufteilen,
'wir brauchen nur die rot-, gruen- und blau-komponenten
dest_argb = ReadPixel(s, x, y)
r = (dest_argb Shr 16) & $FF
g = (dest_argb Shr 8) & $FF
b = (dest_argb) & $FF

'pixel mit der alpha-komponente der maske und den farb-komponenten der source
'in die neue pixmap schreiben
WritePixel(d, x, y, $00000000 | (a Shl 24) | (r Shl 16) | (g Shl 8) | b)
EndIf
Next
Next
s = Null

Return d
End Function



Kleines Beispiel gibts auch noch dazu:
BlitzMax: [AUSKLAPPEN]
Graphics (640,480,0)

Global mask:TPixmap = LoadPixmap("mask.png")
Global flag:TPixmap = LoadPixmap("flag.png")
Global dest:TPixmap = PixmapMask(flag, mask)

Global render_mask:TImage = LoadImage(mask)
Global render_flag:TImage = LoadImage(flag)
Global render_dest:TImage = LoadImage(dest)

SetClsColor(128,128,128)
SetBlend (ALPHABLEND)
Repeat

DrawImage(render_mask, 0, 0)
DrawImage(render_flag, ImageWidth(render_mask),0)
DrawImage(render_dest, ImageWidth(render_mask) + ImageWidth(render_flag),0)

Flip(1)
Cls()

Until KeyHit(KEY_ESCAPE)



Zusammensetzen wird er es schon noch selbst können... :>


So long!

M0rgenstern

BeitragDi, Apr 20, 2010 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey d-bug.
Vielen Dank.
Weiß nicht, obs hilft, hatte noch keine Zeit mich an dieses Problem zu setzen.
Hänger momentan an der Wegfindung für die Geister.
Ist momentan dann doch wichtiger.
Ich hoffe, dass ich dann morgen oder übermorgen an deinen Code kann.

Vielen Dank nochmal.
Lg, M0rgenstern

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group