mirror of
https://github.com/psychopy/psychojs.git
synced 2025-05-10 18:50:54 +00:00
wgl1 shaders for gratingStim;
This commit is contained in:
parent
24c08055a0
commit
8eee61cf4e
@ -28,6 +28,21 @@ import radRampShader from "./shaders/radRampShader.frag";
|
|||||||
import raisedCosShader from "./shaders/raisedCosShader.frag";
|
import raisedCosShader from "./shaders/raisedCosShader.frag";
|
||||||
import radialStim from "./shaders/radialShader.frag";
|
import radialStim from "./shaders/radialShader.frag";
|
||||||
|
|
||||||
|
import defaultQuadVertWGL1 from "./shaders/wgl1/defaultQuad.vert";
|
||||||
|
import imageShaderWGL1 from "./shaders/wgl1/imageShader.frag";
|
||||||
|
import sinShaderWGL1 from "./shaders/wgl1/sinShader.frag";
|
||||||
|
import sqrShaderWGL1 from "./shaders/wgl1/sqrShader.frag";
|
||||||
|
import sawShaderWGL1 from "./shaders/wgl1/sawShader.frag";
|
||||||
|
import triShaderWGL1 from "./shaders/wgl1/triShader.frag";
|
||||||
|
import sinXsinShaderWGL1 from "./shaders/wgl1/sinXsinShader.frag";
|
||||||
|
import sqrXsqrShaderWGL1 from "./shaders/wgl1/sqrXsqrShader.frag";
|
||||||
|
import circleShaderWGL1 from "./shaders/wgl1/circleShader.frag";
|
||||||
|
import gaussShaderWGL1 from "./shaders/wgl1/gaussShader.frag";
|
||||||
|
import crossShaderWGL1 from "./shaders/wgl1/crossShader.frag";
|
||||||
|
import radRampShaderWGL1 from "./shaders/wgl1/radRampShader.frag";
|
||||||
|
import raisedCosShaderWGL1 from "./shaders/wgl1/raisedCosShader.frag";
|
||||||
|
import radialStimWGL1 from "./shaders/wgl1/radialShader.frag";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Grating Stimulus.
|
* Grating Stimulus.
|
||||||
*
|
*
|
||||||
@ -253,6 +268,125 @@ export class GratingStim extends VisualStim
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static #SHADERSWGL1 = {
|
||||||
|
imageShader: {
|
||||||
|
shader: imageShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sin: {
|
||||||
|
shader: sinShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sqr: {
|
||||||
|
shader: sqrShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
saw: {
|
||||||
|
shader: sawShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tri: {
|
||||||
|
shader: triShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uPeriod: 1.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sinXsin: {
|
||||||
|
shader: sinXsinShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sqrXsqr: {
|
||||||
|
shader: sqrXsqrShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 1.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
circle: {
|
||||||
|
shader: circleShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uRadius: 1.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
gauss: {
|
||||||
|
shader: gaussShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uA: 1.0,
|
||||||
|
uB: 0.0,
|
||||||
|
uC: 0.16,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cross: {
|
||||||
|
shader: crossShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uThickness: 0.2,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
radRamp: {
|
||||||
|
shader: radRampShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uSqueeze: 1.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
raisedCos: {
|
||||||
|
shader: raisedCosShaderWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uBeta: 0.25,
|
||||||
|
uPeriod: 0.625,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
radialStim: {
|
||||||
|
shader: radialStimWGL1,
|
||||||
|
uniforms: {
|
||||||
|
uFreq: 20.0,
|
||||||
|
uPhase: 0.0,
|
||||||
|
uColor: [1., 1., 1.],
|
||||||
|
uAlpha: 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default size of the Grating Stimuli in pixels.
|
* Default size of the Grating Stimuli in pixels.
|
||||||
*
|
*
|
||||||
@ -533,9 +667,21 @@ export class GratingStim extends VisualStim
|
|||||||
2
|
2
|
||||||
);
|
);
|
||||||
geometry.addIndex([0, 1, 2, 0, 2, 3]);
|
geometry.addIndex([0, 1, 2, 0, 2, 3]);
|
||||||
const vertexSrc = defaultQuadVert;
|
let vertexSrc;
|
||||||
const fragmentSrc = GratingStim.#SHADERS[shaderName].shader;
|
let fragmentSrc;
|
||||||
const uniformsFinal = Object.assign({}, GratingStim.#SHADERS[shaderName].uniforms, uniforms);
|
let uniformsFinal;
|
||||||
|
if (this._win._renderer.context.webGLVersion >= 2)
|
||||||
|
{
|
||||||
|
vertexSrc = defaultQuadVert;
|
||||||
|
fragmentSrc = GratingStim.#SHADERS[shaderName].shader;
|
||||||
|
uniformsFinal = Object.assign({}, GratingStim.#SHADERS[shaderName].uniforms, uniforms);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vertexSrc = defaultQuadVertWGL1;
|
||||||
|
fragmentSrc = GratingStim.#SHADERSWGL1[shaderName].shader;
|
||||||
|
uniformsFinal = Object.assign({}, GratingStim.#SHADERSWGL1[shaderName].uniforms, uniforms);
|
||||||
|
}
|
||||||
const shader = PIXI.Shader.from(vertexSrc, fragmentSrc, uniformsFinal);
|
const shader = PIXI.Shader.from(vertexSrc, fragmentSrc, uniformsFinal);
|
||||||
return new PIXI.Mesh(geometry, shader);
|
return new PIXI.Mesh(geometry, shader);
|
||||||
}
|
}
|
||||||
|
26
src/visual/shaders/wgl1/circleShader.frag
Normal file
26
src/visual/shaders/wgl1/circleShader.frag
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Circle Shape.
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates a filled circle shape with sharp edges.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uRadius;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
float s = (1. - step(uRadius, length(uv * 2. - 1.))) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
28
src/visual/shaders/wgl1/crossShader.frag
Normal file
28
src/visual/shaders/wgl1/crossShader.frag
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* Cross Shape.
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates a filled cross shape with sharp edges.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uThickness;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
float sx = step(uThickness, length(uv.x * 2. - 1.));
|
||||||
|
float sy = step(uThickness, length(uv.y * 2. - 1.));
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
float s = (1. - sx * sy) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
13
src/visual/shaders/wgl1/defaultQuad.vert
Normal file
13
src/visual/shaders/wgl1/defaultQuad.vert
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
attribute vec2 aVertexPosition;
|
||||||
|
attribute vec2 aUvs;
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
uniform mat3 translationMatrix;
|
||||||
|
uniform mat3 projectionMatrix;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vUvs = aUvs;
|
||||||
|
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||||
|
}
|
32
src/visual/shaders/wgl1/gaussShader.frag
Normal file
32
src/visual/shaders/wgl1/gaussShader.frag
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Gaussian Function.
|
||||||
|
* https://en.wikipedia.org/wiki/Gaussian_function
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates a 2d Gaussian image as if 1d Gaussian graph was rotated arount Y axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
uniform float uA;
|
||||||
|
uniform float uB;
|
||||||
|
uniform float uC;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
float c2 = uC * uC;
|
||||||
|
float x = length(uv - .5);
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
float g = uA * exp(-pow(x - uB, 2.) / c2 * .5) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(g) * uColor * .5 + .5, 1.) * uAlpha;
|
||||||
|
}
|
29
src/visual/shaders/wgl1/imageShader.frag
Normal file
29
src/visual/shaders/wgl1/imageShader.frag
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Image shader.
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Renders passed in image with applied effects.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform sampler2D uTex;
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
vec4 s = texture2D(uTex, vec2(uv.x * uFreq + uPhase, uv.y));
|
||||||
|
s.xyz = s.xyz * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(s.xyz * uColor * .5 + .5, s.a) * uAlpha;
|
||||||
|
}
|
27
src/visual/shaders/wgl1/radRampShader.frag
Normal file
27
src/visual/shaders/wgl1/radRampShader.frag
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Radial Ramp.
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d radial ramp image.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
uniform float uSqueeze;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
float s = (1. - length(uv * 2. - 1.) * uSqueeze) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
35
src/visual/shaders/wgl1/radialShader.frag
Normal file
35
src/visual/shaders/wgl1/radialShader.frag
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Radial grating.
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d radial grating image. Based on https://www.shadertoy.com/view/wtjGzt
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
#define PI2 2.* M_PI
|
||||||
|
|
||||||
|
float aastep(float x) { // --- antialiased step(.5)
|
||||||
|
float w = fwidth(x); // pixel width. NB: x must not be discontinuous or factor discont out
|
||||||
|
return smoothstep(.7,-.7,(abs(fract(x-.25)-.5)-.25)/w); // just use (offseted) smooth squares
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs * 2. - 1.;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
float v = uFreq * atan(uv.y, uv.x) / 6.28;
|
||||||
|
float s = aastep(v) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
38
src/visual/shaders/wgl1/raisedCosShader.frag
Normal file
38
src/visual/shaders/wgl1/raisedCosShader.frag
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* Raised-cosine.
|
||||||
|
* https://en.wikipedia.org/wiki/Raised-cosine_filter
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d raised-cosine image as if 1d raised-cosine graph was rotated around Y axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uBeta;
|
||||||
|
uniform float uPeriod;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
float absX = length(uv * 2. - 1.);
|
||||||
|
float edgeArgument1 = (1. - uBeta) / (2. * uPeriod);
|
||||||
|
float edgeArgument2 = (1. + uBeta) / (2. * uPeriod);
|
||||||
|
float frequencyFactor = (M_PI * uPeriod) / uBeta;
|
||||||
|
float s = .5 * (1. + cos(frequencyFactor * (absX - edgeArgument1)));
|
||||||
|
if (absX <= edgeArgument1) {
|
||||||
|
s = 1.;
|
||||||
|
} else if (absX > edgeArgument2) {
|
||||||
|
s = 0.;
|
||||||
|
}
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
s = s * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
29
src/visual/shaders/wgl1/sawShader.frag
Normal file
29
src/visual/shaders/wgl1/sawShader.frag
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Sawtooth wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Sawtooth_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d sawtooth wave image as if 1d sawtooth graph was extended across Z axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
float s = uFreq * uv.x + uPhase;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
s = mod(s, 1.) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
27
src/visual/shaders/wgl1/sinShader.frag
Normal file
27
src/visual/shaders/wgl1/sinShader.frag
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Sine wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Sine_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d sine wave image as if 1d sine graph was extended across Z axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs - .25;
|
||||||
|
float s = sin((uFreq * uv.x + uPhase) * 2. * M_PI);
|
||||||
|
// it's important to convert to [0, 1] while multiplying to uColor, not before, to preserve desired coloring functionality
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
30
src/visual/shaders/wgl1/sinXsinShader.frag
Normal file
30
src/visual/shaders/wgl1/sinXsinShader.frag
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Sine wave multiplied by another sine wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Sine_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates an image of two 2d sine waves multiplied with each other.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
#define PI2 2.* M_PI
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vec2(vUvs.x - .25, vUvs.y * -1. - .25);
|
||||||
|
float sx = sin((uFreq * uv.x + uPhase) * PI2);
|
||||||
|
float sy = sin((uFreq * uv.y + uPhase) * PI2);
|
||||||
|
float s = sx * sy;
|
||||||
|
// it's important to convert to [0, 1] while multiplying to uColor, not before, to preserve desired coloring functionality
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
27
src/visual/shaders/wgl1/sqrShader.frag
Normal file
27
src/visual/shaders/wgl1/sqrShader.frag
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Square wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Square_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d square wave image as if 1d square graph was extended across Z axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs - .25;
|
||||||
|
float s = sign(sin((uFreq * uv.x + uPhase) * 2. * M_PI));
|
||||||
|
// it's important to convert to [0, 1] while multiplying to uColor, not before, to preserve desired coloring functionality
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
30
src/visual/shaders/wgl1/sqrXsqrShader.frag
Normal file
30
src/visual/shaders/wgl1/sqrXsqrShader.frag
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Square wave multiplied by another square wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Square_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates an image of two 2d square waves multiplied with each other.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
#define PI2 2.* M_PI
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vec2(vUvs.x - .25, vUvs.y * -1. - .25);
|
||||||
|
float sx = sign(sin((uFreq * uv.x + uPhase) * PI2));
|
||||||
|
float sy = sign(sin((uFreq * uv.y + uPhase) * PI2));
|
||||||
|
float s = sx * sy;
|
||||||
|
// it's important to convert to [0, 1] while multiplying to uColor, not before, to preserve desired coloring functionality
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
30
src/visual/shaders/wgl1/triShader.frag
Normal file
30
src/visual/shaders/wgl1/triShader.frag
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Triangle wave.
|
||||||
|
* https://en.wikipedia.org/wiki/Triangle_wave
|
||||||
|
*
|
||||||
|
* @author Nikita Agafonov
|
||||||
|
* @copyright (c) 2020-2022 Open Science Tools Ltd. (https://opensciencetools.org)
|
||||||
|
* @license Distributed under the terms of the MIT License
|
||||||
|
* @description Creates 2d triangle wave image as if 1d triangle graph was extended across Z axis and observed from above.
|
||||||
|
* @usedby GratingStim.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec2 vUvs;
|
||||||
|
|
||||||
|
#define M_PI 3.14159265358979
|
||||||
|
uniform float uFreq;
|
||||||
|
uniform float uPhase;
|
||||||
|
uniform float uPeriod;
|
||||||
|
uniform vec3 uColor;
|
||||||
|
uniform float uAlpha;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUvs;
|
||||||
|
float s = uFreq * uv.x + uPhase;
|
||||||
|
// converting first to [-1, 1] space to get the proper color functionality
|
||||||
|
// then back to [0, 1]
|
||||||
|
s = (2. * abs(s / uPeriod - floor(s / uPeriod + .5))) * 2. - 1.;
|
||||||
|
gl_FragColor = vec4(vec3(s) * uColor * .5 + .5, 1.0) * uAlpha;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user