Jump to content
  • Advertisement
Sign in to follow this  
NicoG

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

This topic is 1809 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
Advertisement

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!