texturiertes DrawPoly?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

juse4pro

Betreff: texturiertes DrawPoly?

BeitragDi, Dez 13, 2011 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich würde gern DrawPoly verwenden, nicht nur einfarbig, sondern mit einem TImage oder ähnlichem belegt. Hab die Referenz und Forensuche durchstöbert, aber nix gefunden. Wäre über Hilfe sehr dankbar. Very Happy

-Juse
 

PhillipK

BeitragDi, Dez 13, 2011 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ginge meines wissens nach nur mit OpenGL direkt.
Glücklicherweise bietet blitzmax die möglichkeit, direkt OGL befehle zu verwenden.

ein kleines beispiel, auf die schnelle hingekritzelt:

BlitzMax: [AUSKLAPPEN]
SuperStrict

' Bestimmen, den OpenGL treiber zu nutzen:
SetGraphicsDriver(GLMax2DDriver())

' Graphics fenster initialisieren:
Graphics(800, 600)

' Test bild anlegen (wir brauchen eine Pixmap, um sie einfacher als Textur zu verwenden :) )
Local sourceBild:TPixmap = CreatePixmap(50, 50, 6)

sourceBild.ClearPixels($ff000000) '-> schwarz

For Local x:Int = 0 Until 50 Step 2
For Local y:Int = 0 Until 50 Step 2
sourceBild.WritePixel(x, y, $ffff0000) ' nur zu testzwecken: Rote farbe einfügen.
Next
Next

' Nun zur eigentlichen Textur:
Global testTextur:Int = GLTexFromPixmap(sourceBild) ' -> Anmerkung: Wir erhalten einen integer-index unserer textur!

Global bild:TImage = LoadImage(sourceBild) 'ein kleiner beweis, das normale blitzmax befehle noch funzen =)

' hilfsvar zum umschalten:
Local toggle:Int = 0

While Not KeyHit(KEY_ESCAPE)
Cls

'Umschalten des "Toggles":
If KeyHit(KEY_ENTER) Then toggle = 1 - toggle


If toggle = 0 Then 'Toggle fall 1: Normales DrawImage()
DrawImage(bild, 50, 50)
Else 'Toggle fall 2: OpenGL direkt.


' glEnable(GL_TEXTURE_2D) ' wir müssen einen 'state' aktivieren: GL_TEXTURE_2D - sonst können wir mit OGL befehlen keine Texturen zeichnen!
'Anmerkung: Anscheinend aktiviert der OGL treiber von Blitzmax automatisch diesen state. Ich lasse ihn zur sauberkeit mal drinnen, aber auskommentiert.


glBindTexture(GL_TEXTURE_2D, testTextur) ' hier brauchen wir die textur (der integer-index) -> Textur ist gebunden, wir können sie verwenden.

glBegin(GL_TRIANGLES) ' Triangle (Polygon) zeichnen,

glTexCoord2f(0.0, 0.0) ' U/V koordinaten vom ersten vertex
glVertex2i(50, 50) ' X-Y koordinate auf dem Bildschirm (erster vertex)

glTexCoord2f(1.0, 0.0) ' U/V koordinaten vom zweiten vertex
glVertex2i(50 + sourceBild.width, 50) ' X-Y koordinate auf dem Bildschirm (zweiter vertex)

glTexCoord2f(0.5, 1.0) ' U/V koordinate vom dritten vertexe
glVertex2i(50 + (sourceBild.width / 2), 50 + sourceBild.height) 'X-Y koordinate auf dem Bildschirm (dritter vertex)

glEnd() 'Wichtig! auf jedes glBegin muss ein glEnd folgen, sonst gibts ein unkontrolliertes verhalten mit den grafiken.

'und weil wir sauber sind: State wieder deaktivieren.
' glDisable(GL_TEXTURE_2D)
End If

Flip 1
Wend

'Letzter schritt: Aufräumen. Texturplatz wieder freigeben, nur zur sicherheit :)
glDeleteTextures(1, testTextur) ' 1 heißt 'eine' texutr löschen, ausgehend TEXTUR-INDEX (testTextur also.)


Ich habe auf der Entertaste eine "schalter" umstellen lassen.

Fall 1 zeichnet direkt mit DrawImage, Fall 2 zeichnet mit OGL befehlen.

Ein paar anmerkungen:

Ich lade meine texturen immer über die BMX eigene funktion 'GlTexFromPixmap( pix:TPixmap )'
Die positionen etc für jeden 'eckpunkt' (sprich: Vertex) selbst zu schreiben, kann mühselig sein, aber doch recht einfach autmatisiert werden.
Kommt immer darauf an, was genau du machen möchtest Smile

UV Koordinaten:

Kann recht unverständlich sein, sind aber ganz einfach zu berechnen.
Grundsätzlich, eine u bzw v koordinate liegt typischerweise zwischen 0 und 1. Alles größer als 1 würde die textur (dein bild) wiederholend zeichnen.

Wenn du weißt, von welcher XY koordinate bis welche XY koordinate dein Bild geht, so ist das recht einfach:

U1:float = StartX / Float(BildBreite)
U2:float = EndX / Float(BildBreite)
V1:Float = StartY / Float(BildHöhe)
V2:Float = EndY / Float(BildHöhe)

(ps: Integer-ab/aufrundung können hier eine nervige fehlerquelle sein. Also immer direkt mit Floats arbeiten, wenn möglich.)


-----------------------------

Eine letzte anmerkung:

Eine entsprechende möglichkeit mit DirectX ist mir nicht bekannt, allerdings nutze ich auch ausschließlich OpenGL =)

BladeRunner

Moderator

BeitragDi, Dez 13, 2011 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es auf jeden Fall für beide Treiber, musst mal im englischen Codearchiv danach suchen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

juse4pro

BeitragMi, Dez 14, 2011 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Philip: Danke für den Tipp, aber ich verwende fast ausschließlich DirectX (Frag mich nicht wieso Wink ). Und ja, ich möchte jedes einzelne Vertex selbst positionieren, um meine "hübschen" 2D-Trails zu verwirklichen.

@BladeRunner: Ich werd mich mal nochmal umgucken, jetzt hab ich ja einen Denkansatz, hoffe, dass sich was findet.

Es gibt anscheinend einen undokumentieren Befehl namens RenderPolys. Jedoch sind selbst im Code keinerlei Kommentare... Aber dieser Befehl riecht gut Wink (rein metaphorisch betrachtet).

*EDIT*:
Habe diesen Thread gefunden, welcher anscheinend das liefert, was ich brauche, jedoch scheint der Code alt zu sein, da er einen Fehler wirft: 'islost' gibt es nicht in der Zeile:
BlitzMax: [AUSKLAPPEN]
If Driver.islost Return

Habe sie spontan auskommentiert, jedoch macht die Funktion nun einfach garnichts. Anscheinend schlägt das Umcasten sowohl für DirectX als auch für OpenGL fehl, und keiner der beiden Optionen wird ausgeführt.
Vielleicht weis ja jemand weiter?

mpmxyz

BeitragMi, Dez 14, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist heute dieser Thread aufgefallen:
http://www.blitzmax.com/Commun...opic=58765
Das Modul scheint eine Möglichkeit zum texturierten Zeichnen zu kennen.
MfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragFr, Dez 16, 2011 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin dort der vorletzte Poster Wink Also den habe ich auch schon gefunden, aber der Typ nach mir hat es re-uploaded. Hoffe ich krieg dort was raus.. Razz

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group