Jump to content

  • Log In with Google      Sign In   
  • Create Account

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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 GothSeiDank   Members   -  Reputation: 156

Like
0Likes
Like

Posted 07 August 2013 - 02:26 AM

This is the error I get from YoYo's Game Maker:

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

C:\Users\xxxxx\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 ); 
############################################################################################

 
This is the Vertex Shader I apply:

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); 
}

This is the GML Code I call:
 

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();

I do not know where this error is coming from. If I uncomment "float power = 5.0" and use it instead of the uniform rim_power, then it works. 

I also get this error when I set rim power to any number that has anything different than .0 as last number. So e.g. 1.0 works, but 2.3 leads to this error. 

Any hint or insight is appreciated.


Edited by GothSeiDank, 07 August 2013 - 02:27 AM.

If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/

Sponsor:

#2 Nik02   Crossbones+   -  Reputation: 2824

Like
0Likes
Like

Posted 07 August 2013 - 04:10 AM

X3571 is a warning, not a fatal error. However, Game Maker seems to regard it as an error.

 

The warning text does suggest two workarounds - if you're sure that the power never should be negative, use the abs function to clamp the value to a positive range, or otherwise make sure that the shader logic never allows the pow function to be called with a negative power parameter. The shader compiler can deduce whether or not the parameter can ever be negative, based on the code that manipulates it.


Edited by Nik02, 07 August 2013 - 04:12 AM.

Niko Suni


#3 GothSeiDank   Members   -  Reputation: 156

Like
0Likes
Like

Posted 07 August 2013 - 05:00 AM

Thanks fixed it:

dp = pow(abs(dot(wvPosition, wvNormal) + 1.0), rim_power);

If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS