DrawTexturedPoly? Vertexalpha? Mit Max2D?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Fetze

Betreff: DrawTexturedPoly? Vertexalpha? Mit Max2D?

BeitragMo, März 27, 2006 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Sorry, dass ich schon wieder ein Topic wegen einer Frage meinerseits eröffne, aber ich weis mir mal wieder keinen Rat. Diesmal geht es um das Zeichnen von texturierten Polygonen inklusive Vertexalpha und Vertexcolor wenn möglich mit Max2D. Ansonsten sollte es trotzdem sowohl mit DirectX als auch OpenGL funktionieren.

Ich mache mir gerade Gedanken bzgl. eines Partikelsystems für StarTrade (*schleichwerbung*). Unter anderem würde ich auch gerne "Strahlen" unterstützen, wie man sie an den Antrieben der Raumschiffe auf dem folgenden Bild sehen kann.
user posted image

Ich dachte mir, ich lasse den partikelemitter einfach so funktionieren, wie sonst auch, die Partikel aber anders zeichnen also sonst. Und zwar erstelle ich ein Polygon anhand der Positionen der Partikel, das die Textur des (Antriebs-)Strahls haben wird. Jedem Partikel ordne ich 2 Vertexpunkte zu, die Färbung und Alpha des Partikels übernehmen und lasse das ganze Polygon dann noch zeichnen.
Hier, ich habe zur Vorgehensweise eine kleine Skizze angefertigt:
user posted image

Leider gibt es in Max2D weder einen Befehl namens "DrawTexturedPoly" noch VertexColor oder VertexAlpha und in Sachen DirectX/OpenGL-Programmierung werde ich wohl ohne tagelange Einarbeitungszeit nicht sehr weit kommen.

Nun meine Frage: Gibt es Alternativen, das ganze hinzubekommen, die vielleicht auch allein mit Max2D funktionieren? Wenn nicht: Gibt es bereits Funktionen/Module, mit denen ich das realisieren kann?
Sollte auch das nicht der Fall sein, bitte ich DirectX oder OpenGL-Kenner, mir ein kurzes Codebeispiel zu zeigen und mir zu erkläutern, wie die ganze Sache funktioniert.
 

Dreamora

BeitragMo, März 27, 2006 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Vertexalpha: SetAlpha + Setblend
Vertexcolor: SetColor

Alle danach ausgeführten Befehle nutzen dann die jeweilige Farbe.

Gibt es einen zwingenden Grund, nicht richtige Partikel nutzen zu können, die zeitlich transparenter werden und anderweitig ihre Farbe ändern, anstelle des TriangleStrips?

Mit Max2D befehle geht ein trianglestrip nicht. Indiespath hatte eine modul dafür, aber die gibts net für BM 1.18.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Fetze

BeitragMo, März 27, 2006 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Anstatt eines TriangleStrips doch eher ein Quadstrip, falls es sowas gibt.
Und - auch, wenn es bei einer konkreten Fragestellung nichts zur Sache tut, ob das anders geht oder nicht - ja, es gibt einen zwingenden Grund, nämlich das Aussehen des ganzen und nicht zuletzt die Performance. Es ist ein ziemlicher optischer Unterschied, ob ich nun eine Menge Quads verwende oder einen langkettiges Quadpolygon.

Indiepaths Modul hab ich mittlerweile gefunden, sogar den Thread, in dem er zuvor den für mein Vorhaben relevanten Code gepostet hat. Von daher dürfte die Version keine Rolle spielen.

Jetzt habe ich allerdings eine Frage zum DrawTexturedPoly. Hier erstmal der Code:
Code: [AUSKLAPPEN]

