Frage zur Vertex und Triangle Verbindung und Multitexturing

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

BB_Freak

Betreff: Frage zur Vertex und Triangle Verbindung und Multitexturing

BeitragDi, Aug 06, 2013 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi meine erste Frage bezieht sich auf ein bestimmtes Vertex Triangle Schema.

Und zwar zerbreche ich mir gerade den Kopf darüber wie ich diese Art von Vertex und Triangle Verbindung in einem Algo verschmelze so das ich einfach nur die anzahl der Vertex von X und Y angeben muss und dann eine art Gitter erstellt wird.

Die Vertex müssten so wie in meiner Zeichnung verteilt werden und auch in dieser Reihenfolge da ich
sie später in einem anderen Algo dadurch exakt ansprechen kann.

user posted image

Die Vertex Dot's zu verteilen ist ja mit 2 For Schleifen schnell erledigt.
Nur wie verbinde ich dann die Einzelnen Punkte ? Der Algo dahinter ist bestimmt so leicht das ich mal wieder
nicht drauf komme *gggrrrr* Rolling Eyes



Zur zweiten Frage ich wollte 2 Texturen miteinander mixen. Die eine Ist zb eine Mauer Texture und die 2. zb ein Text wie kann ich die beiden übereinander setzen so das am ende nur der Text mit der Mauer Texture herraus kommt und drumherum alles nicht sichbar bzw Transparent?

Wie hier:

user posted image


Danke euch schonmal im voraus Smile
 

Kruemelator

BeitragDi, Aug 06, 2013 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstmal das mit der Fläche:
Die Fläche steht einem gegenüber und ist immer, egal wieviele Teile es sind, zwei breite und zwei hoch (wie ein platt gedrückter Würfel von CreateCube())
Verändern kann man das mit ScaleMesh,PositionMesh,RotateMesh.
Wichtig: br=4 bedeuten 4 Triangle breite, aber es sind 5 Vertices enthalten pro Zeile.
BlitzBasic: [AUSKLAPPEN]
flaeche = CreateMesh()
sur = CreateSurface(flaeche)
br = 5
ho = 5
For y=0 To ho
For x=0 To br
AddVertex(sur,-1+x/Float(br/2),-1+y/Float(ho/2),0, x/Float(br),-y/Float(ho))
Next
Next
For y=0 To ho-1
For x=0 To br-1
p1 = y*(br+1)+x
p2 = p1+1
p3 = p1+(br+1)
p4 = p1+(br+1)+1
AddTriangle(sur,p1,p3,p2)
AddTriangle(sur,p2,p3,p4)
Next
Next

Edit: Texture ist auf dem Kopf(Vorzeichen wurde geändert)

Das mit der Textur ist auch nicht schwer schreibe ich gleich.
 

Kruemelator

BeitragDi, Aug 06, 2013 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier die Lösung zu deinem Textur Problem:
BlitzBasic: [AUSKLAPPEN]
textx = CreateTexture(256,256,4);Flag(3.Paramater), 4 muss enthalten sein
SetBuffer BackBuffer()
Color 255,255,255
Text 10,10,"Hallo"
CopyRect 0,0,256,256,0,0,BackBuffer(),TextureBuffer(textx)
;Text in Texturebuffer mit Flag 4 nicht moeglich deswegen so (vom Bildschirm in die Texture kopiert, geht auch aus anderer Texture oder Image)

;Hier wird Transparenz erzeugt
LockBuffer(TextureBuffer(textx))
For yi=0 To 256-1
For xi=0 To 256-1
rgb = ReadPixelFast(xi,yi,TextureBuffer(textx))
If rgb = $FFFFFF Then;Pixel ist weiß
rgb = $FFFFFFFF;Pixel soll weiß und sichtbar sein
WritePixelFast(xi,yi,rgb,TextureBuffer(textx))
Else
rgb = $FFFFFF;nur weiß aber Alphawert ist 0.
;WICHTIG!!!!! wenn die nicht sichtbaren Pixel nicht weiß sind,
;färbt sich der Rand entsprechend: Weiß = klarer Rand, Rot = roter Rand usw.
WritePixelFast(xi,yi,rgb,TextureBuffer(textx))
EndIf
Next
Next
UnlockBuffer(TextureBuffer(textx))

;hier gemischt, Text-Textur unter der Mauer-Textur
tex2 = LoadTexture();hier deine Mauer Textur
EntityTexture flaeche,textx,0,0
EntityTexture flaeche,tex2,0,1
 

BB_Freak

BeitragMi, Aug 07, 2013 8:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Big Thx Kruemelator Smile

Hast mir damit sehr geholfen!

Da ich ja mit Minib3d arbeite klappte es mit deinem Flaechenalgo irgentwie nicht.
Ich habe darauf hin durch deine Inspiration dann einen eigenen Algo geschrieben.

