Three.js 如何在画布上创建具有折射和反射的玻璃文本?
我想达到的目标接近于此。你也可以看看那些截图 请注意,当页面向下/向上滚动时,折射是如何变化的。滚动时,还有一个从右向左的光源 理想情况下,我希望文本具有透明的玻璃反射特性,如示例所示。但同时,折射出背后的东西,这里似乎不是这样。事实上,当画布被单独放置时,折射仍然会发生,因此我怀疑效果是在知道背景中会显示什么的情况下完成的。至于我,我想动态折射背后的东西。再一次,我在想,我之所以能以这种方式获得成功,可能是因为一个原因,也许是因为性能问题 事实上,它看起来像是基于背景,但背景不在画布内。此外,正如您可以看到的,在下一张图片中,即使背景已移除,折射效果仍会出现 光源仍然存在,我怀疑它使用了某种光线投射/光线跟踪方法。我一点也不熟悉在画布上画图(除了使用p5.js来做简单的事情),我花了很长时间才找到光线跟踪,却不知道我在找什么 。。。。问题Three.js 如何在画布上创建具有折射和反射的玻璃文本?,three.js,html5-canvas,shader,webgl,p5.js,Three.js,Html5 Canvas,Shader,Webgl,P5.js,我想达到的目标接近于此。你也可以看看那些截图 请注意,当页面向下/向上滚动时,折射是如何变化的。滚动时,还有一个从右向左的光源 理想情况下,我希望文本具有透明的玻璃反射特性,如示例所示。但同时,折射出背后的东西,这里似乎不是这样。事实上,当画布被单独放置时,折射仍然会发生,因此我怀疑效果是在知道背景中会显示什么的情况下完成的。至于我,我想动态折射背后的东西。再一次,我在想,我之所以能以这种方式获得成功,可能是因为一个原因,也许是因为性能问题 事实上,它看起来像是基于背景,但背景不在画
text.addEventListener(“键控”,createNormalMap)
createNormalMap();
函数createNormalMap(){
text.focus();
设置超时(()=>{
const can=normalMapText(text.value,“Arial Black”,96,8,2,0.1,真,“圆形”);
result.innerHTML=“”;
结果:儿童(can);
}, 0);
}
函数normalMapText(文本、字体、大小、倒角、平滑=0、曲线=0.5、平滑法线=true、角点=“圆形”){
const canvas=document.createElement(“canvas”);
const mask=document.createElement(“画布”);
const ctx=canvas.getContext(“2d”);
const ctxMask=mask.getContext(“2d”);
ctx.font=size+“px”+font;
const tw=ctx.measureText(text).width;
常数cx=(mask.width=canvas.width=tw+斜面*3)/2;
const cy=(mask.height=canvas.height=size+斜面*3)/2;
ctx.font=size+“px”+font;
ctx.textAlign=“中心”;
ctx.textb基线=“中间”;
ctx.lineJoin=角点;
常数步长=255/(斜面+1);
var j,i=0,val=step;
而(i<1){
ctx.lineWidth=斜面-i;
常数v=((val/255)**曲线)*255;
ctx.strokeStyle=`rgb(${v},${v},${v})`;
strokeText(text,cx,cy);
i++;
val+=阶跃;
}
ctx.fillStyle=“#FFF”;
ctx.fillText(text,cx,cy);
如果(平滑>=1){
ctxMask.drawImage(画布,0,0);
ctx.filter=“模糊(“+smooth+”px)”;
ctx.drawImage(掩码,0,0);
ctx.globalCompositeOperation=“目的地在”;
ctx.filter=“无”;
ctx.drawImage(掩码,0,0);
ctx.globalCompositeOperation=“源代码结束”;
}
常量w=canvas.width=canvas.height,w4=w0
常数idx=x+y*w;
常数x1=1;
常数z1=heightBuf[idx-1]==未定义?0:heightBuf[idx-1]-heightBuf[idx];
常数y1=0;
常数x2=0;
常数z2=heightBuf[idx-w]==未定义?0:heightBuf[idx-w]-heightBuf[idx];
常数y2=-1;
常数x3=1;
常数z3=heightBuf[idx-w-1]==未定义?0:heightBuf[idx-w-1]-heightBuf[idx];
常数y3=-1;
xx=y3*z2-z3*y2
yy=z3*x2-x3*z2
zz=x3*y2-y3*x2
距离=(xx*xx+yy*yy+zz*zz)**0.5;
xx/=dist;
yy/=dist;
zz/=dist;
xx1=y1*z3-z1*y3
yy1=z1*x3-x1*z3
zz1=x1*y3-y1*x3
距离=(xx1*xx1+yy1*yy1+zz1*zz1)**0.5;