molstar
Version:
A comprehensive macromolecular library.
72 lines (60 loc) • 2.53 kB
JavaScript
"use strict";
/**
* Copyright (c) 2022-2023 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Gianluca Tomasello <giagitom@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.dpoit_write = void 0;
exports.dpoit_write = `
if (uRenderMask == MaskOpaque) {
if (preFogAlpha < 1.0) {
discard;
}
} else if (uRenderMask == MaskTransparent) {
vec2 coords = gl_FragCoord.xy / uDrawingBufferSize;
if (preFogAlpha != 1.0 && fragmentDepth < getDepth(coords)) {
if (interior) discard;
// adapted from https://github.com/tsherif/webgl2examples
// The MIT License, Copyright 2017 Tarek Sherif, Shuai Shao
vec2 lastDepth = texture2D(tDpoitDepth, coords).rg;
vec4 lastFrontColor = texture2D(tDpoitFrontColor, coords);
vec4 fragColor = gl_FragColor;
// depth value always increases
// so we can use MAX blend equation
gl_FragData[2].rg = vec2(-MAX_DPOIT_DEPTH);
// front color always increases
// so we can use MAX blend equation
gl_FragColor = lastFrontColor;
// back color is separately blend afterwards each pass
gl_FragData[1] = vec4(0.0);
float nearestDepth = -lastDepth.x;
float furthestDepth = lastDepth.y;
float alphaMultiplier = 1.0 - lastFrontColor.a;
if (fragmentDepth < nearestDepth || fragmentDepth > furthestDepth) {
// Skip this depth since it's been peeled.
return;
}
if (fragmentDepth > nearestDepth && fragmentDepth < furthestDepth) {
// This needs to be peeled.
// The ones remaining after MAX blended for
// all need-to-peel will be peeled next pass.
gl_FragData[2].rg = vec2(-fragmentDepth, fragmentDepth);
return;
}
// write to back and front color buffer
if (fragmentDepth == nearestDepth) {
gl_FragColor.rgb += fragColor.rgb * fragColor.a * alphaMultiplier;
gl_FragColor.a = 1.0 - alphaMultiplier * (1.0 - fragColor.a);
} else {
gl_FragData[1] += fragColor;
}
} else {
discard;
}
}
`;