1
German corner / Probleme mit eigenem Shader
« on: September 04, 2013, 05:07:48 pm »
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:
FragmentShader:
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?
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: [Select]
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;
}
FragmentShader:
Code: [Select]
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);
}
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?