Hi @ all,
hab mich ein wenig mit Mathe bseonders der WInkelberechnung zweier 3d Vektoren beschäftigt.
Ich will einen Shader bauen der das Licht reflektiert und Flächen damit zum Glänzen bringt.
Mein Versuch ähnelt schon etwas einer Reflexion ist aber noch sehr unrealistisch.
So schaut der Shader aus:
Vertex Shader:
Alles anzeigen
Fragment Shader:
Ihr könnt ja den Shader selber mal ausprobieren. Wie gesagt er wird einer realistischen Reflexion nicht gerecht, aber es sieht schon irgendie nach einer Reflexion aus.
Kann mir vielleicht jemand helfen das Teil besser zumachen?
hab mich ein wenig mit Mathe bseonders der WInkelberechnung zweier 3d Vektoren beschäftigt.
Ich will einen Shader bauen der das Licht reflektiert und Flächen damit zum Glänzen bringt.
Mein Versuch ähnelt schon etwas einer Reflexion ist aber noch sehr unrealistisch.
So schaut der Shader aus:
Vertex Shader:
GML-Quellcode
- [/b]
- attribute vec3 in_Position; // (x,y,z)
- //attribute vec3 in_Normal; // (x,y,z) unused in this shader.
- attribute vec4 in_Colour; // (r,g,b,a)
- attribute vec2 in_TextureCoord; // (u,v)
- varying vec2 v_vTexcoord;
- varying vec3 v_vColour;
- varying float reflection;
- uniform vec3 Cam;
- uniform vec3 LightPos;
- void main()
- {
- vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
- gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
- v_vColour = in_Colour.rgb;
- v_vTexcoord = in_TextureCoord;
- vec3 normal, normal2, normal3;
- float angle, angle2;
- normal = normalize(object_space_pos.xyz);
- normal2 = normalize(Cam);
- normal3 = normalize(LightPos);
- angle = acos(dot(normal, normal2));
- angle2 = acos(dot(normal, normal3));
- reflection = max(float(mod((angle - angle2 + 360.0), 360.0) * 0.005), 0.7);
- }[b]
Fragment Shader:
Ihr könnt ja den Shader selber mal ausprobieren. Wie gesagt er wird einer realistischen Reflexion nicht gerecht, aber es sieht schon irgendie nach einer Reflexion aus.
Kann mir vielleicht jemand helfen das Teil besser zumachen?