Problem mit Cubeworld und UV

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

shootermaker

Betreff: Problem mit Cubeworld und UV

BeitragSa, März 19, 2011 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Bei meinem Spiel wird die ganze Welt mit einzelnen Cubes erstellt.
Damit die Perform. nicht in den Keller geht, werden Cubes in 16 x 16 blöcke eingeteilt. Jetzt muss ich über die UV befehle bei addvertex bestimmen wo welche Texture auf die Cubes soll:


Beispiel bei der Front eines Würfels:

Code:

;============================================FRONT
V[08]=AddVertex(s\Surface,X#-1,Y#+1,Z#-1,TexZ,TexS)
V[09]=AddVertex(s\Surface,X#+1,Y#+1,Z#-1,TexZ+TSize ,TexS)
V[10]=AddVertex(s\Surface,X#+1,Y#-1,Z#-1,TexZ+TSize ,TexS+TSize)
V[11]=AddVertex(s\Surface,X#-1,Y#-1,Z#-1,TexZ,TexS+TSize)



davor wird die TexZ und TexS Position ermittelt mit:

Code:

TexZ#=World( XX, YY, ZZ)\tz*TSize ;Zeile
TexS#=World( XX, YY, ZZ)\ts*TSize ;Spalte


Das wird dann so geladen
das Texturpacket ist 1024 x 1024 und hat mehrere Texturen mit der Größe 128x128 im Bild
Code:

Global texturepack = LoadTexture("Texture.bmp",1+256)
Global TSize#=0.125 ;eine Teil Textur aus der Datei
Global TexS#,TexZ#


Das Problem:

user posted image


Man sieht immer ein Stück der nächstgelegenen Textur im Packet.
Also ob Blitzbasic ungenau arbeiten würde mit den U und V pos.


Hoffentlich kan mir jemand helfen. mich wurmt das Problem schon einige Zeit. Crying or Very sad
 

PacMani

BeitragSa, März 19, 2011 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das passiert bei mir, wenn ich bestimmte Grafikkarteneinstellungen vornehme. Habe deswegen die UV-Koordinaten leicht überzogen, damit es dann nicht mehr auftritt.
 

shootermaker

BeitragSa, März 19, 2011 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den "überziehen" der Textur, also bei U und V z.b. +0.001 ist mir bekannt und würde das Problem beseitigen.
Jedoch ist die Textur dann nicht mehr Kachelbar,
Da eine scharfe Kante entsteht. Sad

Weißt du noch eine bessere Lösung?
 

PacMani

BeitragSa, März 19, 2011 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht direkt. Aber stell testweise doch mal deine Grafikkarteneinstellungen auf mieseste Qualität um. Vielleicht liegt es daran, was ich stark vermute, weil es bei mir auch in kommerziellen Spielen auftritt.
Technisch gesehen zieht sich der bilineare Filter ja die nächsten anliegenden Pixel und die sind in deinem großen Texturbild halt Gras und Sand, und daher kommen die Farben.
Da müsste man den Filter anders einstellen oder die Texturen in einzelne Texturen reinkopieren, sodass es keine Interferenzen mit den anderen drumherumliegenden Texturen gibt.
 

shootermaker

BeitragSo, März 20, 2011 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde ja gerne einzelne Texturfiles benutzen.
Das geht aber leider nicht, da ich dafür doch für jeden Würfel ein eigenes Mesh brauche.
Anders wäre es einfach zu ruckelig.
Bei mir werden aber immer 16X16 würfel zu einem Mesh. Also kann man das ja nur über die UV - pos. setzen. Oder?

Deine Idee mit dem reinkopieren der Texturfiles in jeweils ein einziges wäre bestimmt nicht schlecht, aber das funktioniert doch auch nur wieder wenn ich für jeden Würfel ein Mesh habe, oder?

Mr.Keks

BeitragSo, März 20, 2011 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Der billigste Weg ist, jedes Tile in deinem Tilesetz einfach nicht nur einmal, sondern gleich als 3x3-Block zu haben und auf deinen Würfeln dann die UV-Koordinaten des jeweils mittleren anzugeben. Smile Ist ein bisschen geschummelt und kann man Verschwendung nennen, aber sollte auf heutigen Grafikkarten eigentlich klar gehen, wenn du so einen 3d-Tile-Look von 2000 haben willst xD.

Der saubere Weg ist, für jede Mipmapping-Stufe jeweils eine Pixelreihe für jeden Rand doppelt zu speichern, wie von Pac-Man angedeutet.
MrKeks.net
 

shootermaker

BeitragDi, März 22, 2011 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und danke für eure Antworten.

Ganz ehrlich, das ist nicht ganz professional.
Am Ende bleibt mir wohl nicht mehr viel übrig als mein schönes Singlesurface-Cube-System wieder zu löschen und stumpf die Cubes einzeln zu setzen. Was ich dann mit der Performance mache weiß ich noch nicht. Sad

Seit mir bitte nicht böse, aber das mit den Pixel nachzeichnen oder die Textur 9-mal in das File zu zeichnen ist wirklich keine elegante Lösung.

Jemand hatte 2005 das gleiche Problem und hat es mit der Verschiebung der Texturcoordinaten hinbekommen.

https://www.blitzforum.de/foru...ight=clamp

Vielleicht kann sich jemand diesen alten Thread mal ansehen und daraus schlau werden, beim mir wird bei verschiebung der Texturcoords. zwar dieser unschöne Effekt der nebenstehenden Texturen gelöst, aber die Textur wird halt dan eben scharfkantig und nicht mehr kachelbar. Sad

Hoffentlich kann mir jemanden helfen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 22, 2011 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das UV-Mapping von Blitz3D arbeitet absolut genau und perfekt! Man muss sich nur überlegen wie die Grafikkarten arbeiten. Einzig, Blitz3D ist mit seiner übertriebenen anisotropen Filterung nicht für alle Sachen perfekt geeignet. Man kann es auch leider nicht selbst einstellen.


Tipp:

Beispielsweise eine Textur von 256x256er Kantenlänge, die auf 256 in u und v skaliert wurde, beginnen dessen Texel bei 0.5x0.5 und enden bei 255.5x255.5

Das ist auch logisch und übereinstimmt mit einem glatten Raster. Eine Textur sollte man sich wie ein Schachbrett vorstellen, dessen Texel in der Mitte jeder Felder stehen. Die einzelnen Pixelfarben orientieren sich dann anhand der Positionen (Entfernungen bzw. Gewichtung) der Texel. Jeder Pixel kann aus einer Mischfarbe von 4 (*) umliegenden Texeln bestehen.

* Außer, aufgrund der Perspektive oder Entfernung einer Textur zur Kamera, wenn eine Vielzahl von Texeln sich am Ort eines Pixels aufhalten. Hier kommt die anisotrope Filterung zugute und verhindert flackernde Interferenzmuster. Diese ist leider bei Blitz3D sehr extrem übertrieben eingestellt, was jedoch den Vorteil hat, dass die Grafikkarte das ganze schneller verarbeiten kann.

- - -

Um dein Problem zu lösen, mach die Tiles pro Textur größer oder grab einfach etwas weniger von ab.

Kopiere statt eines Tiles von 64x64 einfach dessen Wiederholungsmuster von 32x32 umrum. Das Tile hätte dann 128x128 Pixel wovon nur die mittleren 64x64 benutzt werden. Verschleiß beträgt hier allerdings 75%, für den anisotropen Effekt ist dann auch für Extremsituationen ausreichend Puffer vorhanden. Vielleicht kann man hier auch noch optimieren und die Tiles auf 96x96 ausdehnen, mit einem 16x16 Rahmen umrum. Probieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

BIG BUG

BeitragMi, März 23, 2011 1:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant wäre noch die Anzahl der unterschiedlichen Texturen, auch innerhalb eines Clusters. Wenn das in der Praxis sowieso nur eine Hand voll ist kannst Du auch überlegen einfach nur gleiche Texturen in ein Surface zusammenzufassen. Dann brauchst Du nicht zu kacheln und brauchst folglich auch keine Pixel Border.

Ansonsten siehe Hectics Post.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Mr.Keks

BeitragMi, März 23, 2011 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
shootermaker hat Folgendes geschrieben:
Seit mir bitte nicht böse, aber das mit den Pixel nachzeichnen oder die Textur 9-mal in das File zu zeichnen ist wirklich keine elegante Lösung.
Doch, bin dir böse. Du hast einfach keine andere Wahl als doppelte Pixelreihen, weil auch am Rand interpoliert werden muss (siehe hectics Post). Wenn du es elegant machen willst, dann vervierfache die Textur so wie von hectic beschrieben beim Laden intern (oder nur einmal beim ersten Programmstart).
MrKeks.net
 

shootermaker

BeitragSo, Apr 03, 2011 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und danke für eure Hilfe.
Also die 3 Möglichkeiten sind:

    - Um die Textur die gleiche Textur erstellen
    - Von der Textur die Ränder kopieren und neben der Textur setzen.
    - Statt unterschiedliche Texturen in ein Surface, jeweils die gleichen Texturen in ein Surface setzen


Da es mir aber fast lieber wäre die Texturen einzeln zu haben und nicht in einem großen File, bin ich mir fast sicher das ich die letzte Methode benutze.

Hab aber noch eine Frage:

Da ich ja die Blöcke dann auf Entfernung nicht mehr ausblenden kann, muss ich alle Blöcke immer angezeigt lassen. Ist das in sachen Performance immer noch einigermaßen schnell? Es wird KEIN Minecraft Clone wie warscheinlich fast alle jetzt denken. Smile Möchte damit eher so was wie einen Dungeon bauen.
 

PacMani

BeitragSo, Apr 03, 2011 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum jeder meint, das Minecraft das erste Spiel mit solchen Blocksystemen ist und alles andere nur Klone, verstehe ich nicht... hatte schon vor zehn Jahren etwas ähnliches gespielt Smile

Das wird auf jeden Fall mächtig in die Performance reinhacken, wenn du alles rendern lässt. Ich weiß ja nicht, wie komplex deine Level werden, aber auf jeden Fall sollte die CameraRange dann nicht allzu groß sein.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group