Skip to content
Snippets Groups Projects
Commit 581c6bbf authored by Alexander Rose's avatar Alexander Rose
Browse files

wip, transparency

parent 971dc2f6
No related branches found
No related tags found
No related merge requests found
......@@ -177,7 +177,7 @@ namespace Renderer {
gl.depthMask(true)
for (let i = 0, il = renderables.length; i < il; ++i) {
const r = renderables[i]
if (r.state.opaque && !r.values.dTransparency.ref.value) renderObject(r, variant)
if (r.state.opaque) renderObject(r, variant)
}
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
......@@ -185,7 +185,7 @@ namespace Renderer {
for (let i = 0, il = renderables.length; i < il; ++i) {
const r = renderables[i]
gl.depthMask(r.values.uAlpha.ref.value === 1.0)
if (!r.state.opaque || r.values.dTransparency.ref.value) renderObject(r, variant)
if (!r.state.opaque) renderObject(r, variant)
}
} else {
// picking
......
......@@ -19,5 +19,6 @@
#endif
#ifdef dTransparency
vGroup = aGroup;
vTransparency = readFromTexture(tTransparency, aInstance * float(uGroupCount) + aGroup, uTransparencyTexDim).a;
#endif
\ No newline at end of file
......@@ -24,29 +24,31 @@
// );
// float at = thresholdMatrix[pixelCoord.x % 4][pixelCoord.y % 4];
// https://research.nvidia.com/publication/hashed-alpha-testing
// Find the discretized derivatives of our coordinates
float maxDeriv = max(length(dFdx(vViewPosition)), length(dFdy(vViewPosition)));
float pixScale = 1.0 / maxDeriv;
// Find two nearest log-discretized noise scales
vec2 pixScales = vec2(exp2(floor(log2(pixScale))), exp2(ceil(log2(pixScale))));
// Compute alpha thresholds at our two noise scales
vec2 alpha = vec2(hash3d(floor(pixScales.x * vViewPosition)), hash3d(floor(pixScales.y * vViewPosition)));
// Factor to interpolate lerp with
float lerpFactor = fract(log2(pixScale));
// Interpolate alpha threshold from noise at two scales
float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y;
// Pass into CDF to compute uniformly distrib threshold
float a = min(lerpFactor, 1.0 - lerpFactor);
vec3 cases = vec3(
x * x / (2.0 * a * (1.0 - a)),
(x - 0.5 * a) / (1.0 - a),
1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a)))
);
// Find our final, uniformly distributed alpha threshold
float at = (x < (1.0 - a)) ? ((x < a) ? cases.x : cases.y) : cases.z;
// Avoids ατ == 0. Could also do
at = clamp(at, 1.0e-6, 1.0);
// // https://research.nvidia.com/publication/hashed-alpha-testing
// // Find the discretized derivatives of our coordinates
// float maxDeriv = max(length(dFdx(vViewPosition)), length(dFdy(vViewPosition)));
// float pixScale = 1.0 / maxDeriv;
// // Find two nearest log-discretized noise scales
// vec2 pixScales = vec2(exp2(floor(log2(pixScale))), exp2(ceil(log2(pixScale))));
// // Compute alpha thresholds at our two noise scales
// vec2 alpha = vec2(hash3d(floor(pixScales.x * vViewPosition)), hash3d(floor(pixScales.y * vViewPosition)));
// // Factor to interpolate lerp with
// float lerpFactor = fract(log2(pixScale));
// // Interpolate alpha threshold from noise at two scales
// float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y;
// // Pass into CDF to compute uniformly distrib threshold
// float a = min(lerpFactor, 1.0 - lerpFactor);
// vec3 cases = vec3(
// x * x / (2.0 * a * (1.0 - a)),
// (x - 0.5 * a) / (1.0 - a),
// 1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a)))
// );
// // Find our final, uniformly distributed alpha threshold
// float at = (x < (1.0 - a)) ? ((x < a) ? cases.x : cases.y) : cases.z;
// // Avoids ατ == 0. Could also do
// at = clamp(at, 1.0e-6, 1.0);
float at = fract(dot(vec3(gl_FragCoord.xy, vGroup + 0.5), vec3(2.0, 7.0, 23.0) / 17.0f));
if (ma < 0.99 && (ma < 0.01 || ma < at)) discard;
#endif
\ No newline at end of file
......@@ -15,5 +15,6 @@
#endif
#ifdef dTransparency
varying float vGroup;
varying float vTransparency;
#endif
\ No newline at end of file
......@@ -23,6 +23,7 @@
#endif
#ifdef dTransparency
varying float vGroup;
varying float vTransparency;
uniform vec2 uTransparencyTexDim;
uniform sampler2D tTransparency;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment