Massive VertexTexCoords Probleme. Profis gefragt.
Übersicht

![]() |
BobBetreff: Massive VertexTexCoords Probleme. Profis gefragt. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
bin langsam am verzweifeln. Hab mich nun schon einige Tage lang in ein Texturkoordinaten Problem verbissen bei dem mir wohl nur die Foren Profis helfen können. Ich versuche das Prob. so präzise wie möglich zu schildern. Gegeben. Eine SingleSurface Mesh bestehend aus Quads (jeweils 2 Tries mit insgesamt 4 Vertices) die so rotiert und angeordnet sind das sich Räume und Gänge ergeben. Ein Grafikdatei z.b. eine 512*512 grosse Bitmap mit insgesaamt 16 X 128*128 Pixeln grossen Einzeltexturen. (4*4 Anordnung) Um jetzt jedes Quad der Singelsurface mit einer belibigen Txture der grossen Textur zu "bekleben", werden für jeden Texturausschnitt die Korrekten UV Korrdinaten berechnet. Für Die erste Teture (oben Links innerhalb der grossen Bitmap) sind das z.B. folgende Koordinaten. U1 = 0 : V1 = 0 U2 = 0.25 : V2 = 0 U3 = 0.25 : V3 = 0.25 U4 = 0 : V4 0.25 Das berechnen aller UV Koordinaten erfolgt in einer Schleife. Alle Koordinatenn sind (scheinbar) absolut Korrekt berechnet. Teste ich nun das ganze, werden die Aussenkanten eines jeden Quads deutlich sichtbar. Die Texture ist absolut korrekt. Natloses Kachelen über z.B. Eine Website ist kein Problem. Verwende ich zu Testzwecken mal eine einzelne Textur, 128*128 grosses Bitmap, die ich der grossen Bitmap entnommen habe. Taucht das Problem nicht auf. Alle Texturkoordinaten sind dann natürlich im Bereich von 0-1. Verwende ich zu Testzwecken mal eine 256*256 grosses Bitmap die ich der grossen Bitmap entnommen habe ( 2*2 anordnung) . Taucht das Problem zwar auf, wirk sich aber nicht so extrem aus. Die sichtbaren Kanten sind dünner. Die Texturkoordinaten liegen dann in den Bereichen 0 : 0.25 : 0.5 : 0.75 : 1 TformFilter, AntiAlias, BlendModes, UV Clamping (16+32 bei LoadTexture bzw. Brush) sind alle nicht relevant. Es ist auch scheinbar vollkommen Wurst das es, aufgrund der Anordnung der Quads, dazu kommt das maximal bis zu 4 Vertics unterschiedlicher Quads die selben XYZ Koordinaten einnehmen. Das BB ziemlich "ungenau" mit Kommazhlen umgeht ist ja bekannt und bekomt man leider immer wieder zu spüren, aber so "simple" Zahlen wie 0.25 : 0.5 usw. dürften doch wohl zu schaffen sein. Für mich schient es momentan klar das z.b. 0.25 nicht 0.25 sondern sowas wie 0.2499998 ist. Der Debugger spuckt mir aber immer korkete Zahlen aus. Irdendeine Idee wie ich das Problem lösen kann ausser für jede Texture eine seperate Surface anzulegen? Bin mir sicher das es eine Lösung gibt, sonst wären z.B. alle SingeSurface Particle Engines witzlos. Hier noch ein Screenshot (unpassende Textur aber gut zum verdeutlichen des Probs.) ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn ich mich richtig erinnere, muss man die UVs minim kleiner machen, als sie eigentlich sein sollten. Dann stimmts. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Problem kommt davon das wenn ein Texel größer als ein Bildpunkt wird. Dann wird Biqubisch zwischen den Texel interpoliert, was bei dir auch heißt das zwischen den verschiedenen Texturschnipsel interpoliert wird. da diese interpolation so eine art Farbpyramide ergibt scheint sie über die Kante zu laufen.
Du Solltest um jeden deiner Texturschnipsel mindestens 1 Pixel rand lassen bzw dort die Pixel der anderen Seite der Textur wiederholen. Dann solltest du die UV Coords auch um diesen Bruchteil kleiner setzen. Ich hoffe du verstehst was ich meine |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ All
Erstmal danke für die schnelle Hilfe @Dreamora Das hört sich an als könnte es klappen und dekt sich ja auch fast mit meiner Vermutung. Allerdings weis ich nie genau vorher wie viele Texturen in der Grossen Texture sind. Das könnte bedeuten das mann die minimal Verkleinerung der UV Koord. nur durch Trial and Error austüffteln kann. Erst experimente damit hab ich schon gamacht. Die Kanten werden kleiner und damit Schärfer. @Klaas Versteh nicht genau was du meinst. Mit der Interpolation das kann ich nicht nachvollziehen (Weis aber was Ineterpolation ist). Die Kanten die sichtbar werden, stammen definitiv von Texturenschnippseln der Nachbartextur und nicht von sich selbst. Das habe ich über eine Texture rausgefunden die nur Vollfarben enthält. (Knall Rot blau usw.) . Der 1 Pixel rand würde bedeuten das ne 2*2 er textur 260*260 Pixel gross wird. (1 Pixel auf jeder Seite mal 2 Texturen mal 2 Ränder = 4 Pixel) Das Bedeutet wiederrum Skalierung der Textur durch BB. Speedverlust. Noch mehr Interpolation. |
||
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nein ... so:
Textur: 512 * 512 a 4 Texturen: 256 * 256 Die Texturen allerdings haben in sich einen Rahmen sie sind also eigentlich nur 254 * 254 Code: [AUSKLAPPEN] +-+------+-+-+------+-+ +-+------+-+-+------+-+ | | | | | | | | | T1 | | | T2 | | | | | | | | | +-+------+-+-+------+-+ +-+------+-+-+------+-+ | | | | | | | | | T3 | | | T4 | | | | | | | | | +-+------+-+-+------+-+ +-+------+-+-+------+-+ Dieser Rahmen ist immer die wiederholung der gegenüberliegenden Kante damit es zu einem guten Tiling kommt. |
||
- Zuletzt bearbeitet von Klaas am So, Mai 29, 2005 14:55, insgesamt einmal bearbeitet
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso meinst du das.
Ok. Leider bringt es nichts. Wie bereits festgestellt. Die sichtbar werdenden Kanten sind Pixel der benachbarten Texuren. Da kann ich soviel Pixelwiederholungen machen wie ich will. Ohne Skalierung der UV TexturKoordinaten läuft da scheinbar überhaupt nichts. Habe mittlerweile bei einer 2*2er Texture ausgetüfftelt das dass Offset bei + 0.0019 bzw -0.0019 liegen muss. Wie bereits vermutet sind es bei anderen Texturgrößen andere Werte. Damit ist das ganze Projekt (mal wieder eins mehr ) in dieser Form gestorben. Ich verabschiede mich somit von dem Singelsurface System und gehe den Weg des geringsten Wiederstands. Ich mach halt für Jede Texture eine eigene Surface. Langsam bin ich von den BB Unzulänglichkeiten echt angenervt. Hab mich schon nach Alterantiven umgesehen. Allerdings bin ich mir ganz sicher das auch diese wieder ihre Macken haben. Ich wünschte für BMax gäb's eine komplette 3D Engine. Kenn mich mit OGL überhauptnicht aus. Danke nochmal. Thema erledigt. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du hast scheinbar nicht ganz verstanden was du machen musst.
Was du verwenden musst, sind die UV Koordinaten der jeweils inneren Quadrate. Das diese von der Auflösung abhängen, ist klar, da sie in obigem Falle jeweils 0.5 +- 1.0/texturewidth(tex) betragen wobei 1.0/texturewidth(tex) die UV Grösse eines Pixels auf der Textur ist. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
?
Natürlich verändere ich die UV Koordinaten der jeweils inneren Quadrate. Deine formel kann ich aber nicht nachvollziehen. Bei mir ist es so das ich bei einer 2*2er 128 Texture, um eine perkektes passen ohne Kanten zu erreichen, die UV Koordinaten dieses Texturausschnittes (z.b. des ersten) nicht auf: U1 = 0 : V1 = 0 U2 = 0.5 : V2 = 0 U3 = 0.5 : V3 = 0.5 U4 = 0 : V4 0.5 sondern auf: U1 = 0 +Offset : V1 = 0 +Offset U2 = 0.5 -Offset: V2 = 0 +Offset U3 = 0.5 -Offset: V3 = 0.5 -Offset U4 = 0 +Offset: V4 0.5 -Offset setzen muss. Offset# = 0.0019 Damit ergibt sich im Prinzip genau das Bild was Klaas da gezeichnet hat. Edit Habe grade mal 1.0 / 512 gerechnet. Ergebniss = 0.0019531 Siehe Offset. |
||
- Zuletzt bearbeitet von Bob am So, Mai 29, 2005 17:01, insgesamt 2-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist ja das was er / wir geschrieben haben. Im endeffekt musst du einfach die UV um je 1 pixel in jede richtung "nach innen schieben" musst, das ergibt dann obiges, bzw. das was du ja auch hast mit dem offset ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi nochmal,
Jo. Jetzt hab ich auch Klaas endlich richtig verstanden. War vielleicht ein bischen ungenau ausgedrückt. Ich dachte ich soll mittels Grafikprogramm die jeweils gegenüberligenden Kanten aussschneiden und an entsprechende Position einfügen. Deine Formel kann ich nun auch langsam nachvollziehen. Ich geb der SingelSurface Geschichte nun nochmal ne' Chance mit dem neuen Wissen. Ist aber auch gut das dieses Thema hier mal genau behandelt wurde. Da werden bestimmt auch andere von Profitieren. Danke nochmal an euch beide für eure Mühe und Gedult. ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja das Thema wäre früher noch praktisch gewesen, als ich wegen genau diesem Effekt in meinem B3D Terrainsystem fast verzweifelt wäre bis ich irgendwo im Netz über genau das Problem allgemein gestolpert bin inkl. einer ähnlichen Erklärung & Lösung wie der hier | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jau. Den Thread kenn ich auswendig.
Habe ihn die Tage wieder nach vorne geholt und dich da schon mit dem Problem "Beslästigt" weil ich wusste das du a. damit Probleme hattest, und b. wahrscheinlich 'ne Lösung gefunden hast. Jetzt aber doch noch mal ne Frage weil ich es so ganz und gar noch imer nicht kapiert habe. Zitat: Das diese von der Auflösung abhängen, ist klar, da sie in obigem Falle jeweils 0.5 +- 1.0/texturewidth(tex) betragen wobei 1.0/texturewidth(tex) die UV Grösse eines Pixels auf der Textur ist. Also meine Texturkoordinaten für ein 2*2er 128er Bitmap fängt nicht bei 0 an (für die erste, linksoben ausgerichtete 128er Textur, U und V Koordinate paar ) sondern bei: 1.0/texturewidth(tex) Wenn TextureWidth = 256 dann Nullpunkt (Vertex0 von 3) = 0.0039062 Ist das Korrekt? Für die rechte Seite der UV Koordinaten (Vertex 1) muss der Wert aber abgezogen werden also 0.5 - 0.0039062. (nur U bei V muss er immer noch drauf da V eigentlich ja noch Oben bei 0 liegt) Dieser Wert, nenen wir ihn mal Offset in Ermagelung eines besseren Ausdrucks, würde sich dann für jede weitere UV Koordinate weiterverwenden lassen. Sprich Texture 2, obenrechts nicht gleich 0.5 sondern 0.5039062. usw usw. In wie weit spielt dann TextureHeight(tex) noch eine Rolle? Was ist wenn ich einen "Streifen" von 4 Bildern jeweils 128x128 unetereinander angeordnet habe. Also 128 *512 Pixel. Muss ich ein uOffset und ein vOffset errechnen oder spielt es keine Rolle da die "Basis" jeder Textur sowieso quadratisch ist. (Sein sollte)? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group