There are exactly 3 nodes up to now, which have to eal with texture coordinates:
these nodes have to deal with different ways how to input texture coordinates.
first a sketch of the nodes and their pins. afterwards some words on the naming decisions.
Pin "TextureCoords Space" allows to select
the pin actually receiving texture coordinates will be named:
according to the selected option. the naming changes to reflect the selected option in the patch.
( .XY (.XYZ) means that this is a vectorpin which can be divided later on into different pins. this will be managed in a future version vvvv with vectorpingroups accessible by the gui. resulting pins after splitting:
(* "TextureCoords.Z")
...
other pins:
Pins "Enable TextureCoords i" allow to select
The Resulting Pins are labeled
(The general idea of the "." in the naming of the pins is that the graph won't mind the text behind the "." when connecting pins. In that way it should be easier to implement mechanisms to keep the graph together, evene when dimensionalities or mode settings are changed.)
There should be one location in the wiki where the terms "World Space" and "Texture Space" are explained. It is very important to note that it is the World Space option, that means that texture coordinates will be transformed. If the user chooses "World Space", the coordinates entered in the patch will differ from the coordinates which are received by the shader.
That's why the "texture space" option looks more simple. However the default is the world space because of the inherent beauty of symmetry.
we always operate with texture space coodrinates.
putting the semantics "texturematrix" will result in altering the texture transformation, so that it will transform textures symmetrically. this semantics is set in all shaders coming from the open trusted vvvv shader development group.
the texture coordinates in vertexbuffers / meshes range from 0..1.
(-0.5 / 0.5 / -0.5)
(0.5/ -0.5 / 0.5)
(0 / 0 / 0)
(1 / 1 / 1)
Wir wollen
und zwar eleganterweise ohne
zu müssen.
Gleichzeitig soll klar transportiert werden in welchem Koordinatenraum sich Texturkoordinaten bewegen.
links,oben .. rechts,unten =? 0,0 .. 1,1 oder -0.5,0.5 .. 0.5,-0.5
Optimal wäre natürlich, wenn man es patch- und shaderseitg mit den gleichen Texturkoordinaten zu tun hätte.
Man möchte (patchseitig)
und hat es direkt mit Texturkoordinaten zu tun.
Oder man möchte mit
Texturtransformationen erzeugen.
Aber vor allem möchte man mehr funktionierende Standardfälle, bei denen man sich nicht um solche Spezialthemen kümmern muß, wie etwa, daß das importierte x-File
enthält.
Im Patch hat man es immer mit 0.5er Koordinaten zu tun.
Im Shader kommen diese auch so an. Lediglich die Transformationsmatrize ist durch Angabe der Semantic abgeändert. Wenn man dann im Shader mit dieser Matrize multipliziert, wird nicht nur die angeschlossene Texturtransformation ausgeführt sondern magischerweise auch in den directx-0..1er Raum umgerechnet. Dies muß äußerst klar kommuniziert werden. Für Leute die ein bischen mehr in die Details einsteigen müssen, (z.B. wegen Texturprojektionen, bei denen irgendwie 3dRaum und Texturraum zur Deckung gebracht werden müssen (Schattenthema)), möchten sehr genau wissen welche Transformationen nun wirklich dazugeschenkt werden.
(Übrigens ist bei so advanceten Topics auch relevant, daß einem noch eine Matrix einem dazugeschenkt wird, die bei den bisherigen Diskussionen noch nicht auftauchte, mir aber bei meinen Schattenprojektionen unangenehm reingrätschte: DirectX projectionspace: -1,-1,0 1,1,1. dagegen unserer -1,-1,-1 1,1,1. muss man nochmal genau verifizieren.)
Nun kann man sagen, daß sich die Dramatik etwas entschärft, da im Patch und im Shader die gleichen .5er Koordinaten benutzt werden (lediglich muss der Shader entweder manuell oder per Benutzung der Semantic dafür sorgen, dass die Koordinaten von .5er in 1er Koordinaten umgerechnet werden. Das heißt aber auch, daß Effekte die von Dritten kommen angepasst werden müssen, solange die semantic nicht eine allegemein übliche ist. Muss man verifizieren. Könnte ja sein dass viele Shader sowieso schon mit einer "TexturTransform" Semantic ausgestattet sind.
Also nochmal: die Lösung basiert grundsätzlich auf dem 0.5er Raum, der patch und shadersetig benutzt wird. Dafür muss man wenn man es genau nimmt auch beim importieren/exportieren von Xfiles umrechnen.
besser so:
variante:
im patch symmetrische koordinaten
im shader mit dx-kompatibler semantik werden die texturkoordinaten vorher über cpu auf 0..1 umgerechnet.
so kann jeder standardshader sofort funktionieren. minimaler performanceverlust, aber funktioniert. ischanged-berechnungen müssen sowieso irgendwann optimiert werden.
wer das nicht will benutzt die vvvv-eigene spezialsemantik, benutzt im shader symmetrische koordinaten und baut die eine zeile texturtransformation ein, dann hat man volle leistungsfähigkeit. den schritt muss man shaderschreibern erklären.
patch und shaderseitig 0..1er Raum.
Der Standard ist der 0..1er Raum. Zumindest bei den Render-Engines. Wie weit man mit den Texturräumen in 3dModellern zutun hat weiss ich nicht genau. Auf jeden Fall denke ich dass auch in allen gängigen Fileformaten 0..1 Standard ist.
Aus diesem Grund ist der User daran mehr oder weniger gewöhnt und das ist auch irgendwie wichtig.
Besonders reizvoll an dem Ansatz (also auch diesen 0..1er Raum zu benutzen) wäre, dass man nirgens hin oder her rechnen müsste. Der Nachteil ist klar, dass man oldschool-symmetrische Texturtransformationen nur mit einem Spezialknoten lösen kann. Jedoch ist dann die Stelle wo diese Extramatritze eingerechnet wird klar isoliert. Ausserdem kann man auch gerne mal einen Vertexshader schreiben, der keine Texturtransformation benötigt, aber schon mit Texturen umgeht. Der Nachteil bei der obigen Version ist ja auch, dass diese Endstufe (.5->.1) auf jeden Fall in den Vertexshader reinmuss, da ja alle Geometrien .5er Koordinaten haben. Wenn man dann mal einen aufwendigen Shader schreibt mit 16 Texturen/Samplern, dann gehen einem da möglicherweise wertvolle Instruktionen verloren... (HACK für diesen Fall: doch ausnahmsweise die Geometrie mit 0..1er Koordinaten versorgen, dann ist keine triviale Texturtransformation nötig)
Vorteile sind also: keine Spezialfälle im Xfile-Reader / -Writer, keine im Shader, keine Magie in der Semantic. Und dafür eine klare Schnittstelle ohne sich jemals wieder über diese Thema Gedanken machen zu müssen.
Das mit der Didaktik oben kann man auch nochmal ein bischen relativieren. Texturkoordinaten sind ja vielleicht doch nur im Fall des Quads und der orthogonalen XY-Projektion das gleiche wie die Vertexkoordinaten. (Den Fall der Schattenprojektion muss man sich eigentlich auch nochmal genau skizzieren. Jedenfalls habe ich in Erinnerung, dass man genau so eine implizite Umrechnungsmatrizze im obigen Modell auf einmal explizit reinpatchen musste. In diesem Modell hier: muss man noch evaluieren.)
Die Frage ist für mich auch wie unbedingt notwendig die symmetrische Transformation denn eigentlich ist. Sie ist zwar gewohnt aber nicht unbedingt essentiell.
Nachtrag:
Man kann auch hier eine Semantic einführen, also gleicher Nachteil / Spezialfall wie oben, jedoch ist das optional. Man braucht nicht unbedingt diese Semantic (dann wird nach links oben skaliert) bzw. man braucht überhaupt keine Texturtransformation (dann liegt die Textur auch vernünftig drauf), aber wenn man diese Semantic einsetzt wird halt symmetrisch skaliert. Das ginge dann so, dass beide Konvertierungsschritte (1 - > 0.5 und wieder zurück) im gleichen Atemzug passieren und man niemals mit dem 0.5er in Kontakt kommt. Wenn also die Semantic verwendet wird, rechnet der Effektknoten:
Texturmatrix = KonvertierungsMatrix_1_05 * TextureTransform * KonvertierungsMatrix_05_1
Damit spart man sich also auch den Spezialknoten.
gregsn: man sagt einfach: wenn du symmetrisch skalieren willst musst du die semantic in deinen shader reinhacken. (wie in ansatz 1)
die beiden punkte wiedersprechen sich :)
also ich (gregsn) denke man braucht keinen spezialknoten. sondern eine semantic wie in ansatz 1. wenn diese fehlt ist nicht so schlimm (die textur sitzt nicht völlig fies drauf). das ist schon ein vorteil.
ich würde sagen, dass vvvv shader auch standardmässig mit der semantic ausgestattet sind, damit textur transformationen wie bisher funktionieren. man merkt quasi keinen unterschied.
a) um sebastians (gregor) these zu untermauern, dass 0..1 standard is ein link nach wikipedia. interessanteweise beschreibe die hier die koordinaten zwar genau andersrum, als die directXer (vermutlich so eine left-handed vs. right-handed sache zwischen opengl und directx. bei 3d-exportern gibts dazu immer die option: texturkoordinaten spiegeln) aber zumindest eben auch zw. 0 und 1
b) ich bin gegen die einführung eigener semantiken. semantics und annotations sind ein vorgegebenr standard und können nicht einfach von jedem verändert werden. das is wider die natur eines standards.
leider is der standard völlig unzureichend dokumentiert und mit DXSAS gibts da wohl bald nochmal eine neue unverständliche sache. ich kann jedenfalls nirgends eine liste aller gültigen semantiken finden.
wenn wir eigene semantiken einführen bedeutet das, dass sie in anderen programmen ignoriert werden und effekte, die in vvvv geschrieben wurden anderswo nicht funktionieren.
ergo
_geringer erklärungsbedarf: jemand der von texturkoordinaten zum ersten mal hört wirds einfach so hinnehmen. jemand der sie schon kennt wird sie so erwarten. im einfachen pipet-demo-fall mit dem linearspread kann man endlich dann weiterhin ganz selbstverständlich die vorzüge von maprange im vergleich zu map demonstrieren.
_geringer erklärungsbedarf: benutz es, wenn dus brauchst. wers verstehen will bekommts im SymTex helppatch erklärt.
(gregsn: anders herum ist das natürlich auch ein problem von effekten anderer. die texturkoordinaten sind da standardmässig 2d was sie inkompatibel macht. kann aber eigentlich nicht sein sowas. nochmal evaluieren)
voila
(gregsn: ja aber man verliert erstmal schon das gewohnte verhalten, was auch wieder zu abwärtskompatibilitätsproblemen führt. mit dem semantic-ansatz hätte man das gleiche verhalten)
für Ansatz 1 stimmen
also wenn ich hier schon in der minderheit bin nochmal auf der meta-ebene:
das ziel von vvv war leuten ohne programmiererfahrung das programmieren von komplexen multimediaanwendungen extrem einfach und übersichtlich zu machen.
d.h. klarer, schneller, eleganter und einfacher als in anderen programmen.
die lücke, die vvvv zu schliessen versucht, ist leute, die sich mit programmierung nicht auskennen, dazu zu bekommen, anspruchsvolle - neue - sachen selbst zu schreiben zu können.
ich sage, das funktioniert sehr gut. den weg sollten wir nicht verlassen. eher noch aggresiver begehen.
wir haben immer versucht, sachen eleganter und klarer machen als in anderen programmen. wenn andere programme sachen unlogisch machen, sollten wir uns nicht daran halten. unsere nutzer scheinen diese haltung ja auch zu verstehen und zu mögen.
jedes detail, was nicht selbsterklärend ist, ist ein schritt in die falsche richtung.
shaderkompatibilität: den mitgelieferten shadern muss letztlich genausoviel aufmerksamkeit gewidmet werden, wie den mitgelieferten knoten. shaderschreiben wird immer ein expertenthema bleiben. irgendwo gefundene shader werden immer probleme haben - da lieber auf den nächsten standard warten, und sich dann streiten.
und: bevor man da kompatibilitätsoptimierungen macht, wäre ich dafür, erstmal eine liste zu machen, wo das shaderimportieren viel fundamentaler hakt (multipass etc.).
die fehlende transformation kann man shaderexperten (die also eh über transformationsmatrizen bescheid wissen müssen) leicht erklären (wenn man sie nicht über eine semantik lösen wollte) auf dem level erklärt sich das in wenigen sätzen.
die vereinheitlichung von textur- und 2d-räumen ist ein ganz wesentliche vereinfachung für leute, die geometrien selbst erzeugen wollen, oder texturen als wesentlichen gestalterischen grundbaustein von 3d-chips verstehen. klar, wer wirklich weiss, wie 3d-datenformate funktionieren wird sich an irgendeiner stelle fragen, wie das funktioniert. aber dem typischen 3d-user ist es aber letztlich egal wie seine texturkoordinaten intern repräsentiert werden.
aber dieses detail schon vvvv anfängern aufdrücken zu müssen ist schlechtes design.
pitch on pole ist ein sehr gutes beispiel, was man mit vvvv machen kann - wie weit das gehen kann (und der patch wird endlich noch verständlicher, wenn man nichtmehr mit grid arbeiten muss) .
um diese art resultate muss es gehen.
sachen so zu machen, wie sie in anderen programmen üblicherweise gemacht werden, ist m.e. der falsche ansatz
dafür kennen auch viel zuwenige leute diese programme.
für Ansatz 2 stimmen
für ansatz 3 stimmen
official microsoft documentation about annotations and effects
scheint veraltet zu sein. und ab jetzt dann DXSAS
und dann gibts noch eine scripting sache irgendwie...
scheint aber alles noch nicht ausgereift zu sein. wir sollten uns daher auf die semantics beschränken.
anonymous user login
~2d ago
~2d ago
~10d ago
~12d ago
~13d ago
~17d ago
~17d ago
~24d ago
~1mth ago
~1mth ago