Как правильно использовать метод Three JS WebGLRenderer getActiveMipmapLevel ()? - PullRequest
1 голос
/ 22 января 2020

Я визуализировал плоскость, используя Three JS с изображением текстуры. Я хочу проверить активный уровень mipmap, используемый при перемещении объекта вперед и назад.

Я пытаюсь получить активный уровень mipmap, используемый для рендеринга текстуры, используя метод, предоставленный для WebGLRenderer, называемый getActiveMipmapLevel (). Так или иначе, активный уровень mipmap всегда остается равным 0 независимо от того, насколько далеко я перемещаю объект вперед / назад. Я пытаюсь повторно получить и распечатать значение в рендере l oop.

Есть идеи почему?

var scene2 = new THREE.Scene();

var mipmapped_renderer = new THREE.WebGLRenderer({antialias: true});
mipmapped_renderer.setClearColor("#000000");
mipmapped_renderer.setSize(window.innerWidth , window.innerHeight);
mipmapped_renderer.autoClear = false;


var mipmapped_camera = new THREE.PerspectiveCamera(
    75,
    window.innerWidth / window.innerHeight,
    0.1,
    1000
);

mipmapped_camera.position.z = 10;


document.getElementById('left-canvas').appendChild(mipmapped_renderer.domElement);

window.addEventListener('resize', () => {
    mipmapped_renderer.setSize(window.innerWidth, window.innerHeight);
    mipmapped_camera.aspect = window.innerWidth / window.innerHeight;

    mipmapped_camera.updateProjectionMatrix();
});

var box2 = new THREE.PlaneGeometry(100, 100, 8 );

var texture2 = new THREE.TextureLoader().load( 'textures/chessboard2/chessboard_512.png' );
texture2.wrapS = THREE.RepeatWrapping;
texture2.wrapT = THREE.RepeatWrapping;
texture2.offset.set(0, 0);
texture2.repeat.set(2, 2);
texture2.minFilter = THREE.LinearMipmapLinearFilter;
texture2.magFilter = THREE.LinearFilter;
texture2.needsUpdate = true;
texture2.generateMipmaps = true;
var material2 = new THREE.MeshBasicMaterial({map: texture2, side: THREE.DoubleSide});
var mesh2 = new THREE.Mesh(box2, material2);
mesh2.scale.x = -1;
mesh2.rotation.x = 90
scene2.add(mesh2);


// post processing

var light = new THREE.PointLight(0xFFFFFF, 1, 500);
light.position.set(10, 0, 25);
scene2.add(light);


// render

var render = function() {
    requestAnimationFrame(render);
    mipmapped_renderer.render(scene2, mipmapped_camera);
    document.getElementById('mipmapLevel').innerHTML = mipmapped_renderer.getActiveMipmapLevel()
}

// animation

var rotSpeed = 0.1;

function onKeyDown(event) {
    event.preventDefault();
    var keyCode = event.which;

    if (keyCode == 87) {
        mipmapped_camera.position.z -= 1;
    } else if (keyCode == 83) {
        mipmapped_camera.position.z += 1;
    } else if (keyCode == 65) {
        mesh2.rotation.y += rotSpeed;
    } else if (keyCode == 68) {
        mesh2.rotation.y -= rotSpeed;
    }

    render();
}

render();

window.addEventListener('keydown', onKeyDown, false);

enter image description here

1 Ответ

2 голосов
/ 22 января 2020

Боюсь, WebGLRenderer.getActiveMipmapLevel() не делает то, что вы ожидаете. Метод возвращает только значение, которое было ранее установлено WebGLRenderer.setRenderTarget () .

Кроме того, WebGLRenderer.getActiveMipmapLevel() используется только WebGLShadowMap для правильного восстановления внутреннего состояния рендеринга, когда тень карта производится. Поэтому он не обязательно предназначен для кода уровня пользователя.

three.js R112

...