Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:01

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Triplanares Mapping im GLSL-Shader?
BeitragVerfasst: Fr Okt 06, 2006 13:59 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
Hallo liebe Forenbenutzer,

ich bin neu hier und arbeite mich seit ein paar Tagen in das Thema Shaderprogrammierung ein. Ich habe schon ein paar nette Ergebnisse erzielt, nicht zuletzt durch die diversen Tutorials und Codebeispiele im Netz. Ich möchte einen Shader schreiben, der mir ein Lightmap basierend auf UV-Kanal 1 und ein Colormap auf UV-Kanal 2 darstellt. UV-Kanal 1 erzeuge ich in 3D Studio Max. Das 3D-Dateiformat meiner Anwendung liest defaultmäßig nur UV-Kanal 1 ein.
Per Shader kann ich nun den UV-Kanal 2 generieren, hier möchte ich z.B. eine feine Lederstruktur haben, die unabhängig von den UV-Koordinaten des Lightmaps ist. Bis jetzt habe ich Code für ein planares Mapping, ausgehend vom Viewpoint des Betrachters. Dieses Mapping ist permanent. Nun möchte ich jedoch ein triplanares Map erzeugen, das ebenfalls permanent ist, jedoch eben die gleiche Textur von oben-unten, von der Seite und von vorn-hinten mappt, ähnlich dem Box-Mapping in 3D Studio Max. Im Internet habe ich bisher keine Hilfe dazu gefunden, nur planares und Cubemapping (Environmentmapping) wird behandelt. Kann mir jemand helfen?
Ich fände es auch super, wenn diese Mapgenerierung nicht vom Standpunkt des Betrachters ausgeht, sondern von den Welt- oder Objektkoordinaten.
Freue mich über eure Hilfe. Hier ist der Samplecode für die Erzeugung eines Planaren Maps:

vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
vec3 transformedNormal = normalize(gl_NormalMatrix * gl_Normal);
ftexgen(transformedNormal, ecPosition);

void ftexgen(in vec3 normal, in vec4 ecPosition)
{
gl_TexCoord[1].s = dot( gl_Vertex, gl_ObjectPlaneS[1] )
gl_TexCoord[1].t = dot( gl_Vertex, gl_ObjectPlaneT[1] )
}


viele Grüße

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 06, 2006 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kann die Texture 3x jeweils auf die X,Y,Z Ebene planar mappen und die Ergebnisse mit dem Betrag der entsprechenden Komponenente des Normalvektors gewichten. Das erzeugt einen sehr gleichmäßigen Verlauf.
Meintest du so etwas?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 07, 2006 00:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Generiere sie ausserhalb des Shaders im Loader, ich würde eventuell dann die Möglichkeit nutzen und die nachbarvertex verwenden.
Du kann z.B. den Abstand zwischen 2 vektoren einer fläche berechnen und mit einer konstante multiplizieren.
Und auf die koordinaten des schon berechneten vektors addieren.
So wird es recht gleichmässig gekachelt aufgetragen.
Mit der Konstante kannst du dann die Skalierung regeln.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 08, 2006 19:17 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
LarsMiddendorf hat geschrieben:
Man kann die Texture 3x jeweils auf die X,Y,Z Ebene planar mappen und die Ergebnisse mit dem Betrag der entsprechenden Komponenente des Normalvektors gewichten. Das erzeugt einen sehr gleichmäßigen Verlauf.
Meintest du so etwas?


Hallo Lars, ich war das WE über nicht da, daher meine verspätete Antwort. Ja genau, ich meinte damit, jeweils ein planares Mapping für die X, Y und Z-Ebene zu erstellen, wobei jeweils nur die Vertexe, deren Normale nicht weiter als ~ 90° von der Ebene entfernt sind, in den UV-Koordinaten der jeweiligen Plane enthalten sind (mitgemappt werden), so dass an den Übergangsvertexen Nähte entstehen (die Nahtvertices müssen doppelt vorhanden sein?). Dieses mapping erzeugt ja recht schnell gute Ergebnisse, man sieht halt immer eine Naht an den Kanten, was aber nicht so schlimm ist.


Die zusätzliche Gewichtung über den Normalenvektor ist auch sehr interessant, da sie bessere Ergebnisse erzeugt.

Ich wollte dich fragen, ob Du mir evtl. mit Code weiterhelfen kannst, wie man dieses triplanare Mapping (frontal jeweils von den 3 Ebenen) erzeugt, aber nicht in einem Preloader, sondern dem Shader direkt. Denn ich habe nicht die Möglichkeit, in die Software einzugreifen, die wir benutzen, sie kann halt Shader laden.

