LoginSignup
4
5

More than 5 years have passed since last update.

Three.jsで透明度のあるテクスチャを設定するとノイズが発生する

Last updated at Posted at 2019-01-17

はじめに

Three.js r97でパーティクルを制作していた時に、スマートフォンで表示されたパーティクルがとても残念な見た目になったので、備忘録も兼ねて解決方法を載せてみます。

どう残念だったのか

下の画像のように、パーティクルの内部に謎のノイズが混ざってしまっています。さらに、アニメーションをさせると、謎のノイズがうごめいて凄く気持ち悪い見た目になります。
myth_mobile.jpg

同じパーティクルをパソコンで見ると問題なく表示されました。
myth_pc.jpg

パーティクルに設定したテクスチャには、canvasで描画されたものを使用しています。
texture.png
※実際に使用しているテクスチャは黒背景ではありません。

その際、記述していたコードは以下の通りでした。(テクスチャの読み込み部分を抜粋)

hoge.js
// 前略...
var texture = new THREE.texture(canvas); // このままだと表示がおかしくなる
// 後略...

原因

new THREE.Texture(...)でテクスチャを作成する場合、通常は符号なしbyte型として処理されてしまいます。この状態で、透明度のあるテクスチャを作成しようとすると正しい表示ができなくなってしまうようです。

(Textures - Three.js docs, https://threejs.org/docs/#api/en/constants/Textures より)

対処法

今回の場合、テクスチャをFloat型で処理するように指定してあげると解決しました。

hoge.js
// 前略...
var texture = new THREE.texture(canvas); // これだけじゃダメ
texture.type = THREE.FloatType; // 追加してあげる
// 後略...

スマートフォンでもきれいに表示されます。
result.jpg

まとめ

透明度のあるテクスチャを扱うときは、テクスチャの処理精度を指定してあげる事が肝要です。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5