three.js webgl 自定义着色器共享具有新偏移的纹理
three.js webgl custom shader sharing texture with new offset
我正在将一个 1024 x 1024 的纹理拆分为 32x32 * 32 个图块,我不确定是否可以使用偏移量共享纹理,或者我是否需要为每个具有偏移量的图块创建一个新纹理..
创建偏移我使用统一值 = 32 * i 并通过创建图块的每个循环实例更新统一,所有图块似乎都是相同的偏移量?因为基本上我希望图像看起来像它的一个图像而不是分解成小 tiles.But 当前输出在所有 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) ;
图片示例:
每张图片都应该有 10 0r 20 像素的偏移量,但它们都是一样的....这是使用一个纹理..
正如我所建议的那样,我尝试在每个对象上操作 uv 但运气不好,它似乎使所有相同的顶点具有相同的位置,例如 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)]);
}
这个结果的图像,你会注意到所有的顶点都是相同的,但它们不应该是相同的
再次更新:
当两个三角形组成四边形时,我必须遍历面的每个顶点以避免上述问题,我想我可能已经解决了这个问题...将更新
希望最后更新:
下面是源代码,但我不知道如何让算法按预期显示纹理。
/*
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 )
]);
}
您会注意到下面的红色图像是无缝的,因为其他图块没有与纹理对齐。
答案如下:
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);
如果你能简化答案也会奖励 赏金:
我正在将一个 1024 x 1024 的纹理拆分为 32x32 * 32 个图块,我不确定是否可以使用偏移量共享纹理,或者我是否需要为每个具有偏移量的图块创建一个新纹理..
创建偏移我使用统一值 = 32 * i 并通过创建图块的每个循环实例更新统一,所有图块似乎都是相同的偏移量?因为基本上我希望图像看起来像它的一个图像而不是分解成小 tiles.But 当前输出在所有 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) ;
图片示例:
每张图片都应该有 10 0r 20 像素的偏移量,但它们都是一样的....这是使用一个纹理..
正如我所建议的那样,我尝试在每个对象上操作 uv 但运气不好,它似乎使所有相同的顶点具有相同的位置,例如 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)]);
}
这个结果的图像,你会注意到所有的顶点都是相同的,但它们不应该是相同的
再次更新: 当两个三角形组成四边形时,我必须遍历面的每个顶点以避免上述问题,我想我可能已经解决了这个问题...将更新
希望最后更新: 下面是源代码,但我不知道如何让算法按预期显示纹理。
/*
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 )
]);
}
您会注意到下面的红色图像是无缝的,因为其他图块没有与纹理对齐。
答案如下:
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);
如果你能简化答案也会奖励 赏金: