Author Topic: ObjReader FBO & PP  (Read 30944 times)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #90 on: June 07, 2019, 10:04:41 pm »
Quote
that I reload with shaders or wallpapers as needed.

Why not display shaders and wallpapers mixed altogether in the Listview, and act accordingly to the filename extension ?

Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #91 on: June 08, 2019, 07:00:52 am »
Because:

1. All preparatory work is done in response to a click to check/uncheck the Animation->Animate background menu in a centralized manner. Reloading is done very quickly both ways completely flicker-less for the list box.

2. Our wallpapers list is already quite long and takes noticeable time to scroll through.

3. When in a certain mode of operation, I prefer to see the palette of tools I can use to control my immediate environment. All irrelevant tools should be hidden not to obscure or distract my view.

Such was my design decision. I hope you'll support it too once started to work with it.
« Last Edit: June 08, 2019, 08:30:09 am by Michael Lobko-Lobanovsky »
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #92 on: June 08, 2019, 07:59:37 am »
A lot of parameters had to be tweaked in the Canyon shader to make it work with the textures almost like my demo did without tweaking. I also adjusted the camera not to fall through the rock walls. Took me several hours of work all in all...

The Caribbean shader (you know, sailing the night sea waters under the moon, stars, and clouds) will have to be tweaked in a similar way to make stars and clouds visible like in the demo/ShaderToy original.

I think we have differences in our standard texture loaders, mainly in handling the alpha layer. Yours turns out to be noticeably thinner to an extent where it breaks ShaderToy's existing coefficients...
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #93 on: June 08, 2019, 07:40:41 pm »
OK Patrice,

It's merger time. :)

0. Copy the entire \Animated folder into \Resource so that it becomes .\Resource\Animated.

1. Merge the files.

2. All shaders work as expected under my W10 but Caribbean.fs has not yet been tweaked to accept your textures.

3. Almost all shaders also work as expected on my ATi Radeon box except for Tori.fs and OblivionHUD.fs.

4. When MLL_DEV is #defined, OR is automatically compiled as a Win32 console subsystem program where you can use printf() and wprintf() to output your debug messages to the console.

5. You can launch OR-CUI as usual by double clicking its icon. Then it'll pop up its own console window.

6. You can also launch it from the Windows system console, e.g. by D&D-ing its icon there then hitting Enter. In this case, OR-CUI will use the system console for its debug output.

7. In both cases, you can toggle console visibility by pressing Alt+C.

8. When #define MLL_DEV is commented out, OR compiles into a Win32 GUI subsystem program as usual.

9. Last but not least, you do not have to comment out your printf() and wprintf() debug messages from the sources. If there's no console, then those messages are simply ignored.

The mods haven't yet been extensively tested and there may be some glitches present, e.g. if OR cannot read some shader file for some reason. I'll be fixing them as they are revealed.

Your comments and criticisms are very welcome. :)
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #94 on: June 08, 2019, 09:22:20 pm »
Thanks a bunch my friend !

Will report as soon as i have been able to check it, we have some unexpected visitors coming home right now…
Patrice
(Always working with the latest Windows version available...)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #95 on: June 08, 2019, 11:11:00 pm »
Quick report:

Everything is in order and seems to work as espected.

Suggestion:
A specific animation should be selected form the .mtl file, using
#wallpaper animation.fs
or
#wallpaper @animation.fs (when the shader is provided altogether with the model)
no need to use a new meta, the file extension is enough to figure what to do.

Comment:
Several shaders are slowing down OR, while some are very cooperative and seems to have almost no impact.

More to come tomorrow…

Excellent travail mon ami !


Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #96 on: June 09, 2019, 08:17:31 am »
Thank you Patrice! :)

Hope you slept well. Now it's time to:

1. Delete your existing \Animated folder (delete, don't merge!) and replace it with the one in the zip. (I made changes to textures and shaders but don't remember which and where)

2. Merge the two files in the zip with yours. They contain fixes to make the shaders runnable reliably. The glitch with textures was in fact my own fault with uniform locations. I'm sorry for that... :-[

Now all shaders including Caribbean run as expected.

Don't be too concerned about slow shaders. We'll speed them up eventually using non-MSAA FBOs and better (programmatically) anti-aliased OpenGL canvases.

For the time being, in order to ease up GPU load where necessary, you may use two hacks:

- switch Turbo from 60FPS to 30FPS; and/or
- uncheck Inspect->Use framebuffers; this will make the model aliased but it will bring down the load almost twice, even in the Canyon shader.

I agree to your proposition concerning the animated #wallpaper meta.

