Add sdf_lavalamp
This commit is contained in:
parent
2b9a0a9233
commit
012c7b0e41
5 changed files with 204 additions and 1 deletions
|
@ -5,6 +5,7 @@ GLSL shaders and projects for [SHADERed](https://github.com/dfranx/SHADERed).
|
|||
## Gallery
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
BIN
render/sdf_lavalamp.gif
Normal file
BIN
render/sdf_lavalamp.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 MiB |
48
sdf_lavalamp.sprj
Normal file
48
sdf_lavalamp.sprj
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0"?>
|
||||
<project version="2">
|
||||
<pipeline>
|
||||
<pass name="sdf_lavalamp" type="shader" active="true" patchverts="1">
|
||||
<shader type="vs" path="shaders/sdf_lavalamp_sdf_lavalampVS.glsl" entry="main" />
|
||||
<shader type="ps" path="shaders/sdf_lavalamp_sdf_lavalampPS.glsl" entry="main" />
|
||||
<inputlayout>
|
||||
<item value="Position" semantic="POSITION" />
|
||||
<item value="Normal" semantic="NORMAL" />
|
||||
<item value="Texcoord" semantic="TEXCOORD0" />
|
||||
</inputlayout>
|
||||
<rendertexture />
|
||||
<items>
|
||||
<item name="Box" type="geometry">
|
||||
<type>Cube</type>
|
||||
<width>1</width>
|
||||
<height>1</height>
|
||||
<depth>1</depth>
|
||||
<scaleY>3</scaleY>
|
||||
<topology>TriangleList</topology>
|
||||
</item>
|
||||
</items>
|
||||
<itemvalues />
|
||||
<variables>
|
||||
<variable type="float4x4" name="matVP" system="ViewProjection" />
|
||||
<variable type="float4x4" name="matGeo" system="GeometryTransform" />
|
||||
<variable type="float" name="uTime" system="Time" />
|
||||
<variable type="float3" name="vecCamPos" system="CameraPosition3" />
|
||||
</variables>
|
||||
<macros />
|
||||
</pass>
|
||||
</pipeline>
|
||||
<objects />
|
||||
<cameras />
|
||||
<settings>
|
||||
<entry type="file" name="sdf_lavalamp" shader="vs" />
|
||||
<entry type="file" name="sdf_lavalamp" shader="ps" />
|
||||
<entry type="camera" fp="false">
|
||||
<distance>4</distance>
|
||||
<pitch>18</pitch>
|
||||
<yaw>317</yaw>
|
||||
<roll>360</roll>
|
||||
</entry>
|
||||
<entry type="clearcolor" r="0" g="0" b="0" a="0" />
|
||||
<entry type="usealpha" val="false" />
|
||||
</settings>
|
||||
<plugindata />
|
||||
</project>
|
139
shaders/sdf_lavalamp_sdf_lavalampPS.glsl
Normal file
139
shaders/sdf_lavalamp_sdf_lavalampPS.glsl
Normal file
|
@ -0,0 +1,139 @@
|
|||
#version 330
|
||||
|
||||
uniform float uTime;
|
||||
uniform vec3 vecCamPos;
|
||||
|
||||
in vec3 vert_pos;
|
||||
|
||||
out vec4 outColor;
|
||||
|
||||
const int MAX_STEPS = 100;
|
||||
const float MAX_DIST = 100.0;
|
||||
const float SURF_DIST = 0.01;
|
||||
|
||||
const int SHAPES = 6;
|
||||
const float MAX_SPREAD_H = 0.1;
|
||||
const float MAX_HEIGHT = 2.0;
|
||||
const float RISE_SPEED = 0.4;
|
||||
const float MIN_SPEED = 0.15;
|
||||
const float LAVA_SMOOTHNESS = 0.5;
|
||||
|
||||
const float HEIGHT_GRADIENT = 0.2;
|
||||
const float RIM_GRADIENT = 0.6;
|
||||
|
||||
// https://iquilezles.org/articles/palettes/
|
||||
// http://dev.thi.ng/gradients/
|
||||
vec3 palette(float t) {
|
||||
vec3 a = vec3(0.500, 0.500, 0.000);
|
||||
vec3 b = vec3(0.500, 0.500, 0.000);
|
||||
vec3 c = vec3(0.100, 0.500, 0.000);
|
||||
vec3 d = vec3(0.000, 0.000, 0.000);
|
||||
|
||||
return a + b*cos(6.28318*(c*t+d));
|
||||
}
|
||||
|
||||
float sdf_sphere(vec3 p, vec3 sp, float r)
|
||||
{
|
||||
return length(sp - p) - r;
|
||||
}
|
||||
|
||||
float smooth_union(float d1, float d2, float k)
|
||||
{
|
||||
float h = clamp(0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0);
|
||||
return mix(d2, d1, h) - k * h * (1.0 - h);
|
||||
}
|
||||
|
||||
float rand(vec2 co)
|
||||
{
|
||||
return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
}
|
||||
|
||||
float get_dist(vec3 p)
|
||||
{
|
||||
float field = MAX_DIST;
|
||||
|
||||
// random blobs
|
||||
for (int i = 0; i < SHAPES; i++)
|
||||
{
|
||||
float seed1 = rand(vec2((i+1)*1.15));
|
||||
float seed2 = rand(vec2((i+1)*1.25));
|
||||
float seed3 = rand(vec2((i+1)*1.35));
|
||||
field = smooth_union(
|
||||
field,
|
||||
sdf_sphere(
|
||||
p,
|
||||
vec3(
|
||||
(seed1 - 0.5) * MAX_SPREAD_H,
|
||||
MAX_HEIGHT * sin(uTime * max(seed2, MIN_SPEED) * RISE_SPEED) - 0.5,
|
||||
(seed3 - 0.5) * MAX_SPREAD_H
|
||||
),
|
||||
0.2 * (1.0 - pow(seed2, 4))
|
||||
),
|
||||
LAVA_SMOOTHNESS
|
||||
);
|
||||
}
|
||||
|
||||
// big blob at the bottom
|
||||
field = smooth_union(
|
||||
field,
|
||||
sdf_sphere(
|
||||
p,
|
||||
vec3(
|
||||
0.0,
|
||||
-MAX_HEIGHT,
|
||||
0.0
|
||||
),
|
||||
0.8
|
||||
),
|
||||
LAVA_SMOOTHNESS
|
||||
);
|
||||
|
||||
return field;
|
||||
}
|
||||
|
||||
vec3 get_normal(vec3 p)
|
||||
{
|
||||
float d = get_dist(p);
|
||||
vec2 e = vec2(0.01, 0.0);
|
||||
vec3 norm = d - vec3(
|
||||
get_dist(p - e.xyy),
|
||||
get_dist(p - e.yxy),
|
||||
get_dist(p - e.yyx)
|
||||
);
|
||||
return normalize(norm);
|
||||
}
|
||||
|
||||
float ray_march(vec3 origin, vec3 direction)
|
||||
{
|
||||
float d = 0.0;
|
||||
for (int i = 0; i < MAX_STEPS; i++)
|
||||
{
|
||||
vec3 p = origin + direction * d;
|
||||
float sd = get_dist(p);
|
||||
d += sd;
|
||||
if (d > MAX_DIST || sd < SURF_DIST)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec3 cam_dir = normalize(vert_pos - vecCamPos);
|
||||
float d = ray_march(vecCamPos, cam_dir);
|
||||
|
||||
float alpha = step(d, MAX_DIST);
|
||||
|
||||
vec3 ray = vecCamPos + cam_dir * d;
|
||||
vec3 n = get_normal(ray);
|
||||
|
||||
// color gradient
|
||||
float h = 1.0 - (ray.y * MAX_HEIGHT * HEIGHT_GRADIENT);
|
||||
float f = dot(-cam_dir, n) * RIM_GRADIENT;
|
||||
float g = f * h;
|
||||
|
||||
vec3 col = palette(1.0 - g) * alpha;
|
||||
|
||||
outColor = vec4(col, 1.0);
|
||||
}
|
15
shaders/sdf_lavalamp_sdf_lavalampVS.glsl
Normal file
15
shaders/sdf_lavalamp_sdf_lavalampVS.glsl
Normal file
|
@ -0,0 +1,15 @@
|
|||
#version 330
|
||||
|
||||
uniform mat4 matVP;
|
||||
uniform mat4 matGeo;
|
||||
|
||||
layout (location = 0) in vec3 pos;
|
||||
layout (location = 1) in vec3 normal;
|
||||
|
||||
out vec3 vert_pos;
|
||||
|
||||
void main() {
|
||||
vec4 vert = (matGeo * vec4(pos, 1.0));
|
||||
vert_pos = vert.xyz;
|
||||
gl_Position = matVP * vert;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue