今日の雑記

・睡眠時間7〜8時間くらい。今回はちょっと二度寝がまた難しかったかなぁ。久しぶりにトイレに行かないとダメな状況もあったし。それ以外は今まで通り。土日はグダグダと二度寝できれば良いのだけど。


・そういえば一昨日あたりから吹き出物の数が多い。「この程度なら大丈夫だろう」と思っていたマーガリンの摂取量が実際には許容量をオーバーしてたっぽい。


・昨日に続きデバッグ。朝礼で連絡したものの特に要望が来ないので、すでに直ってる疑惑がありつつ調査に時間がかかりそうな部分を調査する。
で、調べてたらまたどうもCGPROGRAMまわりの問題っぽいなー。とりあえずShaderLabで一通り書き直してみるか。定数まわりの扱いができたか覚えてないし、そもそもShaderLabでのPassの書き方をすっかり忘れてるので基礎から調べつつやっていこう。今日はこれだけで終わりそうな感じ。


・というわけで置き換えてたのだけど、確かにShaderLabのままでは書けないところにぶつかった。TexのRGBをマスク代わりにしてAの計算に使うのはShaderLabの機能をざっと見た感じでは確かにムリそう。
しかしここさえなんとかなれば書き換えられるので、しばらくここらへんのやり方についてあれこれ考えていよう。


・たぶんマスクをわざわざ分けてるのは、普通にAを使ってしまうとRGBの値にあれこれ影響する環境があるからだよなー。まぁ他の影響もあるかもしれないが、ともかくキッチリαを計算するためにわけてるのだと思う。であればテクスチャ側の変更は難しいだろう。
だからテクスチャのRGBをなんとかしてAの計算に使えるような、あるいはRGBの値でアルファテストする感じのことができると良いのかな。
こうやって考えてても進展なさそうだな。ShaderLabの機能を改めて一通りチェックしてみるか。


・あぁ。パスを増やすかぁ。処理負荷が高くなるのが難だが、しかしそれならやりようがあるか。そもそもそんな描画負荷が高くなるタイプのゲームでもないしな。でも10個前後の描画でこれを使うからなー。ピクセルシェーダの負荷を高めるタイプだから、全部が表示される状況だとアレかなぁ。しかし現状ではそれくらいしかできなさそうだし、いったんこの方向で対応を進めてみよう。


・ん。Blendのαの方にColor側の参照をやればいけるのか?と思ったがなんか上手くいかないのか?もうちょっとあれこれやろう。


・αテスト→ブレンディングの順序だから「ブレンディングで指定したαをもとにαテスト」みたいなのはムリ、と。
そしてブレンディングの指定を2つに分けてαを追加しても、そっちのαはもうRGB側には無関係な感じのαになるのでColorによって透明化しようとしてもムリ、と。
ううむ。


・ステンシルでもムリだなー。RGBAの値を参照してステンシルに書き込むような処理がないし。


・そもそもなんで「Blend Zero One」でSrc側が無視されないんだろう。「Src * Zero + Dst * One」になると思ってるんだけど、そこから違うのか。あるいは他の部分の設定の問題か。


・半日ほどグチャグチャしてたが上手くいかないなぁ。他の部分はさておき、ブレンディングの設定が想定と違うのが納得いかないので、少し休憩してからこの部分の理解を進めることにしよう。


・あぁ。レンダリングパスの問題というか、「"Queue"="Transparent-1"」としている部分の問題っぽい。Opaqだと思ってたけど背景が実際にはTransのタイミングで描かれているので、そいつより先に描画されるからDstの参照がそちらに行かずに黒い表示になってた。うん、理解できた。
そして、そうしてある理由もたぶんアレだろうなぁと思うので、そこらへんとの兼ね合いを考えつつパスの順序を考えないとダメなのか。でもこれでようやくブレンドまわりであれこれできそうな感じはしてきた。


・うん。Transparent-1せずにやるバージョンはできた。BlendOpのRevSubの挙動がよくわからなかったが、「Dst-Src]にするってことがわかれば想定したものが作れるようになった。具体的には1回目のパスで黒抜きし、2回目のパスでそこに加算して描き込むことでαなしでもマスクを使ってαな挙動をさせることができた。
あとはこれで他のとこの挙動を見て、たぶん問題が出るだろうからそこでまた改めてどうするか考えよう。


・あぁ、それ以前に複数のパーツを重ねた時点でダメだった。黒抜きはまぁ良いとして、その後に加算するのがダメだなぁ。
ん?いや、ピクセルシェーダごとにこの2つが回るのなら、重なった部分はやはり黒抜きされるはずだよな。そうなってないってことは、1つ目のパスの直後に2つ目のパスが走ってるんじゃなくて、各ピクセルシェーダで1つ目のパスを一通り実行したあとに2つ目のパスが走ってるってことか?パスごとに順序が決められるからその可能性は確かにあるが。であればこの2つのパスを一度にやって欲しい場合はどうすりゃいいんだ。


・色々いじってRevSub使わなくてもいけるパターンとかは見つけたが、肝心の問題の対応方法は見つからず。
単にマスク用のRGBをそのままαに持ってくるだけなんだけどなー。


・あぁ。GrabPassでDst側をサンプリングしてそれを云々すれば良いのか。しかしそうなるとまた負荷が高くなるなぁ。まぁひとまずこれで進めよう。残り2時間くらいだから今日はここまでで終わりそう。


・と思ったけどGrabPassでDstをとれてないっぽいなー。この方法でもムリそう。


・今日はこれ以上はもうムリだなー。負荷はギリギリかかってないようだが、これ以上は影響が出そうだし、そもそももう思いつかん。今日はあとは軽く動作確認とかだけしていよう。


・マスクを使う件はkeijiroさんの案っぽいな。マスクを使う理由もわかりやすい。
https://github.com/keijiro/unity-alphamask
ていうかkeijiroさんでCGPROGRAMを避けられないなら自分がこれ以上頑張っても上手くいく可能性は低いな。
というわけで来週からは別件のデバッグに移ることにしよう。


・でもなー。気になるんだよなー。これからの検証で端末ごとに変な見た目になることも想定されるし。頭の片隅には置き続けよう。
そもそも黒抜きであればメッシュが重なったりしない限りはうまくいったわけで、そっちならまだ目があるのかもしれない。