Enjoy! :)
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #97 on: June 09, 2019, 12:03:58 pm »
Everything went fine, thank you!


The current 2dclouds.fs is too jerky even when using the 2 hacks  :(

Thinking at loud voice:
I wonder what we could get, if adding support for 2D animation (GIF/PNG).
And also video loop.
Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #98 on: June 09, 2019, 01:04:46 pm »
On my GPU, unchecking Use framebuffers alone yields 25% usage in maximized, and 35% usage, in full screen modes with the clouds running absolutely smooth. However when trying to record the video, I'm also getting some jerkiness though the usage stays practically the same... ???

Please note that practically any shader that uses programmatic noise (real time smoke, clouds, haze etc.) is very likely to be heavy on the GPU.

Re. GIF/PNG, the image files are going to be real huge to keep at least a 30FPS frame rate with sufficient resolution.

Re. video, we probably aren't going to maintain image sharpness competitive with the high quality of rendering the model proper.

At any rate, those aren't the topics I'd be eager to explore any deeper at the moment... ::)

(Sorry for that funny selfie, it was unintentional ;D; but it shows that jerkiness adds only when the camera goes on...)
« Last Edit: June 09, 2019, 02:56:26 pm by Patrice Terrier »
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #99 on: June 09, 2019, 03:01:12 pm »
Here is mine…

And this is a new shader that i did try to use, but it fails miserably, what i am doing wrong with it?
And how do you do to retrieve the textures being used on the net?

Code: [Select]
// Protean clouds by nimitz (twitter: @stormoid)
// https://www.shadertoy.com/view/3l23Rh
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// Contact the author for other licensing options

uniform vec4 iDate; // (year, month, day, time in seconds) MLL: year/month/day not used
uniform vec3 iMouse; // mouse pixel coords. xy: current (if MLB down); if vec3 then z: click
uniform vec2 iResolution; // viewport resolution (in pixels)
uniform float iTime; // shader playback time (in seconds)
uniform sampler2D bwnoise_png; // noise in TU0

mat2 rot(in float a){float c = cos(a), s = sin(a);return mat2(c,s,-s,c);}
const mat3 m3 = mat3(0.33338, 0.56034, -0.71817, -0.87887, 0.32651, -0.15323, 0.15162, 0.69596, 0.61339)*1.93;
float mag2(vec2 p){return dot(p,p);}
float linstep(in float mn, in float mx, in float x){ return clamp((x - mn)/(mx - mn), 0., 1.); }
float prm1 = 0.;
vec2 bsMo = vec2(0);

vec2 disp(float t){ return vec2(sin(t*0.22)*1., cos(t*0.175)*1.)*2.; }

vec2 map(vec3 p) {
    vec3 p2 = p;
    p2.xy -= disp(p.z).xy;
    p.xy *= rot(sin(p.z+iTime)*(0.1 + prm1*0.05) + iTime*0.09);
    float cl = mag2(p2.xy);
    float d = 0.;
    p *= .61;
    float z = 1.;
    float trk = 1.;
    float dspAmp = 0.1 + prm1*0.2;
    for(int i = 0; i < 5; i++) {
        p += sin(p.zxy*0.75*trk + iTime*trk*.8)*dspAmp;
        d -= abs(dot(cos(p), sin(p.yzx))*z);
        z *= 0.57;
        trk *= 1.4;
        p = p*m3;
    }
    d = abs(d + prm1*3.)+ prm1*.3 - 2.5 + bsMo.y;
    return vec2(d + cl*.2 + 0.25, cl);
}

vec4 render(in vec3 ro, in vec3 rd, float time) {
    vec4 rez = vec4(0);
    const float ldst = 8.;
    vec3 lpos = vec3(disp(time + ldst)*0.5, time + ldst);
    float t = 1.5;
    float fogT = 0.;
    for(int i=0; i<130; i++) {
        if(rez.a > 0.99)break;

        vec3 pos = ro + t*rd;
        vec2 mpv = map(pos);
        float den = clamp(mpv.x-0.3,0.,1.)*1.12;
        float dn = clamp((mpv.x + 2.),0.,3.);

        vec4 col = vec4(0);
        if (mpv.x > 0.6) {
            col = vec4(sin(vec3(5.,0.4,0.2) + mpv.y*0.1 +sin(pos.z*0.4)*0.5 + 1.8)*0.5 + 0.5,0.08);
            col *= den*den*den;
            col.rgb *= linstep(4.,-2.5, mpv.x)*2.3;
            float dif =  clamp((den - map(pos+.8).x)/9., 0.001, 1. );
            dif += clamp((den - map(pos+.35).x)/2.5, 0.001, 1. );
            col.xyz *= den*(vec3(0.005,.045,.075) + 1.5*vec3(0.033,0.07,0.03)*dif);
        }

        float fogC = exp(t*0.2 - 2.2);
        col.rgba += vec4(0.06,0.11,0.11, 0.1)*clamp(fogC-fogT, 0., 1.);
        fogT = fogC;
        rez = rez + col*(1. - rez.a);
        t += clamp(0.5 - dn*dn*.05, 0.09, 0.3);
    }
    return clamp(rez, 0.0, 1.0);
}

float getsat(vec3 c) {
    float mi = min(min(c.x, c.y), c.z);
    float ma = max(max(c.x, c.y), c.z);
    return (ma - mi)/(ma+ 1e-7);
}

//from my "Will it blend" shader (https://www.shadertoy.com/view/lsdGzN)
vec3 iLerp(in vec3 a, in vec3 b, in float x) {
    vec3 ic = mix(a, b, x) + vec3(1e-6,0.,0.);
    float sd = abs(getsat(ic) - mix(getsat(a), getsat(b), x));
    vec3 dir = normalize(vec3(2.*ic.x - ic.y - ic.z, 2.*ic.y - ic.x - ic.z, 2.*ic.z - ic.y - ic.x));
    float lgt = dot(vec3(1.0), ic);
    float ff = dot(dir, normalize(ic));
    ic += 1.5*dir*sd*ff*lgt;
    return clamp(ic,0.,1.);
}

void mainImage(out vec4 gl_FragColor, in vec2 gl_FragCoord) {
    vec2 q = gl_FragCoord.xy/iResolution.xy;
    vec2 p = (gl_FragCoord.xy - 0.5*iResolution.xy)/iResolution.y;
    bsMo = (iMouse.xy - 0.5*iResolution.xy)/iResolution.y;

    float time = iTime*3.;
    vec3 ro = vec3(0,0,time);

    ro += vec3(sin(iTime)*0.5,sin(iTime*1.)*0.,0);

    float dspAmp = .85;
    ro.xy += disp(ro.z)*dspAmp;
    float tgtDst = 3.5;

    vec3 target = normalize(ro - vec3(disp(time + tgtDst)*dspAmp, time + tgtDst));
    ro.x -= bsMo.x*2.;
    vec3 rightdir = normalize(cross(target, vec3(0,1,0)));
    vec3 updir = normalize(cross(rightdir, target));
    rightdir = normalize(cross(updir, target));
    vec3 rd=normalize((p.x*rightdir + p.y*updir)*1. - target);
    rd.xy *= rot(-disp(time + 3.5).x*0.2 + bsMo.x);
    prm1 = smoothstep(-0.4, 0.4,sin(iTime*0.3));
    vec4 scn = render(ro, rd, time);

    vec3 col = scn.rgb;
    col = iLerp(col.bgr, col.rgb, clamp(1.-prm1,0.05,1.));

    col = pow(col, vec3(.55,0.65,0.6))*vec3(1.,.97,.9);

    col *= pow( 16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), 0.12)*0.7+0.3; //Vign

    gl_FragColor = vec4(col, 1.0);
}
« Last Edit: June 09, 2019, 05:41:14 pm by Michael Lobko-Lobanovsky »
Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #100 on: June 09, 2019, 05:03:13 pm »
Re. your video, yes, it is indeed slow and unacceptably jerky on your GPU. :'(

But it runs more or less OK on mine even with some reasonable model loaded. Probably you'd want to consider upgrading your video card if you can afford it? ::)

Re. the shader code you sent me, it is indeed very, very slow for me even in a windowed no-FBO 30FPS mode where my GPU usage is still 99 to 100%. Yet this furry wormhole is so spectacular I'm going to keep it. :)

Here's the code: (I didn't reformat it so you can easily WinDiff the two offending lines)
Code: [Select]
// Protean clouds by nimitz (twitter: @stormoid)
// https://www.shadertoy.com/view/3l23Rh
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// Contact the author for other licensing options

uniform vec4 iDate; // (year, month, day, time in seconds) MLL: year/month/day not used
uniform vec3 iMouse; // mouse pixel coords. xy: current (if MLB down); if vec3 then z: click
uniform vec2 iResolution; // viewport resolution (in pixels)
uniform float iTime; // shader playback time (in seconds)
//uniform sampler2D bwnoise_png; // noise in TU0

