Mam ustawiony ten minimalny przypadek testowy, który można łatwo zobaczyć wzory mory wytwarzane przez podkreślenie oscylujących czerwony kolor za pomocą niestandardowego modułu cieniującego fragmentu (jsfiddle).Usuwanie wzorów mory produkowanych przez shadery GLSL
Jaka jest ogólna technika usuwania takich wzorów za pomocą GLSL? Zakładam, że obejmuje to rozszerzenie derywatów, ale nigdy nie do końca rozumiałem, jak go wdrożyć. Zasadniczo muszę się przeciwdziałać wygładzaniu, tak myślę?
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>
Aktualizacja: Starałem się wdrożyć super-sampling, nie wiem, czy ja wdrożyły go poprawnie, ale nie wydaje się, aby pomóc zbyt dużo.
@ WacławJasper Używanie coord UV prostu łatwym sposobem na uzyskanie tego efektu. Sam szew nie stwarza problemu, w przeciwnym razie pojawiłby się tylko problem wokół samego szwu. –