Code: [AUSKLAPPEN]
Dim flaeche As Any Ptr = CreateMesh()
Dim sur As Any Ptr = CreateSurface(flaeche)

Dim br As integer = 5
Dim ho As Integer = 5

Dim vertex_index_array(br,ho) As Integer



For y As Integer = 0 To ho
   For x As Integer = 0 To br
   vertex_index_array(x, y) = AddVertex(sur,x,y,0)
   Next
Next


For y As Integer = 0 To ho - 1
   For x As Integer = 0 To br - 1
      AddTriangle(sur,vertex_index_array(x, y),vertex_index_array(x, y + 1),vertex_index_array(x + 1, y))
      AddTriangle(sur,vertex_index_array(x, y + 1),vertex_index_array(x + 1, y + 1),vertex_index_array(x + 1, y))
   Next
Next


'entitytexture flaeche,texture2

updatenormals (flaeche)


Das klappt auch alles ganz gut.
Nur jetzt stehe ich vor den Problem mit den VertexTexCoords.

Muss ich jetzt jedem Vertex Texturen Koordinaten verpassen?
Oder nur Pro Quat und das Mittig?

Stehe im moment voll auf den Schlauch und komme nicht weiter Rolling Eyes

Jan_

Ehemaliger Admin

BeitragMi, Aug 07, 2013 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Die koords sind ganz einfach.

x=x
y=y
also, einfach x und y mit angeben und dann passt das
between angels and insects
 

Kruemelator

BeitragMi, Aug 07, 2013 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Texturkoordinaten sind immer in den Vertex gespeichert, Triangle oder Quads können keine Informationen enthalten, außer welche Vertices benutzt werden.
Wenn jedes Quad/Triangle eigene Texturkoordinaten unabhängig vom Nachbar haben soll, dann müssen sie ihre eigene Vertices haben.
Texturkoordinaten gehen von 0 bis 1, von 0 bis 2 würde die Textur 2mal darstellen, entsprechend würde von 0 bis 0.1 nur ein 10tel gezeigt.
 

BB_Freak

BeitragMi, Aug 07, 2013 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch für die Tips , werde mir das nach Feierabend mal anschauen.
 

BB_Freak

BeitragDo, Aug 08, 2013 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi hätte da noch eine Frage.

Wenn ich jetzt sagen wir mal eine meshplane von 2*2 habe.
Dort jetzt eine Text texture platzieren würde die aber einen langen Text enthält der aber nicht komplett sichtbar ist und von rechts nach links geschoben werden soll wie eine Art Textscroller wäre dies machbar?

Also ohne den Texture inhalt neu mit Pixeln zu füllen und ohne einen erneuten draw string Befehl nur mit Positiontexture?

Tennisball

BeitragFr, Aug 09, 2013 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist möglich.

Gib einfach für die UV-Koordinaten deiner Vertices nicht 0.0 und 1.0 (für je U und V) an, sondern z.B. 0.0 und 0.5. Das würde nun bewirken dass du nur die Hälfte der Textur siehst. Danach verschiebst du wie du schon vermutest hast mit PositionTexture die Textur weiter.

Gruß,
Tennisball
 

BB_Freak

BeitragSa, Aug 10, 2013 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Krieg ich es hin das ein langer Text als texture über das mesh in scroller Form darüber läuft. Weil so ne 256 Texture bietet ja wenig Zeilen Raum.
 

Kruemelator

BeitragSa, Aug 10, 2013 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Entweder eine andere Texturgröße, es müssten auch Texturen wie 1024*256 gehen, oder aber den Text jeden Durchgang in die Textur schreiben, also die Textur jedesmal erneuern. Die Befehle die man dazu benutzen kann sind:
BlitzBasic: [AUSKLAPPEN]
SetBuffer TextureBuffer()
CopyRect()

Tennisball

BeitragSa, Aug 10, 2013 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Von letzterem würde ich abraten, Kruemelator.
Stattdessen versuche ich nochmal die andere Idee genauer zu erklären.

