Hallo zusammen,
da die von GameMaker bereitgestellte Lichtengine sehr begrenzt und verbuggt ist, habe ich mich mal etwas mit Shadern beschäftigt und zufälligerweise etwas zum laufen gebracht, was funktioniert
(Bin darin sehr unerfahren)
Nun aber zu meinem Problem, wenn ich die d3d_transform_set_identity() - Funktion anwende und mein Objekt z.B. drehe wird das Licht so berechnet, als wäre mein Objekt noch nicht verdreht. Was am Ende dann falsche Ergebnisse liefert, wenn ich es drehe. Über Hilfe wäre ich sehr dankbar.
Der Draw Code von meinem Objekt:
Alles anzeigen
Fragment-Shader:
Alles anzeigen
MFG
da die von GameMaker bereitgestellte Lichtengine sehr begrenzt und verbuggt ist, habe ich mich mal etwas mit Shadern beschäftigt und zufälligerweise etwas zum laufen gebracht, was funktioniert

Nun aber zu meinem Problem, wenn ich die d3d_transform_set_identity() - Funktion anwende und mein Objekt z.B. drehe wird das Licht so berechnet, als wäre mein Objekt noch nicht verdreht. Was am Ende dann falsche Ergebnisse liefert, wenn ich es drehe. Über Hilfe wäre ich sehr dankbar.
Der Draw Code von meinem Objekt:
GML-Quellcode
- d3d_transform_set_identity()
- d3d_transform_add_rotation_y(90);
- d3d_transform_add_rotation_z(direction+180);
- d3d_transform_add_translation(x,y,0);
- shader_set(sh_light_range)
- shader_set_uniform_f(shader_pos_light, o_light.x-x, o_light.y-y , 0); //o_light.x und y wird minus x und y gerechnet, da durch d3d_transform_add_translation(x,y,0) die Position des Objekt auf (0|0|0) gesetzt und dann gedreht wird.
- d3d_draw_block(-4,-4,-4,4,4,4,tex,1,1);
- shader_reset()
- d3d_transform_set_identity()
Fragment-Shader:
GML-Quellcode
- //
- // Simple passthrough fragment shader
- //
- varying vec2 v_vTexcoord;
- varying vec4 v_vColour;
- varying vec3 v_vNormal;
- varying vec3 v_vPosition;
- uniform vec3 LightPos;
- void main()
- {
- vec3 PixelPos = v_vPosition;
- vec3 VectorToLight = normalize(LightPos - PixelPos);
- float BrightnessAngle = clamp(dot(VectorToLight,v_vNormal),0.,1.); // Winkel zwischen Oberfläche und Lichtposition wird berechnet. Flacher Winkel = Dunkler , senkrechter Winkel = hell
- vec3 position = PixelPos.xyz - LightPos.xyz;
- float BrightnessDistance = clamp(1.-length(position)/300.,0.,1.); // Helligkeit auf Distanz vermindern
- float Brightness = (BrightnessAngle*BrightnessDistance)+0.1; // Gesamte Helligkeit berechnen + 0.1 für Ambiente
- gl_FragColor = vec4(v_vColour.r*Brightness,v_vColour.g*Brightness,v_vColour.b*Brightness,v_vColour.a) * texture2D( gm_BaseTexture, v_vTexcoord );
- }
MFG
Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Dufner ()