Если я правильно понимаю ваш вопрос, то ответом будет добавление и использование формы uniform mat3 uvTransform;
для вашего фрагментного шейдера.
THREE будет искать и заполнять эту форму преобразованием текстуры (которое включает в себя texture1.offset
) при рендеринге текстуры в вашу геометрию.
Вы должны иметь возможность доступа и извлечения данных, переданных в texture1.offset
, чтобы компенсировать выборку текстур следующим образом:
<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">
// [UPDATE] The uv offset uniform we defined below
uniform vec2 uvOffset;
// [UPDATE] The texture uniform we defined below
uniform sampler2D texture;
varying vec2 vUv;
void main()
{
// [UPDATE] Apply offset to texture lookup
gl_FragColor = texture2D(texture, vUv + uvOffset);
}
</script>
Затем вы сопровождали бы вершинный и фрагментный шейдеры, приведенные выше, со следующим THREE.ShaderMaterial
:
<script>
var material = new THREE.ShaderMaterial({
uniforms: THREE.UniformsUtils.merge([
{
//Declare texture uniform in shader
texture: { type: 't', value: null },
//Declare texture offset in shader
uvOffset : { type : 'v', value : new THREE.Vector2(0,0) }
}
]),
vertexShader:
document.getElementById('vertexshader').textContent,
fragmentShader:
document.getElementById('fragmentshader').textContent
});
// Shader uniforms can be updated like so
material.uniforms.map.value = yourTexture;
material.uniforms.uvOffset.value = yourTextureOffsetVector2;
</script>