イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

Shader 遭遇した問題とその解決

++

距離で補正を掛けたい場合などはpos.wにz値が入ってるのでこれを使用すればよい。

 

++乱数を使った表示がばぐる

f:id:arumogina:20200322064135p:plain

これは乱数で値を出し、0.5以下なら以上なら1を表示している。

画像では一部01両方が表示されてしまってるのが確認できる。

乱数のシード値に使ってる浮動小数点の丸目誤差の問題だったようで、小数点下3桁を切り捨てたら解決

seed = trunc(seed*1000)/1000;

 

++メッシュの中心のワールド座標を乱数に使う場合

f:id:arumogina:20200323195853p:plain


このように表示がバグる場合があった。

理屈は分からないが

float3 wpos = trunc(i.wpos*1000+0.1);

と処理をしてから使うことで解決。(0.1がないとwposが整数値のときにバグる)

=>駄目なときもある。適当に小数値を掛けたり足したりすれば回避出来た。

 

++unrollを書け、とコンパイラが言ってくるから書いたのにエラーを吐いてくる場合

for(int i =0;i<_Num;i++){}

=>

for(int i=0;i<(_Numの最大値);i++{

  if(i>=_Num) break;

...

}

Unity2017とUnity2018の互換性・相違点

++prefab

2017=>2018は行けるが、2018=>2017は無理

 

++shader

shaderは大体は動くと思う。今のところ互換性がなかったことはない。

 

++???

MeshBuilderとかのメッシュをテクスチャ化して利用するシェーダは2017で生成したテクスチャは2018でも作用するが、2018で生成したテクスチャを2017に持っていくとバグる。

 

原因不明

Vket4 メモ

Vket4にサークル参加したので詰まった部分やノウハウをメモしておく

 

++++ノウハウ集

++コライダーの設置が面倒

f:id:arumogina:20200213201450p:plain

こういう穴が開いてるものなどはそのままBoxColliderをアタッチすると穴がふさがってしまう。そこで、4つのオブジェクトにBlenderで分割=>Boxコライダーを充てる、という風にする。なお、このオブジェクトはコライダーとしてのみ使う。

 

++++トラブル集

++入稿ツールを使ってVRChatを起動させたが画面が灰色

VRChatをopenbetaにする必要あり

出展者向け/外部公開記事/HowTo.Unity2018への移行のしかた - esa-pages.io

 

++ブースチェック時にははみ出てないのに、入稿しようとするとはみ出るエラーが出る

static設定をしているとtransformの回転が無効化されてしまうために起きていた。Dynamicとして扱えばよし

 

++GrabPassで1setpasscall増えるので不要ならコメントアウトするのが吉

 

++自分で書いたcgincファイルをincludeしてるシェーダが配置で見るとマゼンダピンクに・・・。

他の人は問題なかった、とも言っていたので良く分からん。

とりあえず、include元のファイルにcgincのコードをコピペしておいた。

 

++マテリアル数が勝手に大幅に増えた

fbxファイル内のマテリアルを計上してしまってるのが原因だった

t:Modelでプロジェクト内を検索
全て選択し、Import Materialのチェックを外してApplyで解決

f:id:arumogina:20200322202225p:plain

f:id:arumogina:20200322202304p:plain



 

ビームライトシェーダを読む

ビームライトシェーダーとモデル - NORIBEN LUNCH -のりべん専門店- - BOOTH

こちらのシェーダのコードを読んだときのメモ。

自分が見返すように書いてる。

 

円錐形(三角コーン型)のメッシュに使用している。

メッシュのUV座標が上の尖ってる部分が上となりyが高くなる。

xは紙を巻くように一周している

 

色は基本的にuv座標を使って調整

uv.yが低いほどrgbaを低くしている

また、視線ベクトルとメッシュの法線ベクトルの内積を取り、垂直であるほどrgbaを高くしている。つまり、見かけ上のメッシュの端にいくほどrgbaが低い。

 

uv.xでsin値を取り、色をしましまに濃淡をつけている

ワールド座標でノイズテクスチャのuv値を移動させ光のノイズを表現している

ライトの正面を向いたときほど光が強くなるようにローカル座標系においてカメラと原点のxz軸における距離を測り、rgba値を調整している。

 

 

Shader 水面の作り方 メモ

ここさえ読めれば出来る。

CustomRenderTextureを使って波紋エフェクトを作る - e.blog

以下、引用しているShaderやコードはこちらの記事から引用しているものとします。

 

WaveShaderは波動方程式を解き、c.rに現在の波の高さ、c.gに1フレーム前の波の高さを入力している。

 

波動方程式の理解:

float k = (2.0 * c.r) - c.g;
float p = (k + _S2 * (
    tex2D(_SelfTexture2D, uv - duv.zy).r +
    tex2D(_SelfTexture2D, uv + duv.zy).r +
    tex2D(_SelfTexture2D, uv - duv.xz).r +
    tex2D(_SelfTexture2D, uv + duv.xz).r - 4.0 * c.r
)) * _Atten;    

 

その地点の新たな波の高さを求める場合、ラプラシアンフィルタに従い、周囲とその地点の現在の波の高さを畳み込めば新たな波の高さとなります。周囲の波と高さと現在の波の高さを使って計算すれば、次の波の高さが割り出せる、ということはイメージ出来ると思います。専門分野でないなら公式のようにこういうものだと暗記しておけばいいと思います。

 

偏微分:複数変数がある場合、一つの変数を除いて全て定数として扱い微分する。

偏微分の意味とやり方

 

HeightMapは、その地点の上下・左右のベクトルを外積させることで法線ベクトルを割り出し、それを基に反射の計算をしています。

外積を求めるとその2ベクトルの法線ベクトルとなる、と覚えておけばいいと思います。

光の反射の基礎:

【Unityシェーダ入門】ランバート拡散照明モデルを試す - おもちゃラボ

この例だと光の反射の処理を書いているが、surfシェーダを使って法線ベクトルを渡すだけでもいいと思う。

 

 

CustomRenderTextureはVRChatではワールドでは使用出来るが、アバターに仕込む場合はほとんど動作しない。

CustomRenderTextureは通常のシェーダと異なり1フレーム前の状態が保存されておりそれが更新される形で作動する。

初期状態はInitializeMode=>Textureにセットする

カスタムレンダーテクスチャ - Unity マニュアル

 

Shader 不可思議現象集

 

 

 

 

GrabPass,視界ジャックキャンセラー,時止め

 

JackAはGrabAで取得したGrabTextureを使い回して、視界ジャックで表示している。

(GrabTextueはGrabPass { "_GTexA" } のように命名することで、最初に取得されたテクスチャが後続のPassだけでなく、他のマテリアルでも使い回される)

 

GrabPassはそのシェーダが実行される直前のレンダリング結果がテクスチャとして保存されている、と考えればいい。

 

なので、GrabPass取得時のRenderQueueより低い値で描画されたメッシュは表示されない

 

 

視界ジャックキャンセラーと時止め。

 

視界ジャックキャンセラーの原理:

RenderQueueを視界ジャックを表示するシェーダより低い値でGrabPassを名前付きで取得する。これをシェーダAで行う。

 

そのGrabPassテクスチャを視界ジャック表示後より、高いRenderQueueで表示する。これをシェーダBで行う。

 

時止めの原理:

ぶっちゃけ原理は分かってないので発生条件を書いておく。

上記の視界ジャックキャンセラーと同様のシステムを用意。

シェーダAのRenderQueueを2000以下にセット

シェーダBのrenderQueueをTransparent+2147480647にセット

 

シェーダAを-2147483648まで下げてみたが動作は同じ。

 

(VRCではマテリアルのRenderQueueではなく、シェーダに直接書く必要がある)

 

 

時止めが作用せず画面が真っ暗になる場合は、クライアントを再起動すると作用する