Fehler in GLSL: pow(f, e) will not work for negative f



  • ___________________________________________
    ############################################################################################
    FATAL ERROR in Vertex Shader compilation
    ShaderName: sh_rimlighting

    C:\Users\scorcher24\AppData\Local\Temp\gm_ttt_77174\memory(182,8): warning X3571: pow(f, e) will not work for negative f, use abs(f) or conditionally handle negative values if you expect them

    at gml_Object_obj3DPlanet_Draw_0 (line 27) - shader_set( sh_rimlighting );
    ############################################################################################

    Der Vertex Shader:

    attribute vec3 in_Position;                  // (x,y,z)
    attribute vec4 in_Colour;                    // (r,g,b,a)
    attribute vec2 in_TextureCoord;              // (u,v)
    attribute vec3 in_Normal;                    // (x,y,z)
    
    varying vec2 v_vTexcoord;
    varying vec4 v_vColour;
    varying float dp;
    
    uniform float rim_power; //Increase to reduce the effect or decrease to increase the effect
    
    void main()
    {
        gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * vec4( in_Position, 1.0);
    
        v_vColour = in_Colour;
        v_vTexcoord = in_TextureCoord;
    
        vec3 wvPosition = normalize((gm_Matrices[MATRIX_WORLD_VIEW] * vec4(in_Position, 1.0)).xyz);
        vec3 wvNormal = normalize((gm_Matrices[MATRIX_WORLD_VIEW] * vec4(in_Normal, 0.0)).xyz);
        //float power = 5.0; //Increase to reduce the effect or decrease to increase the effect
        dp = pow(dot(wvPosition, wvNormal) + 1.0, rim_power);
    }
    

    Code:

    var rim_power = shader_get_uniform( sh_rimlighting, "rim_power" );
    d3d_transform_add_rotation_x( 90 );
    d3d_transform_add_rotation_y( planet_angle );
    d3d_transform_add_scaling( planet_scale, planet_scale, planet_scale );
    d3d_transform_add_translation( x, y + offset_y, 0 );
    shader_set( sh_rimlighting );
    shader_set_uniform_f( rim_power, 5.0 );
    d3d_model_draw( modPlanet, 0, 0, 0, background_get_texture(tex_mars) );
    shader_reset(); 
    d3d_transform_set_identity();
    

    Das tritt nur auf, wenn ich versuche die Variable "power" die im Shader auskommentiert ist, als uniform zu führen, damit ich nicht für jeden Planeten einen eigenen rimshader brauche mit versch. Werten für power.

    Kennt jemand die Fehlermeldung und hat vllt eine Idee woran das liegt? In manchen Foren las ich davon, dass es wohl Treiber- oder Grakaprobleme sind, aber ich habe einen nagelneue 7850, daher denke ich jetzt nicht, dass es an meiner Graka unbedingt liegt, auch wenn ich das nicht komplett ausschliesse.
    Danke für jede Hilfe.

    ps.: Ja, ich verwende hier GameMaker, Scriptsprache ist GML und Shadersprache GLSL ES, wie man erkennt.


  • Mod

    das ist kein fehler, das ist eine warning, das liegt daran dass pow mittels exp(e*log(f)) gemacht wird und log(-1)...



  • Jo, GMS verarbeitet es aber als Fehler und das Programm verweigert die Ausführung.
    Daher müsste ich das irgendwie lösen. Mathe is a bissl meine schwache Seite, also wäre ich um eine Lösung und vllt Erklärung dazu dankbar.


  • Mod

    steht doch in der warning, use abs
    pow(abs(f),e);



  • Okay, das war ne klare Antwort :D.
    Danke, das hat es behoben. Ich wusste nur nicht um welchen Teil ich das ABS spannen sollte. Ich war vllt auch ein wenig blind, aber passiert, hehe.



  • Scorcher24 schrieb:

    Okay, das war ne klare Antwort :D.
    Danke, das hat es behoben. Ich wusste nur nicht um welchen Teil ich das ABS spannen sollte. Ich war vllt auch ein wenig blind, aber passiert, hehe.

    wobei abs eventuell nicht so prall ist, max(0,f) sollte auch gehen und hat ein wenig mehr sinn. beides kostet eine instruktion extra.


Anmelden zum Antworten