CRTを使用する上でのあれこれ
https://docs.unity3d.com/ja/2019.4/Manual/class-CustomRenderTexture.html
上記ページに必要なことは乗っていそう
CRTを使用する上で必要な具体的なShaderの例も乗っているので、いつもここからコピペして書いている
以下の手順で制御できる
CRTのInspectorからUpdate ModeをOnDemandに設定する
例1:パラメータAで1回を1Updateで行う
例2:パラメータAで1回を3回Updateで行う
UdonSharpで対象のCRTに対して、必要回数Update()を呼ぶ
例:パラメータAからBに変えて1回を1Updateで行う
UdonSharpで対象のCRTに紐付いているMaterial(Shader)のパラメータを変更する
例:パラメータAからBに変えて3回を1Updateで行う
UdonSharpで対象のCRTに紐付いているMaterial(Shader)のパラメータを変更する
UdonSharpで対象のCRTに対して、Update()を更新したい回数-1回呼ぶ
1.で1回更新されるため、Update()は1回少なくしなければいけない
例:パラメータAからBに変えて1回、パラメータCに変えて1回、パラメータDに変えて2回を1Updateで行う
できない
MaterialのパラメータをUpdate()の間に変更したとしても、
最終的な結果のパラメータを用いて指定した回数更新されてしまう
直前の更新の描画内容を以下の形で読み込むことができる
tex2D(_SelfTexture2D, IN.globalTexcoord);
CRTの更新後、描画内容が1つ前の更新のものになってしまうようだった
※更新後にSwapされていない…?そのため、CRTを数珠つなぎにしたりすると正しく処理されない
自分自身をそのまま描画する処理を追加して、無理やりSwapする
※正直無理矢理感あるので、正しい方法があれば教えてください…1. Shaderに直前の描画内容をそのまま描画するPassを追加する
Shaderに以下のようなPassを追加する
Pass
{
Name "SelfCopy"
CGPROGRAM
#include "UnityCustomRenderTexture.cginc"
#pragma vertex CustomRenderTextureVertexShader
#pragma fragment frag
#pragma target 3.0
float4 frag(v2f_customrendertexture IN) : COLOR
{
return tex2D(_SelfTexture2D, IN.globalTexcoord);
}
ENDCG
}
2. 既存のPassに名前をつける
Pass
{
Name "任意の名前"
~
3. Update Zonesに既存のPass→SelfCopyと更新するように指定する
画像1のように設定する(図では任意の名前をUpdateとしている)
SelfCopyにはSwap (Double Buffer)のチェックボックスを入れる
※詳細は「複数のPassを1つのCRTで処理したい」にてこの設定をした後は、Unityが起動しなくなるため
絶対にShaderからPassが減るような操作を行わないこと
(誤って削除して保存もNG)
画像1.Update Zonesの設定
多段階の処理などを行うため、複数のPassをシェーダーに定義している場合
「Double Bufferedの挙動 遅れないようにするには」の項目と同様に、
1.Double Bufferedにチェックを入れる
2.直前の描画内容をそのまま描画するPassを追加する
3.すべてのPassに名前をつける
4.Update Zonesに処理するPassと2.で作ったパスを指定する
5.Update Zone 0より後にはSwap (Double Buffer)のチェックボックスを入れる
※Swapは割と重い処理ではありそうだが、他に解放法がないためこれにしているこの設定をした後は、Unityが起動しなくなるため
絶対にShaderからPassが減るような操作を行わないこと
(誤って削除して保存もNG)
対象のCRTをエクスプローラから削除
それでもだめな場合はLibraryを削除
※Passの指定が配列のindexで指定されていて、存在するPass数より少なくなると範囲外参照して落ちているんじゃないかと予想…なおして…