LoginSignup
2
0

More than 1 year has passed since last update.

【Unity/ShaderGraph】テクスチャをプロジェクタのように投影する(備忘録)

Last updated at Posted at 2021-05-09

この記事にあるシェーダーをURPに移植した話です。

移植後の動作
ezgif.com-gif-maker__3_.gif

データ

シェーダーそのものを編集して対応させる方法もあるとは思うのですが
自分はシェーダー言語がわからないので、ShaderGraphで再現します。

スクリプト

スクリプト部分はそのまま使えそうです。
以下のパラメーターをシェーダーに送っています。
"_ProjectorMatrixVP"…VP行列(プロジェクション行列)
"_ProjectorTexture"…テクスチャ
"_ProjectorPos"…カメラの位置

シェーダー

Unlitマスターをベースに再現していきますが
マスターの機能ですでに実行されているところと、
再現しなければいけないところを切り分けました。
図2.png
元のコードの”unity_ObjectToWorld”は、”v.vertex”(オブジェクトスペースのポジション)をワールドスペースに変換するらしい。
ので、あらかじめグラフ側でワールドポジションを準備します。
①と②をなぜ別に処理しているのかはわかりません。
①部分はCPUで、②部分はGPUで処理されている?のかもしれないです。
今回は①②両方カスタムファンクションで行います。

完成したグラフは↓です
③の部分はもっといい書き方ありそう。
図3.png
図4.png

カスタムファンクションのコード

VPtransform.hlsl
void VPtransform_float
(float3 _position,
    float4x4 _ProjectorMatrixVP,
    out float4 _projectorSpacePos,
    out float2 UV)
{
        float4 vertex;
        float4 projectorSpacePos;
        float3 worldPos;
        float3 worldNormal;

#if SHADERGRAPH_PREVIEW
        _projectorSpacePos= float4 (1, 1, 1, 1);
        UV = float2(1, 1);
#else
    projectorSpacePos = mul(_ProjectorMatrixVP, _position);
    projectorSpacePos = ComputeScreenPos(projectorSpacePos);
    projectorSpacePos.xyz /= projectorSpacePos.w;
    float2 uv = float2(projectorSpacePos.x, projectorSpacePos.y);
    _projectorSpacePos = projectorSpacePos;
    UV = uv;
#endif
}

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0