SingleSurface Obtimierung ?
Übersicht

![]() |
ToeBBetreff: SingleSurface Obtimierung ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mir mal ne einfache und kleine Singlesurface-Paticleengine für mein Spiel geschrieben. Aber es fängt immer noch ab 1000 objecten an zu ruckeln. Habt ihr irgentwelche ideen, mit denen ich eine Speedobtimierung erreichen kann ? Ich hab echt kp... Also was man z.b weglassen kann oder hinzufügen, damits net ruckelt... Oder überflüssiges rausschmeißen...
Bitte .. ^^ ! mfg ToeB Code: [AUSKLAPPEN] Dim PATDATA#(0,0,16)
Global TURNPIVOT = 0 Global PCAMERA,PATANZ,SURFANZ Global PR,PG,PB Global PMESH = 0 Global GRAV_ON = 0,GRAV# = 0 Global UP_MS = 0 Function PAT_InitSystem(CAMERA_HANDLE,GON=1,GR#=-0.01,PATICLES=500,SURFACES=5) PATANZ = PATICLES SURFANZ =SURFACES PCAMERA =CAMERA_HANDLE GRAV_ON = GON GRAV# = GR# UP_MS = MilliSecs() TURNPIVOT = CreatePivot() PMESH = CreateMesh() EntityBlend(PMESH,3) EntityFX(PMESH,18) Dim PATDATA#(SURFANZ,PATANZ,16) End Function Function PAT_OpenSurface(TEXTURE=0,PR=255,PG=255,PB=255) PP = 0 For i = 1 To SURFANZ If PATDATA(i,0,0) = 0 Then PP = i:Exit Next If PP = 0 Return PATDATA(PP,0,0) = CreateSurface(PMESH) BRUSH = CreateBrush(PR,PG,PB) If TEXTURE <> 0 BrushTexture(BRUSH,TEXTURE) PaintSurface(PATDATA(PP,0,0),BRUSH) Return PP End Function Function PAT_AddPaticle(INDEX,xx#,yy#,zz#,SCALE#=1,al#=1,als#=-0.05,xs#=0,ys#=0.1,zs#=0,wikls#=0) PA = 0 For i = 1 To PATANZ If PATDATA(INDEX,i,1) = 0 PA = i:Exit Next If PA = 0 PA = PATANZ For i = 1 To PATANZ-1 For d = 1 To 16 PATDATA(INDEX,i,d) = PATDATA(INDEX,i+1,d) Next Next PAT_DeletePaticle(INDEX,PA) EndIf If PATDATA(INDEX,0,0) = 0 Return SU = PATDATA(INDEX,0,0) sc# = 0.1*SCALE# v1 = AddVertex(SU,xx#-sc,yy#+sc,zz#) : VertexTexCoords SU,v1,0,0 v2 = AddVertex(SU,xx#+sc,yy#+sc,zz#) : VertexTexCoords SU,v2,1,0 v3 = AddVertex(SU,xx#-sc,yy#-sc,zz#) : VertexTexCoords SU,v3,0,1 v4 = AddVertex(SU,xx#+sc,yy#-sc,zz#) : VertexTexCoords SU,v4,1,1 TRI1 = AddTriangle(SU,v1,v2,v3) TRI2 = AddTriangle(SU,v3,v2,v4) PATDATA(INDEX,PA,01) = 1 PATDATA(INDEX,PA,02) = v1 PATDATA(INDEX,PA,03) = v2 PATDATA(INDEX,PA,04) = v3 PATDATA(INDEX,PA,05) = v4 PATDATA(INDEX,PA,06) = xx PATDATA(INDEX,PA,07) = yy PATDATA(INDEX,PA,08) = zz PATDATA(INDEX,PA,09) = xs PATDATA(INDEX,PA,10) = ys PATDATA(INDEX,PA,11) = zs PATDATA(INDEX,PA,12) = al PATDATA(INDEX,PA,13) = als# PATDATA(INDEX,PA,14) = sc PATDATA(INDEX,PA,15) = 0 PATDATA(INDEX,PA,16) = wikls Return PA End Function Function PAT_Update() If UP_MS <= MilliSecs()-25 Then For i = 1 To SURFANZ If PATDATA(i,0,0) <> 0 SU = PATDATA(i,0,0) For p = 1 To PATANZ If PATDATA(i,p,1) = 1 v1 = PATDATA(i,p,02) v2 = PATDATA(i,p,03) v3 = PATDATA(i,p,04) v4 = PATDATA(i,p,05) xx#= PATDATA(i,p,06) yy#= PATDATA(i,p,07) zz#= PATDATA(i,p,08) sc#= PATDATA(i,p,14) al#= PATDATA(i,p,12) w# = PATDATA(i,p,15) VertexCoords(SU,v1,xx-1*sc,yy+1*sc,zz) : VertexColor(SU,v1,255,255,255,al#) VertexCoords(SU,v2,xx+1*sc,yy+1*sc,zz) : VertexColor(SU,v2,255,255,255,al#) VertexCoords(SU,v3,xx-1*sc,yy-1*sc,zz) : VertexColor(SU,v3,255,255,255,al#) VertexCoords(SU,v4,xx+1*sc,yy-1*sc,zz) : VertexColor(SU,v4,255,255,255,al#) EndIf Next EndIf Next ;UpdateNormals(PMESH) UP_MS = MilliSecs() EndIf For i = 1 To SURFANZ If PATDATA(i,0,0) <> 0 SU = PATDATA(i,0,0) For p = 1 To PATANZ If PATDATA(i,p,1) = 1 PATDATA(i,p,6) = PATDATA(i,p,6) + PATDATA(i,p,9) PATDATA(i,p,7) = PATDATA(i,p,7) + PATDATA(i,p,10) PATDATA(i,p,8) = PATDATA(i,p,8) + PATDATA(i,p,11) PATDATA(i,p,12)= PATDATA(i,p,12)- PATDATA(i,p,13) PATDATA(i,p,15)= PATDATA(i,p,15) + PATDATA(i,p,16) If PATDATA(i,p,15) < 0 Then PATDATA(i,p,15) = 360 If PATDATA(i,p,15) > 360 Then PATDATA(i,p,15) = 0 If PATDATA(i,p,12) <= 0 Then PAT_DeletePaticle(i,p) EndIf Next EndIf Next End Function Function PAT_DeletePaticle(INDEX,PAT) PATDATA(INDEX,PAT,1) = 0 SU = PATDATA(INDEX,0,0) ClearSurface(SU) For i = 1 To PATANZ If PATDATA(INDEX,i,1) = 1 sc# = PATDATA(INDEX,i,14) xx#= PATDATA(INDEX,i,06) yy#= PATDATA(INDEX,i,07) zz#= PATDATA(INDEX,i,08) al#= PATDATA(INDEX,i,12) v1 = AddVertex(SU,xx#-sc,yy#+sc,zz#) : VertexTexCoords SU,v1,0,0 : VertexColor(SU,v1,255,255,255,al#) v2 = AddVertex(SU,xx#+sc,yy#+sc,zz#) : VertexTexCoords SU,v2,1,0 : VertexColor(SU,v2,255,255,255,al#) v3 = AddVertex(SU,xx#-sc,yy#-sc,zz#) : VertexTexCoords SU,v3,0,1 : VertexColor(SU,v3,255,255,255,al#) v4 = AddVertex(SU,xx#+sc,yy#-sc,zz#) : VertexTexCoords SU,v4,1,1 : VertexColor(SU,v4,255,255,255,al#) TRI1 = AddTriangle(SU,v1,v2,v3) TRI2 = AddTriangle(SU,v3,v2,v4) PATDATA(INDEX,i,02) = v1 PATDATA(INDEX,i,03) = v2 PATDATA(INDEX,i,04) = v3 PATDATA(INDEX,i,05) = v4 EndIf Next End Function Function PAT_Paticles(INDEX=-1) If INDEX = -1 PA = 0 For j = 1 To SURFANZ For i = 1 To PATANZ If PATDATA(j,i,1) = 1 PA = PA + 1 Next Next Else PA = 0 For i = 1 To PATANZ If PATDATA(INDEX,i,1) = 1 PA = PA + 1 Next EndIf Return PA End Function |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also erstmal heisst es Particle... ![]() Ansonsten würde ich darauf tippen, dass zuviele Funktionsaufrufe bzw. das ewige aufrufen von PATDATA der Flaschenhals sein könnte. Denn 1000 Quads sollten locker drin sein, wenn diese nicht jeweils 1/4 oder mehr vom Bildschirm einnehmen. Sonst noch ein guter Tipp ist der Profiler von BasicProgger. Dieser zeigt dir genau die Bearbeitungszeiten einzelner Funktionen an. https://www.blitzforum.de/foru...highlight= |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da hats unzählige Performance Killer drin:
1. Warum loopst du über das ganze zeug beim einfügen? Der rest kann dir schnurz sein, fügs einfach ein. wenn du loopst wirst du bei 1000 Partikeln bei 50 adds ma easy 800'000 loopdurchläufe durchpumpen 2. Deine Update Funktion loopt auch erheblich mehr als nötig weil du die Loops für eingebildete Optimierungen gesplittet hast. 3. Fehlt dir selbst die grobe Idee wie ein SingleSurface System läuft. Die ganze Zeit alles löschen, neu einfügen und so? Dann kannst du Sprites nehmen, wird schneller sein. Ich habe grössere Zweifel das du auch nur einen einzigen Thread zum Thema SingleSurface gelesen hast geschweige denn Single Surface Partikelsystem |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
1.: Ich versteh in opunkten 1+2 keine wort ![]() 2.: was mach ich denn falsch ? Warum ist das kein Single Surface ? 3.: @hectic : Das Prog krig ich nicht runnergeladen. Was schlägst du vor in bezug auf PATDATA ? mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ehrlich gesagt, ist es für mich nicht ganz einfach zu verstehen, wie deine Funktionen aufeinander abgestimmt sind. Zum Beispiel die unterschiedlichen Surfaces deuten wohl auf unterschiedliche Texturen hin. Wie kann dann aber die PATANZ -Variable global sein? Somit müsste ja nach meiner Überlegung die Partikelanzahl auf alle Texturen (Surfaces) immer gleich sein. Also wenn 100 Rauchpartikel angezeigt werden sollen, werden auch 100 Feuserpartikel etc. angezeigt.
Das ganze ist für mich verwirrend, und weil kein startfähiger Code gepostet wurde auch schwer nachzuvollziehen. Man sollte generell auf globale Variablen verzichten. Außer wenn diese unausweichlich sind, oder eben ''auch als solche gebraucht werden''. Ich zu meinem Teil würde ein Partikelsystem generell auf Types aufbauen. Gerade Types passen für ein Partikelsystem wie die Faust aufs Auge. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ToeB hat Folgendes geschrieben: 1.: Ich versteh in opunkten 1+2 keine wort
![]() 2.: was mach ich denn falsch ? Warum ist das kein Single Surface ? 3.: @hectic : Das Prog krig ich nicht runnergeladen. Was schlägst du vor in bezug auf PATDATA ? mfg ToeB 1. Das ist das Problem. Du hast keinen Plan wie sowas funktioniert. Lies bitte die Artikel dazu hier und im englischen Board. Das Thema wurde, inkl Partikel Systeme, schon mehrfach detailiert besprochen, da ist solch eine Anti-Implementation eigentlich nur noch peinlich ... 2. Du hast mehr als eine Surface. Du löscht und füllst sie die ganze Zeit wieder, du kümmerst dich nen scheiss drum ob ein partikel überhaupt im sichtbereich ist (denn das gesamte mesh wird zum rendering geschickt wenn auch nur 1 partikel im sichtbereich ist!). Der haupt performancekiller ist das du die ganze zeit löscht und wieder einfügst. denn damit kannst du auf ner normalen grafikkarte mit 6000 triangles eigentlich das ganze schon auf 20-40 FPS runterkloppen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja sry... ![]() Kennt denn jemand ein gutes Deutsches Tutorial was auch gut zu verstehn ist ? Ich hab jetzt 30 min klang geguckt, und keins gefunden... mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein eigentlich nicht.
Grafikprogrammierung ist halt ein internationales Thema. Von daher kannst du wählen zwischen: Ich lerne englisch oder ich suche mir ein Hobby was nicht voraussetzt das ich englisch kann wie 3D Spieleentwicklung. das dafür notwendige englisch ist nicht sonderlich kompliziert. Voraussetzung ist halt, das du eine Ahnung vom 3D Vokabular hast. Single Surface Programmierung ist kein Anfängerthema sondern Fortgeschrittenenthema also darf / muss man da auch die notwendige Voraussetzungen verlangen können. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
mhm... ja okay...
Nochmal ne frage : Ich hab mich jetzt nochmals rangesetzt um das ein bissel zu obtimieren. Hab jetzt was kmplett neues gecodet. : Code: [AUSKLAPPEN] Graphics3D 800,600,16,2
SetBuffer BackBuffer() Global CAM = CreateCamera() Global M = CreateMesh(),SU = CreateSurface(M) EntityFX M,18 Global AK_PAT = 0 Global AK_MS = MilliSecs() Dim PAT#(10000,13) Global Timer = CreateTimer(75) Repeat MS=MilliSecs():FPSz=FPSz+1 If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0 If KeyDown(57) Then For i = 1 To 10 CreatePAT(0,0,5,Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rand(255),Rand(255),Rand(255)) Next EndIf TurnEntity CAM,+MouseYSpeed()/3,0,0,0 TurnEntity CAM,0,-MouseXSpeed()/3,0,1 If KeyDown(17) Then MoveEntity(CAM,0,0,0.1) MoveMouse 400,300 UpdatePAT() WaitTimer(TIMER) UpdateWorld() RenderWorld() Text 1,1,"FPS: "+FPS+" PARTICLES: "+AK_PAT Flip Cls Until KeyHit(1) End Function CreatePat(xx#,yy#,zz#,sx#,sy#,sz#,R,G,B,grenz=-1) If grenz = -1 grenz = 100+Rand(-10,10) Local RGB = 1*$1000000+R*$10000+G*$100+B Local SC# = 0.5 PAT(AK_PAT,0 ) = 1 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) PAT(AK_PAT,5 ) = xx PAT(AK_PAT,6 ) = yy PAT(AK_PAT,7 ) = zz PAT(AK_PAT,8 ) = sx PAT(AK_PAT,9 ) = sy PAT(AK_PAT,10) = sz PAT(AK_PAT,11) = RGB PAT(AK_PAT,12) = 0 PAT(AK_PAT,13) = grenz AddTriangle(SU,PAT(AK_PAT,1),PAT(AK_PAT,2),PAT(AK_PAT,3)) AddTriangle(SU,PAT(AK_PAT,3),PAT(AK_PAT,2),PAT(AK_PAT,4)) AK_PAT = AK_PAT + 1 End Function Function UpdatePAT() If AK_MS <= MilliSecs() - 30 ;30ms Update For i = 0 To AK_PAT If PAT(i,0) = 1 v1 = PAT(i,1) v2 = PAT(i,2) v3 = PAT(i,3) v4 = PAT(i,4) xx# = PAT(i,5) yy# = PAT(i,6) zz# = PAT(i,7) RGB = PAT(i,11) R = (RGB And $FF0000) / $10000 G = (RGB And $FF00 ) / $100 B = (RGB And $FF ) SC#= 0.5 ;TFormVector 1,1,0,CAM,0 x2# = SC;TFormedX()+SC y2# = SC;TFormedY()+SC z2# = 0;TFormedZ() VertexCoords(SU,v1,xx+x2,yy+y2,zz+z2) : VertexColor(SU,v1,R,G,B,0.75) VertexCoords(SU,v2,xx-x2,yy+y2,zz+z2) : VertexColor(SU,v2,R,G,B,0.75) VertexCoords(SU,v3,xx+x2,yy-y2,zz+z2) : VertexColor(SU,v3,R,G,B,0.75) VertexCoords(SU,v4,xx-x2,yy-y2,zz+z2) : VertexColor(SU,v4,R,G,B,0.75) PAT(i,12) = PAT(i,12) + 1 If PAT(i,12) => PAT(i,13) Then For m = 0 To 13 TEMP = PAT(i,m) PAT(i,m) = PAT(AK_PAT,m) PAT(AK_PAT,m) = TEMP Next VertexCoords(SU,v1,0,0,0) VertexCoords(SU,v2,0,0,0) VertexCoords(SU,v3,0,0,0) VertexCoords(SU,v4,0,0,0) AK_PAT = AK_PAT - 1 EndIf EndIf Next AK_MS = MilliSecs() EndIf For i = 0 To AK_PAT If PAT(i,0) = 1 For m = 5 To 7 PAT(i,m) = PAT(i,m)+PAT(i,m+3) Next EndIf Next End Function Mal ne Frage dazu : Kann man jedem einzellnen Particle auc eine Texture zuordnen ? Also dass ich nicht nur Farben rumfliegen lassen kann sondern z.b. auf Feuer oder so ? mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du kannst jedem partikel einen eigenen teil der textur zuweisen via UV
aber keine eigene textur, denn eine surface = 1 textur (ausser bei multitexture was man bei partikeln jedoch weniger hat) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Heißt also ich muss meine ganzen Particle-Texturen in einem Großen Bild wie ein AnimImage speichern und dem Surface per Brush übergeben (Also bei Particle-größe 32x32 dann mit 4 Particlen ist das Bild 64x64pixel groß) Aber wie kann ich mit u/v den einzellnen Particlen einen Teil von dem Bild heraus finden, bzw. was muss ich eingeben ? Ist bei dem Befehl VertexTexCoords(o.a) die Parameter u/v in Prozent ? Also 0 = 0% und 1 = 100% ? Oder wie muss ich das anwenden ?
mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo ....
zu deiner Frage ....... 0.0-1.0. Aber ich denke damit wirst du nichts anfangen können. Wir könnten dir natürlich die grundlagen in langen Frage und Antwort spielen hir beibringen. Aber ich denke das ist nicht der richtige Weg. Alles was du zu den einzelnen Befehlen von B3D wissen must. Gibts auf der Deutschen Hilfe zu lesen. Davon gibt es eine Alte ..... die einfach nur Genial ist. Und eine Neue die einfach nur Actuell ist. Diese findest du in diesem Forum. Singele Surface sachen sind recht kompliziert. Dabei geht es darum....... für fiele SubObjecte....... nur eine Texture zu verwenden. Es gibt etliche ansätze die zu einem guten bist Super guten ergebniss füren können. Dazu muss man wissen wozu man Singele Surface benötigt. Wenn du sowiso die Partikel die in einem Surface gesammelt sind. Auch noch andere Texturen verpassen möchtest. Bleib doch beim Entity System. Da must du nicht alles selber machen. Ist zwar je nach anwendung langsamer. Aber es funktioniert gut. Soll es eine SSE dann doch sein. Must du dir im vorfeld überlegen. Was du alles braucht, und was du weglassen kanst. BEsonders die Sichtbarkeits erkennung ist für die Pervormance entscheident. Damit du nicht jedesmal alle Triangle in die Pipline schickst. Dann must du noch nach bewegung optimieren. Sind nur Aufsteigende Bewegungen nötig..... Feuer steigt auf. (Lagerfeuer) oder brauchst du es in alle richtungen. (Antrieb/Feuerwerk/Licht effecte.) Es gibt da sofiel zu Optimieren................. Fiel spass bei der Aufgabe. Ich drück dir die Daumen. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn man mit Brushes arbeitet, kann man die UV-Skallierung selbst bestimmen. Das geht dann zum Beispiel über LoadBrush![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ist 0-1(u) und 0-1(v) doch in Prozent ?
Also wenn ich jetzt vier Vertex habe und möchte eine Texture drauflegen... Code: [AUSKLAPPEN] If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),0,1)
If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),1,1) If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),0,0) If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),1,0) Ich hab eine Texture von 128x128 in der 4 Bilder je 64x64pixel groß sind Will ich jetzt das erste haben, also an der Position 0,0->64,64 dann muss ich doch das so ausrechenen : Code: [AUSKLAPPEN] u1 = 0*(1/128):v1 = 0*(1*128);Obere linke ecke
u2 = 64*(1/128):v2 = 0*(1*128);Obere rechte ecke u3 = 0*(1/128):v3 = 64*(1*128);Untere linke ecke u4 = 64*(1/128):v4 = 64*(1*128);Untere rechte ecke Und dann halt mit VertexTexCoords ?? Hab ich das so richtig verstanden ? Auf jeden fall danke ! mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie gesagt, wenn du mit Brushes arbeitest, kannst du die Skallierung selbst festlegen. Wenn du bei skalU# und skalV# jeweils 128 angibst, dann gehen die Texturen ab links/oben 0,0 bis rechts/unten 128,128. Größere Werte spulen das ganze dann immer wieder von neuem ab.
Ohne Brushes (vorzugsweise Nutzung), also mit reinen Texturen, geht jede UV-Koordiante links/oben 0,0 bis rechts/unten 1,1. Dann gilt also: U#=GewünschteXPositionInPixel*(1/TextureWidth(Texture)) etc... Deine 64*(1*128) bringen rein garnichts. Kannst dann ja gleich 64*128 machen. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay danke erstmal ..
Ich hab aba ein problem das das net funzt... Code: [AUSKLAPPEN] Function GetUV(Texture,x,y,bw,bh)
Local w = 128;TextureWidth(Texture) Local h = 128;TextureHeight(Texture) Local p1 = (1/w),p2 = (1/h) u1 = x*p1:v1 = y*p2;Obere linke ecke u2 = (x+bw)*p1:v2 = y*p2;Obere rechte ecke u3 = x*p1:v3 = (y+bh)*p2;Untere linke ecke u4 = (x+bw)*p1:v4 = (y+bh)*p2;Untere rechte ecke End Function und dann : Code: [AUSKLAPPEN] GetUV(FS,0,0,64,64)
If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),u1,v1) If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),u2,v2) If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),u3,v3) If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),u4,v4) Aber die werden nicht mehr angezeit... was mach ch falsch ?+ thx+mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Programmierstil ist eine absolute Grausamkeit, aber egal.
Folgende Änderungen: Local p1# = (1.0/w) Local p2# = (1.0/h) und u1# = x*p1 v1# = y*p2 u2# = (x+bw)*p1 v2# = (y+bh)*p2 Du benötigst keine u3, u4, v3 und v4 da sowohl u1=u3, u2=u4, v1=v2, v3=v4 identisch sind Also benutzt du jeweils jede Variable zweimal. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay danke erstmal...
Jetzt werden bei mir aber immer nur solche streifen angezeigt... Code: [AUSKLAPPEN] Graphics3D 800,600,16,1
SetBuffer BackBuffer() Global CAM = CreateCamera() Global CAMPIV = CreatePivot() Global u1#,u2#,v1#,v2# Global M = CreateMesh(),SU = CreateSurface(M) EntityFX M,18 Global AK_PAT = 0 Global AK_MS = MilliSecs() Dim PAT#(10000,13) Global Timer = CreateTimer(75) Global FS = LoadTexture("FS.png") EntityTexture M,FS CameraClsColor CAM,64,64,64 Repeat MS=MilliSecs():FPSz=FPSz+1 If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0 If KeyDown(57) Then For i = 1 To 10 CreatePAT(0,0,5,Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rnd(-0.100,0.100),255,255,200,Rand(100,1000)) Next EndIf TurnEntity CAM,+MouseYSpeed()/3,0,0,0 TurnEntity CAM,0,-MouseXSpeed()/3,0,1 If KeyDown(17) Then MoveEntity(CAM,0,0,0.1) MoveMouse 400,300 UpdatePAT() WaitTimer(TIMER) UpdateWorld() RenderWorld() Text 1,1,"FPS: "+FPS+" PARTICLES: "+AK_PAT Flip Cls Until KeyHit(1) End Function CreatePat(xx#,yy#,zz#,sx#,sy#,sz#,R,G,B,grenz=-1) If grenz = -1 grenz = 100+Rand(-10,10) Local RGB = 1*$1000000+R*$10000+G*$100+B Local SC# = 0.5 GetUV(FS,0,0,64,64) PAT(AK_PAT,0 ) = 1 If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),u1,v1) If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),u2,v2) If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),u1,v1) If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),u2,v2) PAT(AK_PAT,5 ) = xx PAT(AK_PAT,6 ) = yy PAT(AK_PAT,7 ) = zz PAT(AK_PAT,8 ) = sx PAT(AK_PAT,9 ) = sy PAT(AK_PAT,10) = sz PAT(AK_PAT,11) = RGB PAT(AK_PAT,12) = 0 PAT(AK_PAT,13) = grenz AddTriangle(SU,PAT(AK_PAT,1),PAT(AK_PAT,2),PAT(AK_PAT,3)) AddTriangle(SU,PAT(AK_PAT,3),PAT(AK_PAT,2),PAT(AK_PAT,4)) AK_PAT = AK_PAT + 1 End Function Function GetUV(Texture,x,y,bw,bh) Local w# = TextureWidth(Texture) Local h# = TextureHeight(Texture) Local p1# = (1.0/w#),p2# = (1.0/h#) u1 = x*p1 v1 = y*p2 u2 = (x+bw)*p1 v2 = (y+bh)*p2 End Function Function UpdatePAT() If AK_MS <= MilliSecs() - 30 ;30ms Update For i = 0 To AK_PAT If PAT(i,0) = 1 ;PositionEntity CAMPIV,PAT(i,5),PAT(i,6),PAT(i,7) ;If EntityInView(CAMPIV,CAM) And EntityVisible(CAM,CAMPIV) Then v1 = PAT(i,1) v2 = PAT(i,2) v3 = PAT(i,3) v4 = PAT(i,4) xx# = PAT(i,5) yy# = PAT(i,6) zz# = PAT(i,7) RGB = PAT(i,11) R = (RGB And $FF0000) / $10000 G = (RGB And $FF00 ) / $100 B = (RGB And $FF ) SC#= 0.5 ;TFormVector 1,1,0,CAM,0 x2# = SC;TFormedX()+SC y2# = SC;TFormedY()+SC z2# = 0;TFormedZ() VertexCoords(SU,v1,xx+x2,yy+y2,zz+z2) : VertexColor(SU,v1,R,G,B,0.75) VertexCoords(SU,v2,xx-x2,yy+y2,zz+z2) : VertexColor(SU,v2,R,G,B,0.75) VertexCoords(SU,v3,xx+x2,yy-y2,zz+z2) : VertexColor(SU,v3,R,G,B,0.75) VertexCoords(SU,v4,xx-x2,yy-y2,zz+z2) : VertexColor(SU,v4,R,G,B,0.75) PAT(i,12) = PAT(i,12) + 1 If PAT(i,12) => PAT(i,13) Then For m = 0 To 13 TEMP = PAT(i,m) PAT(i,m) = PAT(AK_PAT,m) PAT(AK_PAT,m) = TEMP Next VertexCoords(SU,v1,0,0,0) VertexCoords(SU,v2,0,0,0) VertexCoords(SU,v3,0,0,0) VertexCoords(SU,v4,0,0,0) AK_PAT = AK_PAT - 1 EndIf ;EndIf EndIf Next AK_MS = MilliSecs() EndIf For i = 0 To AK_PAT If PAT(i,0) = 1 For m = 5 To 7 PAT(i,m) = PAT(i,m)+PAT(i,m+3) Next EndIf Next End Function Was habe ich jetzt schon wieder falsch gemacht ?? mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du es denn wirklich verstanden?
Bei VertexTexCoords mußt du bei dir am Ende folgende Kombi haben: ,u1,v1) ,u2,v1) ,u1,v2) ,u2,v2) |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh shit wirklich xD
DANKE ! ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group