# # # # # # [DIRECTX] # # # # # #
Method DrawTexturedPoly( frame:TDX7ImageFrame,xyuv#[],handlex#,handley#,tx#,ty# )
      If islost Return
      If xyuv.length<6 Or (xyuv.length&1) Return
      Local segs=xyuv.length/2
      Local uv#[] = New Float[segs*10]   '10   
      Local ii:Int = 0
      For Local i=0 Until Len(xyuv) Step 4
         Local x# =  xyuv[i+0]+handlex
         Local y# =  xyuv[i+1]+handley
         uv[ii+0] =  x*ix+y*iy+tx
         uv[ii+1] =  x*jx+y*jy+ty   
         uv[ii+2] =  0  ' *********** THIS IS THE Z-COORDINATE
         uv[ii+3] =  xyuv[i+2]
         uv[ii+4] =  xyuv[i+3]
         ii:+5
      Next
      SetActiveFrame frame
      device.DrawPrimitive(D3DPT_TRIANGLEFAN,D3DFVF_XYZ|D3DFVF_TEX1,uv,segs,0)   
End Method

# # # # # # [OPENGL] # # # # # #
Method DrawTexturedPoly (xy#[],handle_x#,handle_y#,origin_x#,origin_y#)
   If xy.length<6 Or (xy.length&1) Return

   Assert seq=_max2dGfxSeq Else "Image does not exist"
   EnableTex name

   glBegin GL_POLYGON
   For Local i=0 Until Len xy Step 4
      Local x#=xy[i+0]+handle_x
      Local y#=xy[i+1]+handle_y
      Local u#=xy[i+2]
      Local v#=xy[i+3]
      glTexCoord2f u,v
      glVertex2f x*ix+y*iy+origin_x,x*jx+y*jy+origin_y
   Next
   glEnd      
End Method


Da die Vertices - zumindest im DirectX-Beispiel - offenbar nicht einzeln gesetzt werden, wird es schwierig, das ganze mit SetAlpha und SetColor zu lösen. Und abgesehen davon... kann ich das ausserhalb von Max2D überhaupt? Was nun?
 

Dreamora

BeitragMo, März 27, 2006 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
QuadStrips gibts leider nicht. Es gibt genau genommen garkeine Quads in 3D sondern nur Triangles (auch wenn viele Modeller mit Quads arbeiten)

Ohne in Max2D reinzuhacken kannst du so etwas leider nicht machen.
Einzelne Vertices setzen ist als solches nicht wirklich von nutzen, aber du kannst jedem einzelnen eine eigene Farbe verpassen. Dazu müsstest du jedoch die aktuelle Implementation ein wenig erweitern für deinen eigenen Zweck. D3DFVF_DIFFUSE wäre die Flag die du brauchst um VertexFarben in das Vertexformat zu packen. Die Farbe wird dabei als eine Int angenommen.

Habe auf die schnelle ein Delpi Beispiel gefunden (denke einfacher verständlich als C++), welches die Farbe setzt.
http://www.ieap.uni-kiel.de/su...tion2.html
http://www.ieap.uni-kiel.de/su...tion3.html

Vielleicht hilft dir das ja.
BM selbst besitzt die nötigen Konstanten etc alle schon (pub.directx - d3d.bmx)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Fetze

BeitragDi, März 28, 2006 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, danke, ich denke, das wird mir helfen. Kann mir jetzt noch jemand erklären, wie das mit OpenGL funktioniert? Gibt's da vielleicht auch ein Tutorial zu?

Jan_

Ehemaliger Admin

BeitragDi, März 28, 2006 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
In OpenGl, gibt es Quads,

http://nehe.gamedev.net/

kleine werbung für meins:
http://jankuhnert.blogspot.com...layer.html

Achtung, meins ist ohne Stripe Quad.

zu bemerken ist, das die Quads nur 2 Dreiecke sind.
WEnn du deine Routine sehr optimiert hast, bist du mit 3ecken bei derGleichen Polyzahl shcneller als Quad, und falls du dieses Jahrtausend fertigwerden willst, nimm einfach quads.
between angels and insects

Fetze

BeitragDi, März 28, 2006 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, danke. Ich denke, jetzt hab ich alles, was ic hbrauche, um mir selbst eine DrawTexturedPoly-Function zu schreiben Smile

SonGoku

BeitragDi, März 28, 2006 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, das ich jetzt einfach so reinplatze...
Ich wollt mal nur sagen, dass du dir mal vielleicht "Space Fight" anschauen solltest (siehe offizielle BM Seite).
Das Spiel ist jetzt OpenSource und beinhaltet genau das, was du suchst (siehe Screens).

Naja, ich hoffe, dass ich dir damit weiterhelfen konnte.


MfG
Goku
Projekt "BlitzPong" --> 100%

BRL Account mit Blitz3D und BlitzMax für nur 67€!!!
Das Buch "Spiele programmieren mit Blitz Basic" für nur 15€!!!

Fetze

BeitragMi, März 29, 2006 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich mich nicht vergucke, bestehen die Antriebe in SpaceFight aus sehr vielen einzelpartikeln und nicht aus je einem Partikelstrang. Trotzdem danke für den Tip Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group