Skip to content

Variable: MESH_FRAGMENT_SHADER ​

ts
const MESH_FRAGMENT_SHADER: '\nprecision highp float;\nprecision highp int;\n\nuniform vec4 uColor;\nuniform float uOpacity;\nuniform vec3 uClipMin;\nuniform vec3 uClipMax;\nuniform sampler2D uLut;\nuniform vec3 uCRange;\nuniform vec4 uK;\nuniform vec3 uAmbient;\nuniform vec3 uHemiSky;\nuniform vec3 uHemiGround;\nuniform vec3 uHemiUp;\n#if HC_LIGHTS > 0\nuniform vec4 uLightPos[HC_LIGHTS];\nuniform vec3 uLightColor[HC_LIGHTS];\n#endif\n\n#ifdef HC_COLOR\nin vec4 vColor;\n#endif\n#ifdef HC_INTENSITY\nin float vValue;\n#endif\nin vec3 vLocal;\nin vec3 vViewPos;\nin vec3 vNormal;\n#ifdef PICKING\n\nvec4 holochartEncodePickId(uint id) {\n  uint v = id + 1u;\n  vec4 bytes = vec4(float(v >> 24u), float((v >> 16u) & 255u), float((v >> 8u) & 255u), float(v & 255u));\n  return min((bytes + 0.25) / 255.0, vec4(1.0));\n}\n\nflat in uint vPickId;\n#endif\nout highp vec4 fragColor;\n// @mesh-fragment-decl\n\nfloat hcBeckmann(float x, float r) {\n  float c2 = max(x, 0.0001);\n  c2 *= c2;\n  float r2 = r * r;\n  return exp((c2 - 1.0) / (c2 * r2)) / (3.141592653589793 * r2 * c2 * c2);\n}\n\nfloat hcCookTorrance(vec3 L, vec3 V, vec3 N, float r, float f) {\n  float VdotN = max(dot(V, N), 0.0);\n  float LdotN = max(dot(L, N), 0.0);\n  vec3 H = normalize(L + V);\n  float NdotH = max(dot(N, H), 0.0);\n  float VdotH = max(dot(V, H), 0.000001);\n  float LdotH = max(dot(L, H), 0.000001);\n  float G = min(1.0, min(2.0 * NdotH * VdotN / VdotH, 2.0 * NdotH * LdotN / LdotH));\n  return G * pow(1.0 - VdotN, f) * hcBeckmann(NdotH, r) / max(3.14159265 * VdotN, 0.000001);\n}\n\nvoid main() {\n#ifdef HC_CLIP\n  if (any(lessThan(vLocal, uClipMin)) || any(greaterThan(vLocal, uClipMax))) discard;\n#endif\n#ifdef PICKING\n  fragColor = holochartEncodePickId(vPickId);\n#else\n#ifdef HC_COLOR\n  vec4 color = vColor;\n#else\n  vec4 color = uColor;\n#endif\n#ifdef HC_INTENSITY\n  if (abs(vValue) > 1.0e37) discard;\n  float t = clamp((vValue - uCRange.x) / (uCRange.y - uCRange.x), 0.0, 1.0);\n  if (uCRange.z > 0.5) t = 1.0 - t;\n  vec4 lut = texture(uLut, vec2((t * 255.0 + 0.5) / 256.0, 0.5));\n  color = vec4(lut.rgb, lut.a * color.a);\n#endif\n  color.a *= uOpacity;\n  // @mesh-color\n#ifndef HC_UNLIT\n  vec3 V = isOrthographic ? vec3(0.0, 0.0, 1.0) : normalize(-vViewPos);\n  vec3 N = dot(vNormal, vNormal) > 0.0 ? normalize(vNormal) : vec3(0.0);\n  N = faceforward(N, -V, N);\n  vec3 diffuse = uAmbient + mix(uHemiGround, uHemiSky, 0.5 + 0.5 * dot(N, uHemiUp));\n  vec3 specular = vec3(0.0);\n#if HC_LIGHTS > 0\n  for (int i = 0; i < HC_LIGHTS; i++) {\n    vec4 lp = uLightPos[i];\n    vec3 L = normalize(lp.w > 0.5 ? lp.xyz - vViewPos : lp.xyz);\n    diffuse += uK.x * max(dot(N, L), 0.0) * uLightColor[i];\n    specular += uK.y * clamp(hcCookTorrance(L, V, N, uK.z, uK.w), 0.0, 1.0) * uLightColor[i];\n  }\n#endif\n  color.rgb = min(diffuse, vec3(1.0)) * color.rgb + specular;\n#endif\n  // @mesh-lit\n  fragColor = color;\n#endif\n}\n';

Experimental

Released under the MIT License.