在three.js場景中,有時會遇到場景模糊,紋理失真的現象,彷佛three.js並無用到紋理圖片應有的分辨率。能夠經過相關設置來解決這個問題。javascript
three.js建立的WebGLRenderer對象有抗鋸齒選項的支持:php
var renderer = new THREE.WebGLRenderer({ antialias: true, //抗鋸齒 });
這個選項默認是關閉的,因此須要顯式開啓一下。html
若是開啓抗鋸齒後仍然顯示比較模糊,那麼可能就是使用的是HiDPI (High Dots Per Inch) 設備顯示形成的,HiDPI設備能在較小尺寸下顯示出較高分辨率,也就是每個屏幕上的物理像素實際上是由多個像素顯示出來的,因此須要設置一下設備像素比率:java
renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight);
其實關於HiDPI的討論仍是挺多的,好比說有個縮放與佈局設置:
linux
這個設置會更改window.devicePixelRatio的值,若是程序不作相關的設置,那麼程序的UI顯示出來就會是模糊的。現代程序組件通常都會自動作出相關的調整,在WebGL中則須要顯式設置一下。web
測試代碼:app
'use strict'; function init() { //console.log("Using Three.js version: " + THREE.REVISION); // create a scene, that will hold all our elements such as objects, cameras and lights. var scene = new THREE.Scene(); // create a camera, which defines where we're looking at. var camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); // create a render and set the size var renderer = new THREE.WebGLRenderer({ antialias: true, //抗鋸齒 }); renderer.setClearColor(new THREE.Color(0x000000)); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); // add the output of the renderer to the html element document.getElementById("webgl-output").appendChild(renderer.domElement); var loader = new THREE.TextureLoader(); loader.setCrossOrigin('Anonymous'); var basePath = "1.jpg"; loader.load(basePath, function (texture) { // create the ground plane var planeGeometry = new THREE.PlaneGeometry(2, 2); // var planeMaterial = new THREE.MeshBasicMaterial({ // color: 0xAAAAAA // }); var planeMaterial = new THREE.MeshBasicMaterial({ map: texture }); var plane = new THREE.Mesh(planeGeometry, planeMaterial); // add the plane to the scene scene.add(plane); renderer.render(scene, camera); }); }
關閉反走樣以及HiDPI:
dom
開啓反走樣以及HiDPI以後顯示效果有所改善:
佈局