three.js webgl自定义着色器与新偏移共享纹理

Car*_*een 7 shader webgl vertex-shader three.js

我在32x32 tile*32上分割纹理1024 x 1024,我不确定它是否可以与偏移共享纹理,或者我需要为每个具有偏移的tile创建一个新纹理.

创建偏移量我使用统一值= 32*i并通过创建拼贴的每个循环实例更新统一,所有拼贴似乎是相同的偏移量?因为基本上我想要一个图像看起来像它的一个图像没有分解成小瓷砖.但是当前的输出是所有32个瓷砖上相同的x,y偏移.我使用顶点着色器和three.js r71 ...

我是否需要为每个具有偏移的图块创建新纹理?

      for ( j = 0; j < row; j ++ ) {

           for ( t = 0; t < col; t ++ ) {

                customUniforms.tX.value = tX; 
                customUniforms.tY.value = tY;
                console.log(customUniforms.tX.value);
                customUniforms.tX.needsUpdate = true;
                customUniforms.tY.needsUpdate = true;
                mesh = new THREE.Mesh( geometry,mMaterial);// or new material
           }
       }

       //vertex shader :
       vec2 uvOffset = vUV + vec2( tX, tY) ;    
Run Code Online (Sandbox Code Playgroud)

图片示例:

在此输入图像描述

每个图像的偏移量应为10 0r 20 px,但它们都是相同的....这是使用一个纹理..

正如所建议的那样,我试图在没有运气的情况下操纵每个对象上的紫外线,它似乎使所有相同的顶点具有相同的位置,例如10x10 segmant平面​​所有面都将是相同的

    var geometry = [
    [ new THREE.PlaneGeometry( w, w ,64,64),50 ],
    [ new THREE.PlaneGeometry( w, w ,40,40), 500 ],
    [ new THREE.PlaneGeometry( w, w ,30,30), 850 ],
    [ new THREE.PlaneGeometry( w, w,16,16 ), 1200 ]
];

    geometry[0][0].faceVertexUvs[0] = [];

    for(var p = 0; p < geometry[0][0].faces.length; p++){ 
        geometry[0][0].faceVertexUvs[0].push([
        new THREE.Vector2(0.0, 0.0),
        new THREE.Vector2(0.0, 1),
        new THREE.Vector2( 1, 1 ), 
        new THREE.Vector2(1.0, 0.0)]);  
    }
Run Code Online (Sandbox Code Playgroud)

这个结果的图像,你会注意到它们不应该是所有顶点是相同的

在此输入图像描述

再次更新: 我必须通过面的每个顶点,因为两个三角形形成四边形以避免上述问题,我想我可能已经解决了...将更新

最后更新跳转: 下面是源代码,但我迷失了,使算法按预期显示纹理.

            /*
            j and t are rows & columns looping by 4x4 grid
            row = 4 col = 4;
            */

            for( i = 0; i < geometry.length; i ++ ) {
            var mesh = new THREE.Mesh( geometry[ i ][ 0 ], customMaterial);
            mesh.geometry.computeBoundingBox();
            var max     =  mesh.geometry.boundingBox.max;
            var min     =  mesh.geometry.boundingBox.min;
            var offset  = new THREE.Vector2(0 - min.x*t*j+w, 0- min.y*j+w);//here is my issue
            var range   = new THREE.Vector2(max.x - min.x*row*2, max.y - min.y*col*2);
            mesh.geometry.faceVertexUvs[0] = [];
            var faces =  mesh.geometry.faces;

            for (p = 0; p <  mesh.geometry.faces.length ; p++) {
                var v1 =  mesh.geometry.vertices[faces[p].a];
                var v2 =  mesh.geometry.vertices[faces[p].b];
                var v3 =  mesh.geometry.vertices[faces[p].c];
                mesh.geometry.faceVertexUvs[0].push([
                new THREE.Vector2( ( v1.x + offset.x ) / range.x , ( v1.y + offset.y ) / range.y ),
                new THREE.Vector2( ( v2.x + offset.x ) / range.x , ( v2.y + offset.y ) / range.y ),
                new THREE.Vector2( ( v3.x + offset.x ) / range.x , ( v3.y + offset.y ) / range.y )
                ]);

            }
Run Code Online (Sandbox Code Playgroud)

您会注意到红色的下图是无缝的,因为其他图块未与纹理对齐. 在此输入图像描述

Car*_*een 3

答案如下:

      var offset  = new THREE.Vector2(w - min.x-w+(w*t), w- min.y+w+(w*-j+w));
      var range   = new THREE.Vector2(max.x - min.x*7, max.y - min.y*7);
Run Code Online (Sandbox Code Playgroud)

如果你能简化答案也将奖励赏金