Ich habe diesen minimalen Testfall eingerichtet, in dem Sie die Moiré-Muster durch Unterabtastung der oszillierenden roten Farbe mit einem benutzerdefinierten Fragment-Shader (jsfiddle) leicht erkennen können.Entfernen von Moiré-Mustern, die von GLSL-Shadern erzeugt werden
Was ist die allgemeine Technik zum Entfernen solcher Muster mit GLSL? Ich nehme an, dass es die Derivaterweiterung betrifft, aber ich habe nie verstanden, wie man es implementiert. Ich muss im Grunde Anti-Aliasing machen, denke ich?
var canvas = document.getElementById('canvas');
var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer({canvas: canvas, antialias: true});
var camera = new THREE.PerspectiveCamera(75, canvas.clientWidth/canvas.clientWidth, 1, 1000);
var geometry = new THREE.SphereGeometry(50, 50, 50);
var material = new THREE.ShaderMaterial({
vertexShader: document.getElementById('vertex-shader').textContent,
fragmentShader: document.getElementById('fragment-shader').textContent
});
var sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);
camera.position.z = 100;
var period = 30;
var clock = new THREE.Clock();
render();
function render() {
requestAnimationFrame(render);
if (canvas.width !== canvas.clientWidth || canvas.height !== canvas.clientHeight) {
renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
camera.aspect = canvas.clientWidth/canvas.clientHeight;
camera.updateProjectionMatrix();
}
sphere.rotation.y -= clock.getDelta() * 2 * Math.PI/period;
renderer.render(scene, camera);
}
html, body, #canvas {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r73/three.min.js"></script>
<canvas id="canvas"></canvas>
<script id="vertex-shader" type="x-shader/x-vertex">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
</script>
<script id="fragment-shader" type="x-shader/x-fragment">
#define M_TAU 6.2831853071795864769252867665590
varying vec2 vUv;
void main() {
float w = sin(500.0 * M_TAU * vUv.x)/2.0 + 0.5;
vec3 color = vec3(w, 0.0, 0.0);
gl_FragColor = vec4(color, 1.0);
}
</script>
Update: Ich habe versucht, super-sampling, nicht sicher zu implementieren, wenn ich es richtig umgesetzt haben, aber es scheint nicht zu viel zu helfen.
@ WacławJasper die uv-Koordinaten zum Runterladen Verwendung war nur ein einfacher Weg, um diesen Effekt zu erhalten. Die Naht selbst verursacht das Problem nicht, sonst würden Sie nur das Problem um die Naht selbst sehen. –