Page 1 of 1

Shader texture function not found

Posted: Tue Mar 05, 2019 6:42 pm
by andreaszdw
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.

Re: Shader texture function not found

Posted: Tue Mar 05, 2019 10:30 pm
by slime
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.

Re: Shader texture function not found

Posted: Wed Mar 06, 2019 5:22 am
by andreaszdw
Perfect, that's it.....