Jump to content

View more

Image of the Day

雑魚は多めにして、爽快感重視にしつつ・・・(´・ω・`)
早いとこ、ベースを作って、完成にもっていかないとね。
タイトルもまだ迷ってるだよなぁ。 
#indiedev  #indiegame #screenshotsaturday https://t.co/IwVbswGrhe
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.


Sign up now

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

4: Adsense

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   

172
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/

#2 Nik02   Members   

4297
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   

172
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.