タグ

ブックマーク / tips.hecomi.com (43)

  • Unity でボリュームレンダリングをしてみる - vol.6 ボリュームの内部 - 凹みTips

    はじめに これまでいくつかボリュームレンダリングの記事を書いてきました。以下は前回の記事です。 tips.hecomi.com これまではキューブポリゴンを描画範囲として 3D テクスチャのボリュームレンダリングを行っていましたが、これだとポリゴンの内部にカメラが入り込んだときにカリングされてしまいます。 今回は内部にカメラが入っても継続して描画できるようにするには、どのように修正を加えればよいかの解説を行います。 リポジトリ github.com 10. Inside Volume が今回の内容になります。 原因と対策 先程も触れましたが、カメラがポリゴンの内部に入り込むと、ポリゴンは描画されません。正確には、カメラのニアクリップがオブジェクトの内部に入り込むと…、なので下図のようになります。 図の赤い部分のポリゴンが表示されなくなる感じです。解決策としては、Cull Off にしてポリ

    Unity でボリュームレンダリングをしてみる - vol.6 ボリュームの内部 - 凹みTips
  • Unity の Version Defines と.unitypackage インポートについて - 凹みTips

    はじめに 先日、uLipSync v3.0.2 をリリースし、asmdef の Version Defines を利用した VRM 0.X / 1.0 のパッケージのインポート状況に応じた VRM 向けコンポーネントのエラー抑制を行いました。 tips.hecomi.com ただこちら、.unitypackage 経由でインポートした際にうまく動かない、という報告をいただき調査してみました。 原因 Version Defines はパッケージのインポート状況に応じてシンボルを定義できる仕組みです。パッケージはバージョン指定も可能で、またパッケージだけではなく Unity のバージョン指定も出来ます。 docs.unity3d.com ただ、.unitypackage 経由でインストールした際、Version Defines で指定する Resource がインポートされた状態として扱われず

    Unity の Version Defines と.unitypackage インポートについて - 凹みTips
  • Unity でエディタ拡張向けの重い画像生成の改善をしてみた - 凹みTips

    はじめに 大分ニッチな話だと思うのですが、現在メンテしているプロジェクトで音声の解析結果を示すために画像生成を行い、それをエディタ拡張で表示して見せています。 これは Burst と Job を使って生成しているのですが、エディタ拡張の UI の体系は同期処理となるため、現状では Job を即時実行・回収することで、同期処理系となってしまっています。 tips.hecomi.com 今回はここを何とかしようと試みたお話を共有します。内容はテクスチャ生成ですが、それ以外にも重い処理を行うようなエディタ拡張のヒントになるかと思います。 コードと問題点 具体的に以下のようなコードを想定してみましょう。 AsyncTextureCreator.cs using UnityEngine; public class AsyncTextureCreator : MonoBehaviour { publi

    Unity でエディタ拡張向けの重い画像生成の改善をしてみた - 凹みTips
  • Unity の WebGL で動的にサウンドを生成・再生する方法を調べてみた - 凹みTips

    はじめに 通常、Unity で動的にサウンドを生成したいときは、AudioClip の Create で PCMReaderCallback を渡すか、MonoBehaviour の OnAudioFilterRead 中でバッファをセットすることで可能です。 docs.unity3d.com docs.unity3d.com かなり古い記事ですが、以前解説も書きました(一部有料機能と述べているところは現状はすべて無料です) tips.hecomi.com AudioClip に SetData して再生することも出来ますが、初期化時ではなく毎フレームデータを与えたい場合はこれは利用できません。正確にはセットして再生はできるのですが、サウンドの読み取り・再生自体はサウンドのスレッドで行われているため、Update などのメインスレッドから与えるとうまく再生されない(途切れたりする)からです

    Unity の WebGL で動的にサウンドを生成・再生する方法を調べてみた - 凹みTips
  • uLipSync の Timeline エディタのパフォーマンス改善を行ってみた - 凹みTips

    はじめに 先日、uLipSync のタイムラインの機能で長いデータを割り当てるとパフォーマンスが低下する、とのコメントを頂きました。実際に 3 分程のクリップを割り当ててみると顕著にパフォーマンスが落ちています。 原因を調べてみると、どうやら波形描画に用いている AudioCurveRendering の実行が重いようです。これはアンチエイリアスつきの波形描画を行ってくれるものなのですが、テクスチャを返す API ではなく、指定した領域(Rect)に波形画像を描画するものになります。そのためキャッシュもできず、描画更新が起こるタイミングで毎回生成処理が走ってしまいます。 そこで、今回はこのテクスチャを自前で生成することで処理の改善を試みてみました。愚直な Texture2D.SetPixels() を使う方式から Texture2D.GetPixelData() の利用、そして Job +

    uLipSync の Timeline エディタのパフォーマンス改善を行ってみた - 凹みTips
  • URP に新しく追加された Deferred レンダリングなどについてざっくりと調べてみた - 凹みTips

    はじめに 先日 Unity 2021 LTS が発表されましたね。 blog.unity.com Unity 2021 には数多くの機能追加がありますが、このうちの一つが URP への Deferred Rendering の正式サポートです(実験的に以前から追加はされていたようです)。 docs.unity3d.com ドキュメントはこちらです。 docs.unity3d.com ブログではレンダリングパイプラインを読んでいこう企画を何度かやってまして、URP も Unlit / Lit (Forward) については以下の記事を書きました。 tips.hecomi.com 今回は続きで、Deferred を始めとして、前回執筆時から更新があり追加された DepthNormals パスやデカールなどについて書いていこうと思います。ただし、今回は、マクロの分岐なども含めてものすごい深堀り

    URP に新しく追加された Deferred レンダリングなどについてざっくりと調べてみた - 凹みTips
  • Unity でリアルタイムにリップシンクを行うプラグインを更に作り直してみた - 凹みTips

    はじめに 前回、リップシンクするプラグインを作り直してみた記事を書きました。 tips.hecomi.com 色々とご反響を頂いたのですが、しかしながら母音推定の性能がいまいちでした。第 1 、第 2 フォルマントという周波数スペクトルの 1 つ目、2 つ目のピークを検出する方法を採用していたのですが、このピークの検出が周波数スペクトル包絡を得るために使っている LPC 解析のパラメタに大きく依存したり、またノイズや声の高さによって容易にピークが別の場所に移ってしまったりといったことが原因でした。 そこで手法を変え、MFCC(メル周波数ケプストラム係数)を求める方式へと変更しました。 speechresearch.fiw-web.net これはディープラーニング以前の音声認識に使われていたもののようで、母音だけでなく子音も含む音素の検出が可能な特徴量になります。以前の手法と異なりピッチ変化

    Unity でリアルタイムにリップシンクを行うプラグインを更に作り直してみた - 凹みTips
  • Unity でリアルタイムにリップシンクを行うプラグインを作り直してみた - 凹みTips

    はじめに Unity でリップシンクを行う手段としては、事前にデータを作るものからリアルタイムに解析するものまで色々あります。ブログでも以前、自分で作ったり Oculus 製のものを解説したりしました。 tips.hecomi.com tips.hecomi.com 前者の記事で自分が 7 年程前に作ったものは様々な依存(外部ライブラリやツールなど)が多く扱いづらいものでした。そこで今回これらの依存を廃してリップシンク単機能に絞り、またもう少しナウい実装にして uLipSync という名前で作り直してみました。 Job と Burst コンパイラを利用して処理を裏に回しつつ高速化 Unity のパッケージ以外の依存を排除 エントリでは使い方をちょっとした解説を交えて紹介したいと思います。 追記(2021/02/27) 新しいバージョンの説明を書きました。 tips.hecomi.com

    Unity でリアルタイムにリップシンクを行うプラグインを作り直してみた - 凹みTips
  • Unity 向けに HLSL Tools for Visual Studio を便利にするアセットを作ってみた - 凹みTips

    はじめに 記事は Unity Advent Calendar 2020 の 20 日目の記事です。 qiita.com Windows 上の Unity でシェーダを書く(読む)際は Visual Studio を使うことが多いかもしれません(VSCode の人も多いと思いますが...)。しかしながらそのままでは補完も効かずシンタックスハイライトもほとんどありません。 これを良い感じにくれるのが、HLSL Tools for Visual Studio です。 marketplace.visualstudio.com まず、この拡張機能をインストールします。 すると変数を認識してくれて補完もいくつか効くようになります。 ただ、Unity 体がインストールされているディレクトリからインクルードしている UnityCG.cginc から来ているメンバは解決できません。また、URP / HD

    Unity 向けに HLSL Tools for Visual Studio を便利にするアセットを作ってみた - 凹みTips
  • SDF テクスチャを uRaymarching で描画してみる - 凹みTips

    はじめに uRaymarching 関連の話題になります、Twitter で SDFr と uRaymarching を試されている方から質問をもらいまして、調査をはじめました。前回の記事はこちら: tips.hecomi.com これまでは物体表面までの距離を距離関数で記述してレイマーチングする手法を紹介してきましたが、この距離は別に関数でなくても問題ありません。ある地点から物体までの距離がどれくらいの場所にあるのかを符号付き(外部なら +、内部なら -)で示せればよいわけで、距離情報を 3 次元的に格納した 3D テクスチャでも実現できます(ちなみに TextMeshPro では 2 次元的に文字までの距離を格納したテクスチャでフォント描画を行っています)。キューブの中に入ったレイのある地点において 3D テクスチャをサンプリングし、その距離分だけ再度レイをすすめる、を繰り返していくこ

    SDF テクスチャを uRaymarching で描画してみる - 凹みTips
  • Unity でボリュームレンダリングをしてみる - vol.4 プロシージャル - 凹みTips

    はじめに 記事はボリュームレンダリングシリーズで以下の記事の続きです(2年ぶり)。 tips.hecomi.com 前回までは魚の 3D テクスチャを使いましたが、今回はノイズ関数を使って雲のようなものを作ってみたいと思います。前回同様キューブポリゴン内に生成する形を取り、ノイズ関数によるプロシージャルな密度関数をトレースするところを解説します。 参考 雲の生成は以下の Shadertoy の方法を参考に実装します。 www.shadertoy.com 手法ついては edo_m18さんが解説記事を書かれており、補足コメント付きの Shadertoy でのサンプルも公開されています。 qiita.com www.shadertoy.com これらは以下の Shader Bits さんの記事を参考に作られています。 shaderbits.com この記事に関しても edo_m18さんが日

    Unity でボリュームレンダリングをしてみる - vol.4 プロシージャル - 凹みTips
  • Unity で距離関数の記述だけでレイマーチングができる uRaymarching の UniversalRP 対応してみた - 凹みTips

    はじめに uRaymarching は Unity 上で簡単にレイマーチングするオブジェクトを生成することの出来るアセットです。詳細については以前の記事をご参照ください。 tips.hecomi.com tips.hecomi.com これまではレガシーなパイプライン(Forward / Deferred)の対応みでしたが、Scriptable Render Pipeline の登場以後 UniversalRP や HDRP の要望をチラホラ頂いていたので、まずは手始めに UniversalRP 対応を行ってみました。エントリでは今回のアップデートで追加された UniversalRP テンプレートの紹介と、実装で行ったことや解決した問題などのノウハウについて共有したいと思います。 デモ 12 ポリゴンのキューブで描画されています。UniversalRP 下で従来と同じように Lit /

    Unity で距離関数の記述だけでレイマーチングができる uRaymarching の UniversalRP 対応してみた - 凹みTips
  • Unity の ShaderGraph の仕組みについて調べてみた - 凹みTips

    はじめに 記事は Unity Advent Calendar 5 日目の記事です。 以前の記事で UniversalRP(URP) の調査を行いました。 tips.hecomi.com 今回は、その続きとして URP / HDRP の目玉機能の一つである ShaderGraph について調べてみます。私もノードグラフではないですがテンプレートと正規表現ベースの簡単なシェーダジェネレータを作成したことがあるので、参考にしたいなと考えているのと単純に興味があったのでコード読みをしてみました。 tips.hecomi.com この記事では URP やシェーダグラフの使い方という実践的な内容ではなく、ノードの拡張の前準備として、ちょっとマニアックですが生成されたシェーダやそのシェーダコード生成の仕組みの方を探ります。前回の記事の内容を読んでおいていただけると幾分読みやすいと思いますが、そもそもこ

    Unity の ShaderGraph の仕組みについて調べてみた - 凹みTips
  • Unity の Universal Render Pipeline のレンダリング周りについて勉強してみた - 凹みTips

    はじめに 以前、Lightweight Render Pipeline(LWRP)と呼ばれていたパイプラインが 2019.3(SRP 7.0.0)から、Universal Render Pipeline(UniversalRP / URP)と改名されました。 blogs.unity3d.com 私は LWRP 含む SRP をあまり調べていなかったのですが、配布しているライブラリの LWRP 対応要望もちらほら聞こえてきましたので、詳しく調べてみることにしました。が、いきなり体系的にまとめるのは自分も分かっていない点が多くかなり大変...なので、プロジェクトを作成し、以前のビルトインのパイプラインから変わったところ等を適当な順番で色々見ていくことにしました。記事ではレンダリング回り(パイプラインやシェーダの変更点)について調べます(シェーダグラフは記事では触れません)。URP そのもの

    Unity の Universal Render Pipeline のレンダリング周りについて勉強してみた - 凹みTips
  • Unity の XR 向けシングルパスステレオレンダリングについて調べてみた - 凹みTips

    はじめに Unity での XR Settings に含まれる Stereo Rendering Method ですが、みなさんは理解されていますか?ちなみに私は理解していませんでした。。 なんとなく マルチパス は遅くて シングルパス にすると速い、しかしながらシングルパスにするにはシェーダの対応が必要、といった知識はあったのですが、では具体的に中で何が起きているのかはこれまで深く見てきませんでした。そこでエントリでは以下の公式ブログ記事を参考に、両眼立体視系(2 枚のレンダーターゲットが必要とされる状況)の XR でのレンダリング手法の概要を見ると共に、ユーザがシェーダでどういった対応を行わなければならないのか、またそれは何故なのか、といった点を解説していきたいと思います。 blogs.unity3d.com XR レンダリング概要 Unity の公式ブログでは マルチカメラ、マルチ

    Unity の XR 向けシングルパスステレオレンダリングについて調べてみた - 凹みTips
  • Oculus Avatar SDK を使って自分のアバターを Unity で利用する方法を調べてみた - 凹みTips

    はじめに Oculus の Home アプリから以下のようにアバタを編集できます。 このアバタは Oculus Avatar SDK を利用することで Unity 内でも利用することが出来ます。ただ、現状少し手順が多く大変です。というのも、このアバタ情報は Oculus のサーバ側に保存されており、そのデータを取ってくるのは Oculus Platform SDK という別の SDK になります。公式のドキュメントにも書かれていますが現状 Avatar SDK は Platform SDK からのユーザ情報(ID)を使ってアバタ情報を取ってくるような形になっていません。 Developer Center — Documentation and SDKs | Oculus エントリでは、どうやれば自身のアバタが表示できるかを解説したいと思います。 なお、Oculus Rift のアプリ開発

    Oculus Avatar SDK を使って自分のアバターを Unity で利用する方法を調べてみた - 凹みTips
  • Unity で Windows のウィンドウを個別にキャプチャできるアセットを作成した - 凹みTips

    はじめに エントリでは先ほど公開した uWindowCapture という Windows において個別のウィンドウをキャプチャできるアセットの解説を行います。アセットで実現できることは以下のようなものです。 ウィンドウを個別にキャプチャ 背面やデスクトップ画面の範囲外にある部分もキャプチャします デスクトップをキャプチャ uDesktopDuplication よりは低速ですが古い Windows でも動くはず ウィンドウマネージャ ウィンドウの追加・削除や検索 タイトルや位置、大きさなどの情報が取れます デモ 個別画面キャプチャ ウィンドウマネージャ VR 内ウィンドウ自由配置 作った経緯 VR の中ではディスプレイという概念を取っ払った環境が作れるはず!というコンセプトは色々な人が考えていると思います。それを考える上での題材の一つとして、デスクトップをどうするか、もう少し正確には

    Unity で Windows のウィンドウを個別にキャプチャできるアセットを作成した - 凹みTips
  • Unity でテクスチャに使う画像をネイティブ側で読み込んでみた(CustomTextureUpdate 編) - 凹みTips

    はじめに 前回は以下の記事で低レベルネイティブプラグインインターフェースを使ったテクスチャのアップデートについての解説を行いました: tips.hecomi.com しかし前回のプロジェクトでは以下の点で複数プラットフォーム対応が面倒という問題がありました: グラフィクス API 毎のコードを書く 各プラットフォーム向けのライブラリが必要 複数のプラットフォーム向けにビルド この内、ネイティブプラグインを使っている関係で 2 と 3 は仕方ないのですが、1 に関しては 2017.2b10 から追加された CustomTextureUpdate を利用することで意識しなくても良くなります。今回の記事では、これを使って前回同様テクスチャ更新を行う解説を行いたいと思います。 サンプルプロジェクト github.com 結果は前回と同じくテクスチャが反映されます: API 概要 Unity 201

    Unity でテクスチャに使う画像をネイティブ側で読み込んでみた(CustomTextureUpdate 編) - 凹みTips
  • Unity でテクスチャに使う画像をネイティブ側で読み込んでみた(低レベルネイティブプラグインインターフェース編) - 凹みTips

    はじめに Unity で画像をネイティブ側で非同期に読み込みたい、というお話が Twitter で出ていたので、やってみました。 従来の問題点 StreamingAssets ディレクトリやウェブから WWW や UnityWebRequest で持ってきた画像ファイルを使う場合、Unity にデコードを任せると以下のようなコードになります。 using UnityEngine; using UnityEngine.Profiling; using System.Collections; public class LoadTextureSync : MonoBehaviour { [SerializeField] string path = "hecomi.png"; IEnumerator Start() { var material = GetComponent<Renderer>()

    Unity でテクスチャに使う画像をネイティブ側で読み込んでみた(低レベルネイティブプラグインインターフェース編) - 凹みTips
  • Unity で Standard Surface Shader の変換後のコードを追ってみた (Forward) - 凹みTips

    はじめに サーフェスシェーダは Unity が提供してくれているライティングなどの処理を簡略化して書けるシェーダです。予め定義された SurfaceOutput や SurfaceOutputStandard といった構造体に必要な情報を詰め、影を使うかアルファを使うかといったオプションを選択してあげると、それらの情報を元に頂点・フラグメントシェーダに変換してくれます。 docs.unity3d.com 変換後の頂点・フラグメントシェーダはサーフェスシェーダ時と比べるとかなり長いコードになります(Standard Shader よりは少しシンプルです)。パスも複数含まれ、Forward Base(Forward レンダリング時のベース処理)、Forward Add(Forward レンダリング時のライト加算処理)、Deferred(Deferred レンダリング時の処理)、Meta(ライト

    Unity で Standard Surface Shader の変換後のコードを追ってみた (Forward) - 凹みTips