Danke!

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 08, 2006 19:20 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
TAK2004 hat geschrieben:
Generiere sie ausserhalb des Shaders im Loader, ich würde eventuell dann die Möglichkeit nutzen und die nachbarvertex verwenden.
Du kann z.B. den Abstand zwischen 2 vektoren einer fläche berechnen und mit einer konstante multiplizieren.
Und auf die koordinaten des schon berechneten vektors addieren.
So wird es recht gleichmässig gekachelt aufgetragen.
Mit der Konstante kannst du dann die Skalierung regeln.



Hi, ich kann leider nicht einen Loader programmieren, da die Software, die wir verwenden, nicht offengelegt ist, bzw. kein Opengl-Skripting ausser der Shaderprogrammierung unterstützt.
Die Theorie des Mapping verstehe ich, denke ich. Könnte mir jemand von Euch evtl. mit Code weiterhelfen, der anstelle meines planaren Mappings von einer Seite benutzt werden kann? (Mein Beispielcode). Ich möchte halt sehr komplexe Modelle, egal wie viele Vertices sie haben, automatisiert mappen, ohne einzeln auf die Vertices zuzugreifen geschweige sie denn zu kennen. Oder ist das nicht so einfach?

viele Grüße

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Problem teilweise gelöst
BeitragVerfasst: Do Okt 12, 2006 17:21 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
Hallo Forenbenutzer, das Problem mit dem triplanaren Mapping wurde teilweise gelöst, siehe untenstehender Code, es funktioniert direkt im Shader.
Allerdings habe ich nun das Problem, dass zwischen jeweils 2 Kantenvertices, die z.B. auf die x und die y-Plane gemappt werden, starke Verzerrungen der Textur auftreten, da der Renderer den gesamten Texturraum zwischen den beiden Koordinaten auf ein vergleichsweise kleines Dreieck mappt. Wie kann man das umgehen? 3D-Software wie Max beherrscht das Mapping ohne sichtbare Verzerrungen, wenn man die UV-Koordinaten bricht. Muss ein Vertex dafür 2 Koordinatensets haben?

uniform vec3 planeSize;


void main(){
vec4 pos = vec4(gl_Vertex);
vec3 n = vec3(gl_Normal);

n.x = abs(n.x);
n.y = abs(n.y);
n.z = abs(n.z);

// x-y plane
if ((n.x > n.y) && (n.x > n.z)) {
gl_TexCoord[1].s = pos.y*planeSize.y;
gl_TexCoord[1].t = pos.z*planeSize.z;
} else if ((n.y > n.x) && (n.y > n.z)) {
gl_TexCoord[1].s = pos.x*planeSize.x;
gl_TexCoord[1].t = pos.z*planeSize.z;
} else {
gl_TexCoord[1].s = pos.x*planeSize.x;
gl_TexCoord[1].t = pos.y*planeSize.y;
}
}


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 14:10 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
Kann mir jemand vielleicht etwas zu der Theorie dahinter verraten?
Um nur eine Naht an der Polygonkante zu erhalten, müssten doch die Saumvertices 2 Koordinatensets enthalten, eines aus jeder angrenzenden Plane, oder irre ich mich da? Im Moment hat mein Mesh ja eine gestauchte Textur zwischen 2 Vertices, da ihre Koordinaten durch die um 90° auseinanderliegenden Projektionsvektoren recht weit auseinanderliegen. Will ich wie in 3DS-Max ein UVW-Mapping (Quader oder Box) erhalten, so müsste nur an der Kante eine Naht sichtbar sein. Wie erreicht OpenGl das?
Über jede Hilfe bin ich dankbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Lösung gefunden
BeitragVerfasst: Sa Okt 21, 2006 22:34 
Offline
DGL Member

Registriert: Do Okt 05, 2006 09:36
Beiträge: 6
Wohnort: Hamburg
Falls es jemanden interessiert. Das triplanare Mapping ist nicht im Shader zu lösen, und da wäre es auch nicht performant.
Für ein triplanares Mapping muss ich die Normale eines Polygons mit der Mappingebene vergleichen, nicht die Normale der einzelnen Vertexe, und dann den zugehörigen Vertexen die Texturkoordinaten zuweisen. Die Geometrie wird intern mit mehrfachen Vertexen vorgehalten, d.h. ein Würfel hat nicht acht, sondern 32 Scheitelpunkte. Nur dadurch ist triplanares Mapping möglich.

Falls jemand das schon mal getan hat, in einer 3D-Applikation per Code, würde ich mich über ein Feedback freuen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]