Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript copyTextureToTexture会在three.js中产生可怕的锯齿瑕疵_Javascript_Three.js_Textures - Fatal编程技术网

Javascript copyTextureToTexture会在three.js中产生可怕的锯齿瑕疵

Javascript copyTextureToTexture会在three.js中产生可怕的锯齿瑕疵,javascript,three.js,textures,Javascript,Three.js,Textures,当我使用copyTextureToTexture将带有加载图像的texture1复制到texture2(使用相同的尺寸和格式创建的datatexture)时,我会得到很强的混叠伪影,就像所有GPU过滤都被禁用一样——至少大部分是这样,因为各向异性似乎部分起作用。在过去的2-3天里,我一直在努力寻找解决方案,但我仍然不确定这是一个three.js错误,还是我遗漏了什么。任何帮助都将不胜感激。 即使是WEBGL解决方案也是受欢迎的,只要它可以与three.js配合使用 以下是完整的测试代码:通过单击

当我使用copyTextureToTexture将带有加载图像的texture1复制到texture2(使用相同的尺寸和格式创建的datatexture)时,我会得到很强的混叠伪影,就像所有GPU过滤都被禁用一样——至少大部分是这样,因为各向异性似乎部分起作用。在过去的2-3天里,我一直在努力寻找解决方案,但我仍然不确定这是一个three.js错误,还是我遗漏了什么。任何帮助都将不胜感激。 即使是WEBGL解决方案也是受欢迎的,只要它可以与three.js配合使用

以下是完整的测试代码:通过单击窗口,可以在原始纹理和复制的纹理之间切换,以比较瑕疵

var w=window.innerWidth;
var h=窗内高度;
var hx=w/2;
var-hy=h/2;
var摄影机、场景、渲染器、tog1;
var mouseX=0,
mouseY=0;
var container=document.createElement('div');
文件.正文.附件(容器);
摄像机=新的三个透视摄像机(35,w/h,1025000);
摄像机位置z=20;
场景=新的三个。场景();
scene.background=新的三种颜色(“f2f7ff”);
场景。添加(新的三个环境光(#eef0ff”);
var灯光=新的三个方向灯光(“ffffff”,2);
光。位置。设置(1,1,1);
场景。添加(灯光);
常量myurl=”https://i.imgur.com/UiTMJzv.png";
const textureLoader=新的三个.textureLoader();
const texture1=textureLoader.load(myurl,setup);
onDocumentMouseMove函数(事件){
container.focus();
mouseX=(event.clientX-hx);
mouseY=(event.clientY-hy);
}
函数设置(){
renderer=new THREE.WebGLRenderer({
反别名:假
});
renderer.setPixelRatio(window.devicePixelRatio);
渲染器。设置大小(w,h);
renderer.doElement.style.position=“relative”;
container.appendChild(renderer.domeElement);
var anisomax=renderer.capabilities.getMaxAstropy();
纹理1.各向异性=各向异性;
texture1.needsUpdate=true;
//创建数据纹理
var数据=新的Uint8Array(1024*1024*3);
var texture2=新的三个.DataTexture(数据,1024,1024,三个.RGBFormat);
//texture2.minFilter=THREE.LinearMippAlinerFilter;//THREE.NearestMippLinearFilter;//THREE.NearestFilter;//THREE.NearestMippLinearFilter;
//texture2.magFilter=3.LinearFilter;
//texture2.generateMipmaps=true;
纹理2.各向异性=各向异性;
texture2.needsUpdate=true;
材质=新的3.0网格材质({
颜色:“ffffff”,
贴图:纹理2
});
material.side=3.DoubleSide;
var geometry=新的三个平面缓冲几何体(400400);
var mesh=新的三个网格(几何体、材质);
mesh.rotation.x=Math.PI/2;
场景。添加(网格);
//将加载的纹理复制到datatexture
渲染器.copyTextureToTexture(新的三个.Vector2(0,0),texture1,texture2);
document.addEventListener('mousemove',onDocumentMouseMove,false);
var inf=document.getElementById(“info”);
inf.innerHTML=“已将纹理复制到DataTexture
--单击以切换--”; //在纹理加载和铜化之间切换 document.addEventListener('mousedown',()=>{ tog1=(tog1==假)?真:假; 场景。移除(网格); 如果(tog1==真){ 材质=新的3.0网格材质({ 颜色:“ffffff”, 贴图:纹理2 }); material.side=3.DoubleSide; 网格=新的三个网格(几何体、材质); mesh.rotation.x=Math.PI/2; inf.innerHTML=“已将纹理复制到DataTexture
--单击以切换--”; }否则{ 材质=新的3.0网格材质({ 颜色:“ffffff”, 贴图:纹理1 }); 网格=新的三个网格(几何体、材质); mesh.rotation.x=-Math.PI/2; inf.innerHTML=“原始纹理”
--单击以切换--”; } 场景。添加(网格); }); 制作动画(); }//结束设置 函数animate(){ 请求动画帧(动画); render(); } 函数render(){ camera.position.x+=(mouseX-camera.position.x); 摄像机位置y=1000; 摄像机。注视(场景。位置); .clear(); 渲染器。渲染(场景、摄影机); }
正文{
颜色:#000;
字体系列:Monospace;
字体大小:13px;
文本对齐:居中;
背景色:#fff;
边际:0px;
填充:0px;
溢出:隐藏;
}
#信息{
位置:绝对位置;
字体大小:粗体;
顶部:0px;
宽度:100%;
填充物:5px;
z指数:100;
}

copyTextureToTexture测试

硬件防松弛仅应用于帧缓冲区。这是WebGL的一个已知限制。可以使用反松弛后处理对其进行补偿和/或渲染到更高分辨率的中间缓冲区,然后在完成“渲染到纹理”(render to texture)后对其进行下采样以显示分辨率


(编辑:请阅读更多关于此的内容,我不确定当前的确切限制,因此可能需要一些研究)

谢谢,但我正在复制到另一个纹理,以便将其用作任何其他正常纹理,例如加载到帧缓冲区,我不是说我们在webglrenderer上设置的“antialias:true”-我甚至将其设置为false,因为第一个纹理不需要它。不起作用的是minFilter和magFilter。如果我取消注释这些行,并将mipmapping设置为true,则渲染器将淡入图像,而不是切换到另一个自动生成的mipmap。各向异性的作用程度也要小得多。这只是字节复制,我不敢相信这会造成这么多麻烦……”例如加载到帧缓冲区,“放弃这个,我的意思是像任何其他纹理一样使用,当角度增加时线性模糊-这不起作用。你的纹理大小是2倍吗?是的,1024x1024。我试过其他几种2维幂函数。但setTimeout函数试图解决的是什么呢?在某些情况下,如果没有它,它是不起作用的,但在这种更晚的形式下,它不需要它,你是对的。谢谢你让这个片段工作-秘密是什么?我把你的图片复制到普通的imgur上让它工作。请参阅@use