General > German corner

Probleme mit eigenem Shader

(1/3) > >>

Gidy:
Hallo zusammen,

Ich implementiere gerade eine Visualsierung von 3D-Modellen und möchte gerne abhängig vom Lichteinfallswinkel die Farbe eines Polygons verändern. (Rot = senkrechter Einfall , Schwarz = Parallel zum Lichtstrahl) und zwischen Werte dementsprechend mit einer Interpoliertenfarbe darstellen.


1. Mein erster Ansatz war imm die Polygontexturen über den Texturenmanager jeweils einzelen anzupassen. Dazu hab ich die Normalenberechnet (kann man sich auch von JPCT ausgeben lassen) und dan mit dem Richtungsvektor der Lichtquelle den Einfallswinkel berechnet und anschließend die entsprechende Farbe gesetzt. Bei zu großen Objekten war diese Variante sehr langsam. (Hab das immer in meiner update() Methode des Renderthreads gemacht).

2. Als zweiten Ansatz hab ich dan gedacht ich greife auf Shader zurück, da diese ja wesentlich schneller berechnet werden. Im groben und ganzen funktioniert es auch, siehe Darstellung des Flugzeuges. Nur wenn ich nur ein Objekten mit geringer Polygonanzal und Flacheflächen lade geht irgendwas schief (Siehe kleines Bild links oben), im ShaderDesigner (Rechts kleine Bild oben) hingegen wird alles korrekt dargestellt.

Jemand vieleicht eine Idee woran das liegen könnte? Meine Vermutung ist das ich irgendwas mit der Normalenberechnung der Vertex falsch mache.




VertexShader:


* lightDir - Richtungsvektor der Lichtquelle (ich benutze momentan den Vektor (0,0,1)
* colors - Liste von Farben zwischen denen Interpoliert wird (Schwarz,Blaui,Cyan,Grün,Gelb,Orange,Rot)
* interpolation- Mit wievielen zwischenschritten Interpoliert werden soll.  (255)

--- Code: ---uniform vec3 lightDir ;
uniform vec3 colors[6] ;
uniform int interpolation;
varying float intensity;
void main()
{
gl_Position = ftransform();
                 
                //Berechnet den Winkel zwischen der Normalen und der lightDir
intensity =degrees(asin(dot(lightDir,gl_NormalMatrix * gl_Normal)))/90.0;

}

--- End code ---

FragmentShader:

--- Code: ---uniform vec3 lightDir;
uniform vec3 colors[6];
uniform int interpolation;
varying float intensity;

void main()
{
int colorCount=interpolation*colors.length;

float x=float(interpolation)*colors.length*intensity;

                //Berechnen der ersten Farbe
int color1ID=int(x/float(interpolation))-1;
int color2ID=color1ID+1;
               //Berechnnung des Factors für die Interpolation
float factor=fract(x/float(interpolation));

vec3  c0=colors[color1ID];
vec3  c1=colors[color2ID];

gl_FragColor=vec4(mix(c0,c1,factor),1.0);

}


--- End code ---

 PS: Gib bestimmt noch wesentlich schönere Varianten einen Shader zu programmieren, aber ich denk für meinen ersten ist der bis auf den Fehler doch gelungen :-P

Edit1: Welche glsl Versionen werden eigentlich von jPCT unterstützt?

EgonOlsen:
Per Default berechnet jPCT die Normalen selber und zwar basierend auf den Normalen der angrenzenden Flächen. Wenn du das nicht willst, musst du die Normalen von dem 3D-Editor deiner Wahl entsprechend berechnen lassen, als OBJ exportieren, http://www.jpct.net/doc/com/threed/jpct/Config.html#useNormalsFromOBJ auf true setzen und dann das Ding laden. Dann müsste es eigentlich eher so aussehen, wie du es haben willst. Hier steht noch ein bisschen was zu den Hintergründen: http://www.jpct.net/forum2/index.php/topic,2798.0.html

Gidy:
Hmm, ich gehe zwar ungern den Umweg mit ein extra Dateiformat, da ich dann ein Converter schreiben muss. Aber es scheint so als ob das obj-Format ziemlich nah an dem Dateiformat dran ist, was ich sowieso habe (Firmen internes Format).

Da werde ich das mal ausprobieren und meine Normalen entsprechend setzen.

Mal schauen ob ich das morgen hinbekomme :-)

Ansonsten benutz ich wieder den Texturenmanager und ändere meine Polygone einzeln. Wie ich vohin gesehen hab, hast du ja in Version 1.27 die Performance verbessert.

Gidy:
Hat wunderbar funktioniert mit dem Konvertieren und benutzen des Formates. Nun sieht alles toll aus :-)



Kann es aber sein das die Funktion object3D.getTransformedCenter() nicht mehr funktioniert, wenn ich dei Objekte als .obj-File lade? Ich habe damit vorher alle meine Objekte in den Ursprung des Koordinatensystems gesetzt, nun bekomm ich nur noch den Vektor(0,0,0) raus und meine Objekte sind nicht im Ursprung :-/

EgonOlsen:
Nein, da sehe ich keinen Zusammenhang. Wenn da der Ursprung raus kommt, dann ist das auch der Ursprung. Lass dir mal getCenter und getWorldTransformation ausgeben.

Navigation

[0] Message Index

[#] Next page

Go to full version