koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

Unity

lilToonのカスタムシェーダーを作るときのTips

基本 基本的なカスタムシェーダーの情報は下記公式ドキュメントを参照すること. lilToon カスタムシェーダーの作り方 ドキュメント中にある下記のファイルがテンプレートであり,この中の数ファイルを編集する. カスタムシェーダーテンプレート(zip) ジ…

レイマーチングにおけるマーチングループのbreakについて

shaderlabでレイマーチングのシェーダーを書き,マーチングループの部分のアセンブリコードを確認して不満に思う点があった. 本記事ではマーチングその不満に思う点を解消する手法について述べる. 扱うシェーダーコード この記事では下記のシェーダーコー…

モデル行列に関するメモ

モデル行列の調理 モデル行列とはオブジェクトをローカル座標からワールド座標に移動する行列であり,具体的には平行移動,回転,拡大縮小の3つを行う行列である. Unityのシェーダーとしては unity_ObjectToWorld というuniform変数で与えられる. この行列…

CustomRenderTextureVertexShader()を改善する

はじめに カスタムレンダーテクスチャの頂点シェーダーはUInityの標準ライブラリ CustomRenderTextureVertexShader から提供されており、これを用いることになっている。 しかし、実装を読み、なおかつDirect3D11の出力アセンブリを読んだところ、あまりよく…

レイマーチングにおける正規化法線ベクトルの計算と実装

たまには趣向を変えて,ですます調で記事を書いてみようと思います. レイマーチングではライティングを行うために正規化法線ベクトルの計算が必要となります. この記事ではいくつかの正規化法線ベクトルの計算手法について述べることにします. なお,僕は…

Unityのシェーダーにおいて,定数の整数乗を行う場合の繰り返し二乗法はループ展開されるか?

TL;DR 繰り返し二乗法の関数を定義し,指数に定数を指定した場合はループ展開される. しかし,pow(x, 5.0) のように指数が比較的小さい整数定数を指定した場合でも繰り返し二乗法をループ展開したものと同一のコード生成がされるため,自前で繰り返し二乗法…

シェーダーにおけるゼロベクトルの正規化

シェーダーにおいて,組み込み関数である normalize() にゼロベクトルを渡した場合,NaN になる. 正規化ベクトルの定義からも当然である. \begin{equation} normalize(\boldsymbol{v}) = \dfrac{\boldsymbol{v}}{\| \boldsymbol{v} \|} \end{equation} シ…

シェーダーにおける浮動小数点剰余(mod, fmod)の実装

TL;DR シェーダー言語によってその言語組み込みの fmod() (mod()) の実装は異なるため注意する必要がある. 挙動の罠に引っかからないためには自前で実装するのが安全である. GLSL // Equivalent to mod() in GLSL. float fmodglsl(float x, float y) { r…

Unityのシェーダで原点・XZコンパスを実装した

TL;DR 常に原点を指す,またX軸,Z軸を指す針も含むシェーダを作った. VRChatのアバターに付けるとベンリかもしれない 原点・X軸コンパスシェーダーできた.黄緑矢印が原点方向,赤矢印がX軸方向でアバターの向きに関係なく必ずその方向を指す.青矢印はX軸…

カスタムレンダーテクスチャでライフゲームを実装した

TL;DR カスタムレンダーテクスチャでライフゲームを実装してVRChatのアバターに付けた. ライフゲーム 背景 オタクはすぐにシェーダでライフゲームを実装するもの,らしい. N番煎じではあるが,VRChatのアバターにライフゲーム付けるのはすぐにできるなと思…

ZopfliPNGによるPNGの可逆再圧縮とVRMの容量削減について

この記事はIQ1 Advent Calendar 2020の7日目の記事です. TL;DR zopflipng.dllをいい感じに使うツールを作りました. 並列実行可能 zipアーカイブファイル内のファイルを一時的に書き出すことなく処理可能 更新日時タイムスタンプはそのままで再縮率実施 ま…

Unityでの変数・プロパティのアクセス性について考える

前置き 最近,Unityに触れており,C#を書くことが多い. 古いUnityの文化はわからないが,publicメンバ変数が気持ち悪くて仕方がない. (おそらく,古代のUnityではプロパティを使用できない,あるいは実行処理系がプロパティのインライン展開を行うことが…