Shader texture function not found

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
andreaszdw
Prole
Posts: 2
Joined: Tue Mar 05, 2019 6:31 pm

Shader texture function not found

Post by andreaszdw » Tue Mar 05, 2019 6:42 pm

Hello,

if I use this shader:

Code: Select all

extern Image iChannel0;
extern Image iChannel1;


float snoise(vec3 uv, float res)    // by trisomie21
{
    const vec3 s = vec3(1e0, 1e2, 1e4);
    
    uv *= res;
    
    vec3 uv0 = floor(mod(uv, res))*s;
    vec3 uv1 = floor(mod(uv+vec3(1.), res))*s;
    
    vec3 f = fract(uv); f = f*f*(3.0-2.0*f);
    
    vec4 v = vec4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z,
                  uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);
    
    vec4 r = fract(sin(v*1e-3)*1e5);
    float r0 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);
    
    r = fract(sin((v + uv1.z - uv0.z)*1e-3)*1e5);
    float r1 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);
    
    return mix(r0, r1, f.z)*2.-1.;
}

float freqs[4];


vec4 effect( vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords )
{
    freqs[0] = texture( iChannel1, vec2( 0.01, 0.25 ) ).x;
    freqs[1] = texture( iChannel1, vec2( 0.07, 0.25 ) ).x;
    freqs[2] = texture( iChannel1, vec2( 0.15, 0.25 ) ).x;
    freqs[3] = texture( iChannel1, vec2( 0.30, 0.25 ) ).x;

    float brightness    = freqs[1] * 0.25 + freqs[2] * 0.25;
    float radius        = 0.24 + brightness * 0.2;
    float invRadius     = 1.0/radius;
    
    vec3 orange         = vec3( 0.8, 0.65, 0.3 );
    vec3 orangeRed      = vec3( 0.8, 0.35, 0.1 );
    float time      = iTime * 0.1;
    float aspect    = iResolution.x/iResolution.y;
    vec2 uv         = screen_coords.xy / iResolution.xy;
    vec2 p          = -0.5 + uv;
    p.x *= aspect;

    float fade      = pow( length( 2.0 * p ), 0.5 );
    float fVal1     = 1.0 - fade;
    float fVal2     = 1.0 - fade;
    
    float angle     = atan( p.x, p.y )/6.2832;
    float dist      = length(p);
    vec3 coord      = vec3( angle, dist, time * 0.1 );
    
    float newTime1  = abs( snoise( coord + vec3( 0.0, -time * ( 0.35 + brightness * 0.001 ), time * 0.015 ), 15.0 ) );
    float newTime2  = abs( snoise( coord + vec3( 0.0, -time * ( 0.15 + brightness * 0.001 ), time * 0.015 ), 45.0 ) );  
    for( int i=1; i<=7; i++ ){
        float power = pow( 2.0, float(i + 1) );
        fVal1 += ( 0.5 / power ) * snoise( coord + vec3( 0.0, -time, time * 0.2 ), ( power * ( 10.0 ) * ( newTime1 + 1.0 ) ) );
        fVal2 += ( 0.5 / power ) * snoise( coord + vec3( 0.0, -time, time * 0.2 ), ( power * ( 25.0 ) * ( newTime2 + 1.0 ) ) );
    }
    
    float corona        = pow( fVal1 * max( 1.1 - fade, 0.0 ), 2.0 ) * 50.0;
    corona              += pow( fVal2 * max( 1.1 - fade, 0.0 ), 2.0 ) * 50.0;
    corona              *= 1.2 - newTime1;
    vec3 sphereNormal   = vec3( 0.0, 0.0, 1.0 );
    vec3 dir            = vec3( 0.0 );
    vec3 center         = vec3( 0.5, 0.5, 1.0 );
    vec3 starSphere     = vec3( 0.0 );
    
    vec2 sp = -1.0 + 2.0 * uv;
    sp.x *= aspect;
    sp *= ( 2.0 - brightness );
    float r = dot(sp,sp);
    float f = (1.0-sqrt(abs(1.0-r)))/(r) + brightness * 0.5;
    if( dist < radius ){
        corona          *= pow( dist * invRadius, 24.0 );
        vec2 newUv;
        newUv.x = sp.x*f;
        newUv.y = sp.y*f;
        newUv += vec2( time, 0.0 );
        
        vec3 texSample  = texture( iChannel0, newUv ).rgb;
        float uOff      = ( texSample.g * brightness * 4.5 + time );
        vec2 starUV     = newUv + vec2( uOff, 0.0 );
        starSphere      = texture( iChannel0, starUV ).rgb;
    }
    
    float starGlow  = min( max( 1.0 - dist * ( 1.0 - brightness ), 0.0 ), 1.0 );
    color.rgb   = vec3( f * ( 0.75 + brightness * 0.3 ) * orange ) + starSphere + corona * orange + starGlow * orangeRed;
    color.a     = 1.0;
    return color;
}


I got this error:

Code: Select all

Error

Error validating pixel shader code:
Line 33: ERROR: 'love_texture' : no matching overloaded function found 
Line 33: ERROR: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.


Traceback

[C]: in function 'newShader'
SpaceMapScreen.lua:38: in function 'init'
yonaba/30log.lua:58: in function 'new'
ScreenStack.lua:35: in function 'push'
main.lua:69: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall
'
The problem seems to be the texture function. I found that this function is availabe since GLSL version 120. But I think löve uses OpenGL Version 3. So this function is included, or am I wrong. What is here the problem?

If I use

Code: Select all

love.graphics.getSupported()
it shows me, that glsl3 is true.

User avatar
slime
Solid Snayke
Posts: 2820
Joined: Mon Aug 23, 2010 6:45 am
Location: Nova Scotia, Canada
Contact:

Re: Shader texture function not found

Post by slime » Tue Mar 05, 2019 10:30 pm

The function is only available in GLSL 1.30 or newer (and love uses GLSL 1.20 by default) - you can opt into GLSL 3.30 by putting "#pragma language glsl3" at the very top of the shader (without quotes).

However, if you just rename all the "texture" calls to "Texel" instead, it will work in all GLSL versions - love provides that function which calls either texture() or texture2D() depending on the underlying GLSL version, so you don't have to write different shaders for different versions.

andreaszdw
Prole
Posts: 2
Joined: Tue Mar 05, 2019 6:31 pm

Re: Shader texture function not found

Post by andreaszdw » Wed Mar 06, 2019 5:22 am

Perfect, that's it.....

Post Reply

Who is online

Users browsing this forum: Jugbot and 5 guests