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