javascript - 使用 pixi.js/WebGL 进行缩放时效果不佳

标签 javascript html canvas webgl pixi.js

如果您将一些文本放在 pixi.js/WebGL Canvas 上并对其进行缩放,则会发生以下情况:http://jsbin.com/qeqoneselelo/1/

enter image description here

结果不好:模糊/像素化,就像我们放大位图一样。

相反,我希望能够缩放此文本,就像它是矢量图形一样(文本实际上是!),即根本没有模糊,就像这里一样(您可以无限多次缩放,没有模糊! ):http://s419743653.onlinehome.fr/things/test2.htm

如何使用 pixi.js 对文本进行适当的缩放?(或者,如果使用 pixi.js 无法实现,则使用另一个 WebGL canvas javascript 工具包?)


这是我使用的代码(仅在 http://jsbin.com/qeqoneselelo/1/ 上可用):

var text = new PIXI.Text("Hello World", {font:"50px Arial", fill:"black"});
var scrollArea = new PIXI.DisplayObjectContainer();
scrollArea.scale.x = 10;
scrollArea.scale.y = 10;
scrollArea.addChild(text);      
stage.addChild(scrollArea);

最佳答案

据我所知,没有办法。

这就是 pixi.js 的全部意义。它通过使用位图 Sprite 来提高速度。其结果是你会得到你在缩放时看到的效果,但你会获得超快的速度。

如果你想要平滑的文本,你不需要 pixi.js。只需使用 Canvas API 即可。当然,您会放弃 pixi.js 的一些速度和其他功能,但您会获得流畅的文本。

如果您想继续使用 pixi.js,一种解决方案是使用 LOD。制作多个 Sprite ,其上的文本逐渐变大,当您放大时,使用一个逐渐变大的 Sprite ,其文本分辨率更高,但具有单独的比例,因此它保持相同的大小。不幸的是,由于字体大小有些难以预测,因此要使 Sprite 完美过渡可能需要一些尝试和错误。 var 文本 = []; for (var ii = 0; ii < 15;++ii) {

  var text = new PIXI.Text("Hello World", {font: (ii * 10) +"px Arial", fill:"black"});
  text.scale.x = 1 / (1 + ii);
  text.scale.y = 1 / (1 + ii);
  texts.push(text);
}

...

  text = undefined;
  function animate() {
      var t = Date.now() * 0.001;
      var scale = 1 + 14 * (Math.sin(t) * 0.5 + 0.5);
      if (text) {
          scrollArea.removeChild(text);
      }
      text = texts[Math.floor(scale)];
      scrollArea.addChild(text);
      scrollArea.scale.x = scale;
      scrollArea.scale.y = scale;
      renderer.render(stage);        
      requestAnimFrame(animate);
  }

这是一个例子

  var stage = new PIXI.Stage(0xFFFFFF);
    var renderer = PIXI.autoDetectRenderer(800, 600);
    document.body.appendChild(renderer.view);
    var texts = [];
    for (var ii = 0; ii < 15; ++ii) {
      
      var text = new PIXI.Text("Hello World", {font: (ii * 10) +"px Arial", fill:"black"});
      text.scale.x = 1 / (1 + ii);
      text.scale.y = 1 / (1 + ii);
      texts.push(text);
    }
      
      var scrollArea = new PIXI.DisplayObjectContainer();
      
      scrollArea.interactive = true;
      scrollArea.buttonMode = true;
      
      
     // scrollArea.addChild(text);      
      stage.addChild(scrollArea);
      
      
      scrollArea.mousedown = function(data) {
        data.originalEvent.preventDefault();
        this.data = data;
        this.dragging = true;
      }
      
      scrollArea.mouseup = scrollArea.mouseupoutside = function(data) {
        this.dragging = false;
        this.data = null;
      }
      
      scrollArea.mousemove = function(data) {
        if (this.dragging) {
          var newPos = this.data.getLocalPosition(this.parent);
          this.position.x = newPos.x;
          this.position.y = newPos.y;
        }
      }
      
      text = undefined;
      function animate() {
          var t = Date.now() * 0.001;
          var scale = 1 + 14 * (Math.sin(t) * 0.5 + 0.5);
          if (text) {
              scrollArea.removeChild(text);
          }
          text = texts[Math.floor(scale)];
          scrollArea.addChild(text);
          scrollArea.scale.x = scale;
          scrollArea.scale.y = scale;
          renderer.render(stage);        
          requestAnimFrame(animate);
      }
      
      animate();
<script src="//cdnjs.cloudflare.com/ajax/libs/pixi.js/1.6.1/pixi.js"></script>

关于javascript - 使用 pixi.js/WebGL 进行缩放时效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25838214/

相关文章:

javascript - 增加长度时 Openstreet map 显示空白部分

javascript - 将包含单个整数的数组传递给 Uint8Array 会对传递给它的内容产生什么影响?

javascript - 如何利用 jQuery 来检测带有动态生成的 ID 的选择标签上的变化并更改选择的选项

javascript - fabric js - 生成图像中的对象与 Canvas 中的对象具有不同的定位

python - Tkinter 消失的 PhotoImage 问题

javascript - 改变js中的数据百分比

javascript - 索引数据库。如何在光标移动时更新记录

html - 如何使用:hover to scale overlap images?

javascript - HTML5 Canvas 在绘制的多边形内寻找对象

javascript - 鼠标悬停时重新绘制 Canvas