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