Nehmen wir mal an du hast ein quadratisches Mesh und eine Textur von 1024*256px (Verhältnis 4:1)
Du müsstest nun die UV-Koordinaten wie folgt setzen, damit immer ein quadratischer Ausschnitt der Textur auf dem Mesh angezeigt wird:
user posted image
U ist bei den linken Vertices 0 und bei den rechten Vertices 0.25 (Ein Viertel, damit's quadratisch wird.) V ist bei den oberen Vertices 0 und bei den unteren Vertices 1.

Damit dein Text jetzt scrollt müsstest du mit PositionTexture die Textur verschieben, damit du einen anderen Ausschnitt der Textur auf deinem Mesh siehst.

Ich hoffe, das hilft.

Gruß,
Tennisball
 

Kruemelator

BeitragSa, Aug 10, 2013 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Der erste Ansatz ist wahrscheinlich hier die bessere Entscheidung. Man muss aber beachten das die Textur 4mal soviel Speicher benötigt und sollte die Breite immer noch nicht reichen müsste man 2048*256 nehmen das wäre sogar 8mal soviel!
Sich stetig verändernde Texturen sind heutzutage in Spielen nix seltendes (Shadowmap,Reflection).
Es ist die Entscheidung ob man Rechenleistung oder Speicherplatz abgibt/nutzt.

Tennisball

BeitragSa, Aug 10, 2013 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Hab das mal ausgetestet. Ausgehend von einer FPS von 60.
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800, 600

Tex = CreateTexture( 256, 256 )

time = MilliSecs()

bla = LoadFont( "Arial", 200 )
SetFont( bla )

For i = 0 To 59
SetBuffer( TextureBuffer( tex ) )
Text( i, 0, "texttext" )
SetBuffer( BackBuffer() )
Next

Cls

Print MilliSecs() - time

Das benötigt bei mir (auf einer GTX560Ti und i5-2500) ~125ms. Und es wurde nur die Textur (60 mal) geändert. Das finde ich jetzt etwas übertrieben.

Wohingegen der Speicherverbrauch bei einer Textur von 256*256px bei 256*256*4 Byte = 262144 Byte = ~262KB wäre. Der Speicherverbrauch einer 2048*256px-Textur wäre dementsprechend 2097152 Byte = ~2,1MB. So viel Speicher sollten halbwegs moderne Rechner noch mitbringen. Auch wenn's nur für eine Textur ist.

Edit: Alternativ könntest du deiner Textur noch Frames geben. Das würde aber höchstwahrscheinlich noch viel mehr Speicher verbrauchen.

Gruß,
Tennisball
 

Kruemelator

BeitragSa, Aug 10, 2013 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss ja auch ein wenig anpassen:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800, 600, 32, 2
Tex = CreateTexture( 256, 256, 256 )

bla = LoadFont( "Arial", 200 )
SetFont( bla )

time = MilliSecs()
For i = 0 To 599
SetBuffer( TextureBuffer( tex ) )
Text( 0, 0, "texttext" )
SetBuffer( BackBuffer() )
Next
Print MilliSecs() - time
WaitKey()

Bei mir um 15 Millisekunden, für 600 Updates was bei 60 Fps 10 Sekunden wären.
Wichtig ist Textur nur im Vram.

Tennisball

BeitragSa, Aug 10, 2013 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das stimmt natürlich, habe ich übersehen.
 

BB_Freak

BeitragMo, Aug 12, 2013 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
So das mit dem Scrolling der Texture habe ich hinbekommen.

So nun mein neues Problem Sad

Wenn ich ein Quat erstelle mit den Viertel Texture Koordinaten

Code: [AUSKLAPPEN]

v(0) = addvertex(quat_sur,0,0,0)
v(1) = addvertex(quat_sur,0,1,0)
v(2) = addvertex(quat_sur,1,1,0)
v(3) = addvertex(quat_sur,1,0,0)

VertexTexCoords (quat_sur,v(0),0,0)
VertexTexCoords (quat_sur,v(1),0,1)
VertexTexCoords (quat_sur,v(2),0.25,1)
VertexTexCoords (quat_sur,v(3),0.25,0)


Ist das ja kein Problem.

Doch wenn ich ja meine Plane erstelle mit ca 11 Quats in X-Richtung und 11 in Y-Richtung

Kleiner Code ausschnitt:

Code: [AUSKLAPPEN]

For x As Integer = 0 To br   
   For y As Integer = 0 To ho
      vertex_array_buffer(x, y) = addvertex(plane_surf, x, y, 0)
      VertexTexCoords(plane_surf, vertex_array_buffer(x, y), x, y)
   Next
Next


Müsste ich doch irgendeinen Algo schreiben der die TextureCoords so aufteilt das am ende die 0.25 rauskommt bei der UV.

Sonnst Splittet er die komplette Plane ja nicht als eine Viertel Texture auf Sad

Lobby

BeitragMo, Aug 12, 2013 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du vielleicht sowas?
BlitzBasic: [AUSKLAPPEN]
For x As Integer = 0 To br    
For y As Integer = 0 To ho
vertex_array_buffer(x, y) = AddVertex(plane_surf, x, y, 0)
VertexTexCoords(plane_surf, vertex_array_buffer(x, y), 0.25 * x / br, 1.0 * y / ho)
Next
Next


Der Vertex (br, ho) soll als UV-Koordinaten ja (0.25, 1.0) haben, und da das Ganze linear ist ergibt sich die obige Formel (denn etwa x / br ist ja genau bei x = br 1 und bei br / 2 genau halb so groß, also 0.5).
 

BB_Freak

BeitragMo, Aug 12, 2013 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt klappt durch eure Hilfe alles so wie ich es mir vorgestellt habe.
Big thx euch allen! Cool

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group