THREE.js повторяет обтекание текстуры в шейдер

Я хочу повторить обтекание текстуры в шейдере THREE.js.

Исходное изображение текстуры:

Я хочу, чтобы это повторилось 4x4 раза, что будет выглядеть так:

Но с помощью следующего кода получается:

Вершинный шейдер:

varying vec2 vUv;

uniform float textRepeat;

void main()
{    
    // passing texture to fragment shader
    vUv = uv * textRepeat;

    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

Фрагмент шейдера:

varying vec2 vUv;

uniform sampler2D texture;

void main() {
    // add origianl texture
    gl_FragColor = texture2D(texture, vUv);
}

uniforms в файле JavaScript, в котором textureRepeat дает время, которое нужно повторить:

uniforms: {
    texture: {
        type: 't', 
        value: THREE.ImageUtils.loadTexture('image/box.jpg')
    },
    textRepeat: {
        type: 'f',
        value: 8
    }
}

Может ли кто-нибудь сказать мне, что здесь происходит не так?

2 ответа

Решение

По умолчанию текстуры имеют режим обтекания "Зажим", что означает, что u или v больше 1 будут равны 1, а не оборачиваются обратно в 0.

Чтобы это исправить, вам нужно установить режим обтекания вашей текстуры на "Повторить", что происходит так:

uniforms.texture.value.wrapS = uniforms.texture.value.wrapT = THREE.RepeatWrapping

Еще один трюк может заключаться в том, чтобы сделать что-то вроде fract(uv) и получить дробную часть. (это всегда будет в пределах 0-1)

Другие вопросы по тегам