three.js文字模糊问题

https://github.com/jsmask/JumpGame/

今天看到这个jsmask大神写的跳一跳网页,基于three.js写的。
编译直接就能运行,着实兴奋了一下,但是也遇到一个问题。
就是源代码中的GAME OVER场景上面的字和图片十分的模糊
网上找了一圈,先是找到了整体优化的方法,但是整体优化后文字和图片的画面还不是很理想。

renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))

后来发现了CANVAS的图像优化方法,可以用来在这优化:
可以查看https://www.geeksforgeeks.org/how-to-sharpen-blurry-text-in-html5-canvas/
左边是优化后,右边是优化前。
在这里插入图片描述
基本原理是,通过canvas.content的scale方法把画布放大,在上面画放大过后的图片,然后再通过thress进行缩放,提高图片的分辨率。也就是画了个两倍大的图,然后再缩小回来。

优化后代码如下:

this.context = canvas.getContext('2d');

//核心
this.context.scale(scale, scale)
this.context.fillStyle = 'rgba(0,0,0,.7)';
this.context.fillRect(((width - 400) / 2) /scale, ((height - 400 ) / 2)/scale, 400 /scale, 400/scale);
this.context.fillStyle = '#eee';
this.context.font = '11px Georgia';

this.context.fillText('Game Over', ((width - 200) / 2 - 15) /scale, ((height - 200) / 2 + 55)/scale);
this.replay_btn = new Image();
this.replay_btn.onload = () => {
this.context.drawImage(this.replay_btn, ((width / 2 - 60) /2) /scale , ((height - 200) / 2 + 125)/scale, 240 /scale, 94/ scale);
}
this.replay_btn.src = img_replay;

//核心
this.geometry = new THREE.PlaneGeometry(30, 30 * aspect);

源代码如下:

 this.context = canvas.getContext('2d');
 this.context.fillStyle = 'rgba(0,0,0,.7)';
 this.context.fillRect((width - 200) / 2, (height - 200) / 2, 200, 200);
 this.context.fillStyle = '#eee';
 this.context.font = '22px Georgia';
 this.context.fillText('Game Over', (width - 200) / 2 + 45, (height - 200) / 2 + 55);
 this.replay_btn = new Image();
 this.replay_btn.onload = () => {
 this.context.drawImage(this.replay_btn, width / 2 - 60, (height - 200) / 2 + 125, 120, 47);
 }
 this.replay_btn.src = img_replay;
 
 this.geometry = new THREE.PlaneGeometry(60, 60 * aspect);

写完以后突然想起来以前有一次前端生成二维码图片的清晰度不够也是通过先生成放大图,然后再缩小显示的形式来完成的。这个和那个原理上是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Three.js中设置Reflector的模糊效果,你可以使用以下步骤: 1. 创建一个RenderTarget(渲染目标)对象,用于渲染Reflector的模糊效果。RenderTarget是一个用于存储渲染结果的缓冲区。 ```javascript var renderTarget = new THREE.WebGLRenderTarget(width, height); ``` 其中`width`和`height`是RenderTarget的宽度和高度,可以根据需要进行调整。 2. 创建一个ShaderPass对象,用于应用模糊效果的着色器。你可以使用Three.js提供的内置模糊着色器或者自定义着色器。 ```javascript var blurPass = new THREE.ShaderPass(THREE.BlurShader); ``` 这里使用了`THREE.BlurShader`作为模糊效果的着色器,你也可以自定义着色器来实现不同的模糊效果。 3. 将RenderTarget设置为Reflector的renderTarget属性,以便将渲染结果存储到RenderTarget中。 ```javascript reflector.renderTarget = renderTarget; ``` 这样Reflector的渲染结果就会被存储到RenderTarget中。 4. 在渲染循环中,先渲染Reflector到RenderTarget中,然后再将RenderTarget的内容传递给模糊效果的ShaderPass进行处理。 ```javascript // 渲染Reflector到RenderTarget renderer.setRenderTarget(renderTarget); renderer.render(scene, camera); // 将RenderTarget的内容传递给模糊效果的ShaderPass进行处理 blurPass.uniforms.tDiffuse.value = renderTarget.texture; blurPass.render(renderer, composer.writeBuffer, composer.readBuffer); ``` 这里假设你正在使用EffectComposer进行后期处理,如果没有使用EffectComposer,你可以根据自己的情况进行相应的调整。 通过以上步骤,你可以在Three.js中设置Reflector的模糊效果。记得根据你的需求调整RenderTarget的大小和模糊效果的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值