mat2 rot(in float a){float c = cos(a), s = sin(a);return mat2(c,s,-s,c);}
const mat3 m3 = mat3(0.33338, 0.56034, -0.71817, -0.87887, 0.32651, -0.15323, 0.15162, 0.69596, 0.61339)*1.93;
float mag2(vec2 p){return dot(p,p);}
float linstep(in float mn, in float mx, in float x){ return clamp((x - mn)/(mx - mn), 0., 1.); }
float prm1 = 0.;
vec2 bsMo = vec2(0);

vec2 disp(float t){ return vec2(sin(t*0.22)*1., cos(t*0.175)*1.)*2.; }

vec2 map(vec3 p) {
    vec3 p2 = p;
    p2.xy -= disp(p.z).xy;
    p.xy *= rot(sin(p.z+iTime)*(0.1 + prm1*0.05) + iTime*0.09);
    float cl = mag2(p2.xy);
    float d = 0.;
    p *= .61;
    float z = 1.;
    float trk = 1.;
    float dspAmp = 0.1 + prm1*0.2;
    for(int i = 0; i < 5; i++) {
        p += sin(p.zxy*0.75*trk + iTime*trk*.8)*dspAmp;
        d -= abs(dot(cos(p), sin(p.yzx))*z);
        z *= 0.57;
        trk *= 1.4;
        p = p*m3;
    }
    d = abs(d + prm1*3.)+ prm1*.3 - 2.5 + bsMo.y;
    return vec2(d + cl*.2 + 0.25, cl);
}

vec4 render(in vec3 ro, in vec3 rd, float time) {
    vec4 rez = vec4(0);
    const float ldst = 8.;
    vec3 lpos = vec3(disp(time + ldst)*0.5, time + ldst);
    float t = 1.5;
    float fogT = 0.;
    for(int i=0; i<130; i++) {
        if(rez.a > 0.99)break;

        vec3 pos = ro + t*rd;
        vec2 mpv = map(pos);
        float den = clamp(mpv.x-0.3,0.,1.)*1.12;
        float dn = clamp((mpv.x + 2.),0.,3.);

        vec4 col = vec4(0);
        if (mpv.x > 0.6) {
            col = vec4(sin(vec3(5.,0.4,0.2) + mpv.y*0.1 +sin(pos.z*0.4)*0.5 + 1.8)*0.5 + 0.5,0.08);
            col *= den*den*den;
            col.rgb *= linstep(4.,-2.5, mpv.x)*2.3;
            float dif =  clamp((den - map(pos+.8).x)/9., 0.001, 1. );
            dif += clamp((den - map(pos+.35).x)/2.5, 0.001, 1. );
            col.xyz *= den*(vec3(0.005,.045,.075) + 1.5*vec3(0.033,0.07,0.03)*dif);
        }

        float fogC = exp(t*0.2 - 2.2);
        col.rgba += vec4(0.06,0.11,0.11, 0.1)*clamp(fogC-fogT, 0., 1.);
        fogT = fogC;
        rez = rez + col*(1. - rez.a);
        t += clamp(0.5 - dn*dn*.05, 0.09, 0.3);
    }
    return clamp(rez, 0.0, 1.0);
}

float getsat(vec3 c) {
    float mi = min(min(c.x, c.y), c.z);
    float ma = max(max(c.x, c.y), c.z);
    return (ma - mi)/(ma+ 1e-7);
}

//from my "Will it blend" shader (https://www.shadertoy.com/view/lsdGzN)
vec3 iLerp(in vec3 a, in vec3 b, in float x) {
    vec3 ic = mix(a, b, x) + vec3(1e-6,0.,0.);
    float sd = abs(getsat(ic) - mix(getsat(a), getsat(b), x));
    vec3 dir = normalize(vec3(2.*ic.x - ic.y - ic.z, 2.*ic.y - ic.x - ic.z, 2.*ic.z - ic.y - ic.x));
    float lgt = dot(vec3(1.0), ic);
    float ff = dot(dir, normalize(ic));
    ic += 1.5*dir*sd*ff*lgt;
    return clamp(ic,0.,1.);
}

//void mainImage(out vec4 gl_FragColor, in vec2 gl_FragCoord) {
void main() {
    vec2 q = gl_FragCoord.xy/iResolution.xy;
    vec2 p = (gl_FragCoord.xy - 0.5*iResolution.xy)/iResolution.y;
    bsMo = (iMouse.xy - 0.5*iResolution.xy)/iResolution.y;

    float time = iTime*3.;
    vec3 ro = vec3(0,0,time);

    ro += vec3(sin(iTime)*0.5,sin(iTime*1.)*0.,0);

    float dspAmp = .85;
    ro.xy += disp(ro.z)*dspAmp;
    float tgtDst = 3.5;

    vec3 target = normalize(ro - vec3(disp(time + tgtDst)*dspAmp, time + tgtDst));
    ro.x -= bsMo.x*2.;
    vec3 rightdir = normalize(cross(target, vec3(0,1,0)));
    vec3 updir = normalize(cross(rightdir, target));
    rightdir = normalize(cross(updir, target));
    vec3 rd=normalize((p.x*rightdir + p.y*updir)*1. - target);
    rd.xy *= rot(-disp(time + 3.5).x*0.2 + bsMo.x);
    prm1 = smoothstep(-0.4, 0.4,sin(iTime*0.3));
    vec4 scn = render(ro, rd, time);

    vec3 col = scn.rgb;
    col = iLerp(col.bgr, col.rgb, clamp(1.-prm1,0.05,1.));

    col = pow(col, vec3(.55,0.65,0.6))*vec3(1.,.97,.9);

    col *= pow( 16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), 0.12)*0.7+0.3; //Vign

    gl_FragColor = vec4(col, 1.0);
}

Remarks:

-- you should not define any uniform sampler2D  variables in your shader code if you aren't using a matching texture;
-- you should use void main() directly avoiding void mainImage(foo, bar) that's in fact just another ShaderToy shader's subroutine a call to which their on-site parser inscribes transparently into their shader's final main() proc that remains hidden from you;
-- all GLSL intrinsic variables and varyings start with a gl_ ... prefix and are accessible from anywhere within that shader. Normally, you wouldn't need to pass them as parameters to the functions within the same shader.

The difference between variables, varyings and uniforms is as follows:

-- variables are used within the given module of a linked GLSL program: vertex, pixel, or geometry shader. Just like in C, they can be module-level or local to a procedure. They are declared the C way: float, bool, int, vec2/3/4 (of floats!), ivec2/3/4 (of ints!), etc.
-- varyings correspond to "extern" variables in C and are used for inter-module communication. They may only be declared at the module level but not within a procedure. Their declaration format is varying float, varying vec2, varying ivec3, etc.
-- uniforms are variables "extern" to the entire shader program and used for communication between your compiled OpenGL program and its compiled GLSL shaders. Communication is done via the OpenGL driver. Their declaration format is uniform float, uniform vec3, uniform sampler2D (for a texture unit), etc.

Re. ShaderToy textures, the most complete set of their textures I was able to find on the net is in the zip attached below.
« Last Edit: June 09, 2019, 05:40:28 pm by Michael Lobko-Lobanovsky »
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #101 on: June 09, 2019, 05:45:41 pm »
Thanks for the fixup!

From your video, that new shader works much smoother by you, mine is running at 17FPS while in default window mode and 8FPS maximized.

I shall download the latest nVIDIA drivers, version 430.86 from 05/27/2019, to see if it makes any difference  ???
Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #102 on: June 09, 2019, 05:54:06 pm »
Here are my FPS rates both at near 100% GPU usage. (Use framebuffers unchecked!)
« Last Edit: June 09, 2019, 05:56:29 pm by Michael Lobko-Lobanovsky »
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 1982
    • zapsolution
Re: ObjReader FBO & PP
« Reply #103 on: June 09, 2019, 06:09:59 pm »
With "Framebuffers" unchecked, it runs at 63FPS in windowed mode, and 28FPS in maximized mode, using the latest drivers.
Patrice
(Always working with the latest Windows version available...)

Michael Lobko-Lobanovsky

  • Administrator
  • *****
  • Posts: 1481
Re: ObjReader FBO & PP
« Reply #104 on: June 09, 2019, 06:25:08 pm »
I'm using the 430.86 drivers of the same date.

I'm more concerned about the GPU usage than the FPS rate. We can improve on FPS by optimizing the rendering pipeline, MSAA, material batching, and other such programmatic stuff.

But we can't do anything about the GPU usage because it is entirely determined by the GPU characteristics: clock frequencies, bus width, number of parallel graphics processors, video RAM technology and installed size -- we have no control over those, other than upgrade our cards some every couple of years.

After all, there's not so much time left for our hobbies for us to try and save a few more bucks we won't have time to spend anyway... ;)
Mike
(3.6GHz Intel Core i5 Quad w/ 16GB RAM, nVidia GTX 1060Ti w/ 6GB VRAM, Windows 7 Ultimate Sp1)