feat:3D multi dot
This commit is contained in:
25
shaders/base.frag
Normal file
25
shaders/base.frag
Normal file
@@ -0,0 +1,25 @@
|
||||
#version 330 core
|
||||
|
||||
in vec3 vNormal;
|
||||
in vec3 vWorldPos;
|
||||
out vec4 FragColor;
|
||||
|
||||
uniform vec3 uCameraPos;
|
||||
uniform vec3 uLightDir;
|
||||
uniform vec3 uColor;
|
||||
|
||||
float saturate(float x) { return clamp(x, 0.0, 1.0); }
|
||||
|
||||
void main() {
|
||||
vec3 N = normalize(vNormal);
|
||||
vec3 L = normalize(uLightDir);
|
||||
vec3 V = normalize(uCameraPos - vWorldPos);
|
||||
vec3 H = normalize(L + V);
|
||||
|
||||
float diff = saturate(dot(N, L));
|
||||
float spec = pow(saturate(dot(N, H)), 24.0);
|
||||
|
||||
vec3 col = uColor * (0.35 + 0.65 * diff);
|
||||
col += vec3(1.0) * spec * 0.10;
|
||||
FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
|
||||
}
|
||||
15
shaders/base.vert
Normal file
15
shaders/base.vert
Normal file
@@ -0,0 +1,15 @@
|
||||
#version 330 core
|
||||
|
||||
layout(location = 0) in vec3 aPos;
|
||||
layout(location = 1) in vec3 aNormal;
|
||||
|
||||
out vec3 vNormal;
|
||||
out vec3 vWorldPos;
|
||||
|
||||
uniform mat4 uMVP;
|
||||
|
||||
void main() {
|
||||
vNormal = aNormal;
|
||||
vWorldPos = aPos;
|
||||
gl_Position = uMVP * vec4(aPos, 1.0);
|
||||
}
|
||||
63
shaders/heatmap.frag
Normal file
63
shaders/heatmap.frag
Normal file
@@ -0,0 +1,63 @@
|
||||
#version 330 core
|
||||
|
||||
in vec2 vUV;
|
||||
in vec3 vWorldPos;
|
||||
out vec4 FragColor;
|
||||
|
||||
uniform sampler2D uHeightTex;
|
||||
uniform float uMinV;
|
||||
uniform float uMaxV;
|
||||
uniform float uHeightScale;
|
||||
uniform vec2 uTexelSize;
|
||||
uniform vec2 uPlaneSize;
|
||||
uniform vec3 uCameraPos;
|
||||
uniform vec3 uLightDir;
|
||||
uniform vec3 uColorLow;
|
||||
uniform vec3 uColorMid;
|
||||
uniform vec3 uColorHigh;
|
||||
|
||||
float saturate(float x) { return clamp(x, 0.0, 1.0); }
|
||||
|
||||
float value01(float v) {
|
||||
return saturate((v - uMinV) / max(uMaxV - uMinV, 1e-6));
|
||||
}
|
||||
|
||||
vec3 colorRamp(float t) {
|
||||
if (t < 0.5) {
|
||||
return mix(uColorLow, uColorMid, t / 0.5);
|
||||
}
|
||||
return mix(uColorMid, uColorHigh, (t - 0.5) / 0.5);
|
||||
}
|
||||
|
||||
void main() {
|
||||
float vC = texture(uHeightTex, vUV).r;
|
||||
float t = value01(vC);
|
||||
vec3 base = colorRamp(t);
|
||||
|
||||
float vL = texture(uHeightTex, vUV - vec2(uTexelSize.x, 0.0)).r;
|
||||
float vR = texture(uHeightTex, vUV + vec2(uTexelSize.x, 0.0)).r;
|
||||
float vD = texture(uHeightTex, vUV - vec2(0.0, uTexelSize.y)).r;
|
||||
float vU = texture(uHeightTex, vUV + vec2(0.0, uTexelSize.y)).r;
|
||||
|
||||
float hL = value01(vL) * uHeightScale;
|
||||
float hR = value01(vR) * uHeightScale;
|
||||
float hD = value01(vD) * uHeightScale;
|
||||
float hU = value01(vU) * uHeightScale;
|
||||
|
||||
float dx = max(1e-6, uPlaneSize.x * uTexelSize.x);
|
||||
float dy = max(1e-6, uPlaneSize.y * uTexelSize.y);
|
||||
float dHx = (hR - hL) / (2.0 * dx);
|
||||
float dHy = (hU - hD) / (2.0 * dy);
|
||||
|
||||
vec3 N = normalize(vec3(-dHx, -dHy, -1.0));
|
||||
vec3 L = normalize(uLightDir);
|
||||
vec3 V = normalize(uCameraPos - vWorldPos);
|
||||
vec3 H = normalize(L + V);
|
||||
|
||||
float diff = saturate(dot(N, L));
|
||||
float spec = pow(saturate(dot(N, H)), 24.0);
|
||||
|
||||
vec3 col = base * (0.50 + 0.50 * diff);
|
||||
col += vec3(1.0) * spec * 0.18;
|
||||
FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
|
||||
}
|
||||
27
shaders/heatmap.vert
Normal file
27
shaders/heatmap.vert
Normal file
@@ -0,0 +1,27 @@
|
||||
#version 330 core
|
||||
|
||||
layout(location = 0) in vec3 aPos;
|
||||
layout(location = 1) in vec2 aUV;
|
||||
|
||||
out vec2 vUV;
|
||||
out vec3 vWorldPos;
|
||||
|
||||
uniform mat4 uMVP;
|
||||
uniform sampler2D uHeightTex;
|
||||
uniform float uMinV;
|
||||
uniform float uMaxV;
|
||||
uniform float uHeightScale;
|
||||
uniform float uBaseZ;
|
||||
|
||||
float value01(float v) {
|
||||
return clamp((v - uMinV) / max(uMaxV - uMinV, 1e-6), 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vUV = aUV;
|
||||
float v = texture(uHeightTex, aUV).r;
|
||||
float h = value01(v) * uHeightScale;
|
||||
vec3 world = aPos + vec3(0.0, 0.0, uBaseZ + h);
|
||||
vWorldPos = world;
|
||||
gl_Position = uMVP * vec4(world, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user