Textur-Wiederholung und spannen in shader
Habe ich die folgenden fragment-und vertex-shader, in dem ich wiederhole textur:
//Fragment
vec2 texcoordC = gl_TexCoord[0].xy;
texcoordC *= 10.0;
texcoordC.x = mod(texcoordC.x, 1.0);
texcoordC.y = mod(texcoordC.y, 1.0);
texcoordC.x = clamp(texcoordC.x, 0.0, 0.9);
texcoordC.y = clamp(texcoordC.y, 0.0, 0.9);
vec4 texColor = texture2D(sampler, texcoordC);
gl_FragColor = texColor;
//Vertex
gl_TexCoord[0] = gl_MultiTexCoord0;
colorC = gl_Color.r;
gl_Position = ftransform();
HINZUGEFÜGT: Nach diesem Prozess, ich hol die textur-Koordinaten und nutzen ein texture-pack:
vec4 textureGet(vec2 texcoord) {
//Tile is 1.0/16.0 part of texture, on x and y
float tileSp = 1.0 / 16.0;
vec4 color = texture2D(sampler, texcoord);
//Get tile x and y by red color stored
float texTX = mod(color.r, tileSp);
float texTY = color.r - texTX;
texTX /= tileSp;
//Testing tile
texTX = 1.0 - tileSp;
texTY = 1.0 - tileSp;
vec2 savedC = color.yz;
//This if else statement can be ignored. I use time to move the texture. Seams show without this as well.
if (color.r > 0.1) {
savedC.x = mod(savedC.x + sin(time / 200.0 * (color.r * 3.0)), 1.0);
savedC.y = mod(savedC.y + cos(time / 200.0 * (color.r * 3.0)), 1.0);
} else {
savedC.x = mod(savedC.x + time * (color.r * 3.0) / 1000.0, 1.0);
savedC.y = mod(savedC.y + time * (color.r * 3.0) / 1000.0, 1.0);
}
vec2 texcoordC = vec2(texTX + savedC.x * tileSp, texTY + savedC.y * tileSp);
vec4 res = texture2D(texturePack, texcoordC);
return res;
}
Habe ich einige Probleme mit dem zeigen Säume (1 pixel es scheint) jedoch. Wenn ich raus lassen texcoord *= 10.0 keine Nähte sind gezeigt (oder kaum), wenn ich es verlassen, in der Sie erscheinen. Klemme ich die Koordinaten (versuchte sogar niedriger als 1,0 und größer als 0.0) ohne Erfolg. Ich habe stark das Gefühl haben, es ist ein Rundungsfehler irgendwo, aber ich habe keine Ahnung wo. HINZUGEFÜGT: Etwas zu beachten ist, dass in dem konkreten Fall, den ich konvertieren texcoordC x und y auf 8 bit floats. Ich denke, die Ursache liegt hier; ich fügte hinzu, ein anderes shader-Beschreibung vor.
Den Fall, dass ich zeigen ist ein wenig komplizierter in der Realität, so gibt es keine Verwendung für mich, dies zu tun außerhalb der shader(!). Ich fügte hinzu, die Vorherige Frage, das erklärt ein wenig über den Fall.
EDIT: Wie Sie sehen können die Natürliche textur span wird durch 10 geteilt, und die textur wiederholt (10 mal). Die Nähte erscheinen an der Grenze von jedem wiederholende textur. Ich habe auch einen screenshot. Die Nähte sind sehr dünne Linien (~1pixel). Das Bild ist ein Ausschnitt aus einem screenshot, nicht skaliert. Die wiederholte textur ist 16x16 mit 256 Subpixel insgesamt.
EDIT: Dies ist ein follow-up Frage: diese Frage, obwohl alle notwendigen Infos sollten hier aufgenommen werden.
Im letzten Bild hat keine Zeit Hinzugefügt.
mod(value, 1.0)
wird die Ausbeute[0, 1.0[
, soclamp(value, 0.0, 0.9)
bringt eine Diskontinuität.- Ich fügte hinzu, die Klemme später; es würde nicht dazu führen, dass die Nähte entweder würde ich vermuten.
- Wie sind Sie bei der Einrichtung die textur-Koordinaten für das Objekt, das Sie gerade zeichnen?
- Was meinst du mit "Nähte"? Wo werden Sie sehen diese Nähte? Was sind Sie versucht zu Rendern, mit diesem?
- Textur-Koordinaten werden immer von 0..1. Wie Sie sehen können, die sich wiederholenden arbeiten.
- Bolas: ich habe ein screenshot zeigt den Nähten.
- Ich glaube, Sie könnten ein Problem mit der Abtastrate. Zumindest mit dem atlas, aber vielleicht auch mit dem Lesen wieder Ihre zuvor gespeicherte UV-coords. Ich kann nicht sehen, wo Sie das Konto für die Hälfte-texel-offset-wenn die Fliesen innerhalb des atlas, und es gibt keine Grenze, so erhalten Sie möglicherweise einige Blutungen. Und wenn es nicht perfekt 1:1-sampling mit dem UV-Lesen-zurück aus dem ersten pass, Sie bekommen das gleiche Problem, das Sie hatte, wenn Sie versuchen zu tun Sie die Fliesen per-vertex, aber in einem kleineren Maßstab. Ich würde vielleicht die debug-rendering von aus den gespeicherten UVs, und überprüfen, dass Sie korrekt Aussehen.
- Wenn ich die UV ' s (gespeichert als PNG), sieht alles in Ordnung.
- Können wir das erkennen?
- Was ist deine Einstellung auf die eigentliche textur? Klemme, wiederholen, Feste Farbe?
- Ich habe eine Scheibe die UV-Leistung.
- Auf die eigentliche textur ich habe eine Feste Farbe.
- Keine chance, das ist, was Sie sehen? Es scheint der Letzte Spielstein in dieser Reihe, nachdem alle. Oder geschieht es egal, welche Fliese, die Sie wollen zu ziehen?
- Könnte mein browser, aber es sieht aus wie du bist Filterung der UVs.
- Die UV-Koordinaten als grün(x),blau(y) und rot, wie die texturetile Kanal. Die letztere hat in rot auf null gesetzt.
- Es passiert, egal welche Fliesen ich zu zeichnen.
- Ich bekomme einige Blutungen manchmal, aber es scheint zu verschwinden, wenn ich nicht die Zeit-ein Teil der shader.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf das Rendern der UV-Koordinaten, Sie werden gefiltert, wodurch sich das gleiche Problem wie in der vorherigen Frage, aber in einem kleineren Maßstab. Was passiert ist, dass durch das sampling der UV-Koordinate der textur an einem Punkt zwischen zwei diskontinuierliche Werte (D. H. zwei benachbarte Punkte, an denen die textur-Koordinaten verpackt), Sie erhalten einen interpolierten Wert, was nicht in den richtigen Teil der textur. Also die Grenze zwischen textur-Kacheln ist ein Durcheinander von Pixeln aus der ganzen Fliese.
Müssen Sie das mapping 1:1 zwischen Bildschirm-Pixel und die aufgenommenen UV-Werte. Mit nächste sampling-vielleicht bekommen Sie einige dem Weg dorthin, aber es sollte möglich sein, tun, ohne, dass, wenn Sie das Recht haben, textur-und pixel-Koordinaten in den ersten Platz.
Zweitens, Sie finden können, bekommen Sie Blutungen Effekte durch die Art und Weise Sie tun die textur-atlas nachschlagen, da Sie nicht für die Art und Weise texels abgetastet werden. Dies wird verstärkt, wenn Sie mit MIP-Mapping. Im Idealfall müssen Sie eine Grenze, und möglicherweise einige massieren der Koordinaten die Hälfte-texel-offsets. Aber ich glaube nicht, dass das die wichtigste Frage, die Sie hier sehen.