Feature: anti-aliasing of projection screen
This commit is contained in:
parent
e2ac3e90a1
commit
1586df7e51
@ -33,10 +33,17 @@ void main() {
|
|||||||
float ledCountY = ${ledCountY}.0;
|
float ledCountY = ${ledCountY}.0;
|
||||||
|
|
||||||
vec2 gridUV = vec2(vUv.x * ledCountX, vUv.y * ledCountY);
|
vec2 gridUV = vec2(vUv.x * ledCountX, vUv.y * ledCountY);
|
||||||
|
|
||||||
|
// Anti-aliasing: Calculate grid density
|
||||||
|
vec2 gridDeriv = fwidth(gridUV);
|
||||||
|
float gridDensity = max(gridDeriv.x, gridDeriv.y);
|
||||||
|
float blurFactor = smoothstep(0.3, 0.8, gridDensity);
|
||||||
|
|
||||||
vec2 cell = fract(gridUV);
|
vec2 cell = fract(gridUV);
|
||||||
vec2 pixelatedUV = (floor(gridUV) + 0.5) / vec2(ledCountX, ledCountY);
|
vec2 pixelatedUV = (floor(gridUV) + 0.5) / vec2(ledCountX, ledCountY);
|
||||||
|
vec2 sampleUV = mix(pixelatedUV, vUv, blurFactor);
|
||||||
|
|
||||||
vec4 color = texture2D(videoTexture, pixelatedUV);
|
vec4 color = texture2D(videoTexture, sampleUV);
|
||||||
|
|
||||||
// Effect 1: Static/Noise (Power On/Off)
|
// Effect 1: Static/Noise (Power On/Off)
|
||||||
if (u_effect_type > 0.0) {
|
if (u_effect_type > 0.0) {
|
||||||
@ -46,7 +53,10 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float dist = distance(cell, vec2(0.5));
|
float dist = distance(cell, vec2(0.5));
|
||||||
float mask = 1.0 - smoothstep(0.35, 0.45, dist);
|
float edgeSoftness = clamp(gridDensity * 1.5, 0.0, 0.5);
|
||||||
|
float mask = 1.0 - smoothstep(0.35 - edgeSoftness, 0.45 + edgeSoftness, dist);
|
||||||
|
mask = mix(mask, 1.0, blurFactor);
|
||||||
|
|
||||||
float brightness = max(color.r, max(color.g, color.b));
|
float brightness = max(color.r, max(color.g, color.b));
|
||||||
float contentAlpha = smoothstep(0.05, 0.15, brightness);
|
float contentAlpha = smoothstep(0.05, 0.15, brightness);
|
||||||
|
|
||||||
@ -71,11 +81,18 @@ void main() {
|
|||||||
float ledCountY = 72.0;
|
float ledCountY = 72.0;
|
||||||
|
|
||||||
vec2 gridUV = vec2(vUv.x * ledCountX, vUv.y * ledCountY);
|
vec2 gridUV = vec2(vUv.x * ledCountX, vUv.y * ledCountY);
|
||||||
|
|
||||||
|
vec2 gridDeriv = fwidth(gridUV);
|
||||||
|
float gridDensity = max(gridDeriv.x, gridDeriv.y);
|
||||||
|
float blurFactor = smoothstep(0.3, 0.8, gridDensity);
|
||||||
|
|
||||||
vec2 cell = fract(gridUV);
|
vec2 cell = fract(gridUV);
|
||||||
vec2 uv = (floor(gridUV) + 0.5) / vec2(ledCountX, ledCountY);
|
vec2 uv = mix((floor(gridUV) + 0.5) / vec2(ledCountX, ledCountY), vUv, blurFactor);
|
||||||
|
|
||||||
float dist = distance(cell, vec2(0.5));
|
float dist = distance(cell, vec2(0.5));
|
||||||
float mask = 1.0 - smoothstep(0.35, 0.45, dist);
|
float edgeSoftness = clamp(gridDensity * 1.5, 0.0, 0.5);
|
||||||
|
float mask = 1.0 - smoothstep(0.35 - edgeSoftness, 0.45 + edgeSoftness, dist);
|
||||||
|
mask = mix(mask, 1.0, blurFactor);
|
||||||
|
|
||||||
float d = length(uv - 0.5);
|
float d = length(uv - 0.5);
|
||||||
float angle = atan(uv.y - 0.5, uv.x - 0.5);
|
float angle = atan(uv.y - 0.5, uv.x - 0.5);
|
||||||
@ -221,7 +238,8 @@ export class ProjectionScreen extends SceneFeature {
|
|||||||
vertexShader: screenVertexShader,
|
vertexShader: screenVertexShader,
|
||||||
fragmentShader: visualizerFragmentShader,
|
fragmentShader: visualizerFragmentShader,
|
||||||
side: THREE.DoubleSide,
|
side: THREE.DoubleSide,
|
||||||
transparent: true
|
transparent: true,
|
||||||
|
derivatives: true
|
||||||
});
|
});
|
||||||
state.screenLight.intensity = state.originalScreenIntensity;
|
state.screenLight.intensity = state.originalScreenIntensity;
|
||||||
}
|
}
|
||||||
@ -311,7 +329,8 @@ export function turnTvScreenOn() {
|
|||||||
vertexShader: screenVertexShader,
|
vertexShader: screenVertexShader,
|
||||||
fragmentShader: screenFragmentShader,
|
fragmentShader: screenFragmentShader,
|
||||||
side: THREE.DoubleSide,
|
side: THREE.DoubleSide,
|
||||||
transparent: true
|
transparent: true,
|
||||||
|
derivatives: true
|
||||||
});
|
});
|
||||||
|
|
||||||
state.tvScreen.material.needsUpdate = true;
|
state.tvScreen.material.needsUpdate = true;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user