Thank you for the nice video!
Noise texture in the shader used in your video is not just random texture. This
is the code in the shader that samples noise texture:
float Noise( in vec3 x )
{
vec3 p = floor(x);
vec3 f = fract(x);
f = f*f*(3.0-2.0*f);
vec2 uv = (p.xy+vec2(37.0,17.0)*p.z) + f.xy;
vec2 rg = texture( iChannel0, (uv+ 0.5)/256.0, -99.0 ).yx;
return mix( rg.x, rg.y, f.z );
}
Run
This is code from Dave_Hoskins's comment in
[https://www.shadertoy.com/view/4sfGzS](https://www.shadertoy.com/view/4sfGzS)
Here is how the noise texture was created:
for (int y = 0; y < 256; y++)
{
for (int x = 0; x < 256; x++)
{
colour[x, y].r = RandomNumber();
colour[x, y].b = RandomNumber();
}
}
for (int y = 0; y < 256; y++)
{
for (int x = 0; x < 256; x++)
{
int x2 = (x - 37) & 255;
int y2 = (y - 17) & 255;
colour[x][y].g = colour[x2][y2].r;
colour[x][y].a = colour[x2][y2].b;
}
}
Run
I think when this shader was created, there is no 3D texture in WebGL1. This
`Noise` function make 3D value noise from 1 time 2D texture sampling. rg.y
contains a sample of next z layer of rg.x. To make continuous 3D value noise,
rg.y need to be a copy of next z layer rg.x value.
you can download original Shadertoy textures from here:
[https://github.com/beautypi/shadertoy-iOS-v2/blob/master/shadertoy/presets/tex16.png](https://github.com/beautypi/shadertoy-iOS-v2/blob/master/shadertoy/presets/tex16.png)
When embeding a shader as string literal in source code, line numbers in error
message from GLSL compiler begins from head of that string literal. That makes
finding a error line a bit difficult. It seems your program displays GLSL
shader error messages inside GLSL code. I wrote following template so that GLSL
compiler show error messages with line number in source code and variable name.
It prepends `#line` directive to the string literal with line number in source
and constant name.
template glslSrcImpl(name: untyped; line: int; prefix, src: static string):
untyped =
const name {.inject.} =
block:
const
pre {.inject.} = prefix
l {.inject.} = line + 2
nameStr {.inject.} = astToStr(name)
s {.inject.} = src
&"{pre}\n#line {l} \"{nameStr}\"\n{s}"
template glslSrcHead*(name: untyped; glslVersion: int; src: static string):
untyped =
const verLine = "#version " & $glslVersion
glslSrcImpl(name, instantiationInfo().line, verLine, src)
Run
Use this template like this:
glslSrcHead testFS, 460, """
out vec4 color;
void main()
{
color = vec4(1.0, 0.0, 0.0, 0.0);
}
"""
Run