---
title: 【Unity】NovaShaderカスタムした話
tags:  #unity #shader  
author: [おかひろ](https://www.docswell.com/user/okahiro_p)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PEXPZR4Y7X.jpg?width=480
description: 2024年10月に新横浜インディゲームもくもく会でLTした資料です。
published: October 20, 24
canonical: https://www.docswell.com/s/okahiro_p/ZV16VP-2024-10-20-190843
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PEXPZR4Y7X.jpg)

NovaShaderをカスタマイズした話
おかひろ


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3EKD8RZ4JD.jpg)

自己紹介

おかひろ

Twitter：@okahiro_p

個人で東方二次創作ゲーム作っています

フリーランスのTA／グラフィックエンジニア

個人のゲームでもShaderやツール作成しまくって進捗悪い


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L73R28DDJ5.jpg)

NovaShaderとは

UnityのParticleSystem（Shuriken)向け多機能Shader

CyberAgentが開発

MITライセンス

HLSLでかかれている

URP用


# Page. 4

![Page Image](https://bcdn.docswell.com/page/87DYZMP27G.jpg)

NovaShaderの機能例

SoftParticle

パーティクルのビルボードが地面など他のオブジェクトにめり込む場合の表現
SoftParticleなし
SoftParticleあり


# Page. 5

![Page Image](https://bcdn.docswell.com/page/VJP6DRNLE8.jpg)

NovaShaderの機能例

DepthFade

パーティクルのビルボードがカメラのNearClipより手前にくる場合の表現
DepthFadeなし
DepthFadeあり


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2EV31RK67Q.jpg)

NovaShaderの機能例

Dissolve + Emission (Edge)


# Page. 7

![Page Image](https://bcdn.docswell.com/page/57G32MQ2JL.jpg)

Distortion（歪み）

NovaShaderのDistortionは半透明オブジェクトも歪ませることができる

よく見かけるDistortionShaderの紹介記事は、半透明オブジェクト未対応のも
のが多いので考慮が必要


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4EQ5PRK9JP.jpg)

よくあるDistortion

“Unity Distortion”などで検索してヒットしたページを参考に作成した
Distortion Shader
ScreenPositionとSceneColorを使う例のやつ


# Page. 9

![Page Image](https://bcdn.docswell.com/page/KJ49Y8KR71.jpg)

半透明オブジェクトが・・・


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE1K62XVJG.jpg)

なぜ？

SceneColorノードは”_CameraOpaqueTexture”をとっているが、これは不透明
オブジェクト描画の結果なので、半透明オブジェクトはまだ描画されていない
ため
ShadowMap計算など
ここで不透明オブジェクト描画して、
その結果を”_CameraOpaqueTexture”バッ
ファに格納している
不透明オブジェクト描画
半透明オブジェクト描画
ポストエフェクトなど
※ざっくり描画パイプライン
半透明オブジェクト描画
（パーティクルなど）
”_CameraOpaqueTexture”を使って歪みオブ
ジェクト描画


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GEWDWRN3J2.jpg)

NovaShaderのDistortion

半透明オブジェクトも歪ませることができる


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47ZG5R3GE3.jpg)

仕組み（ざっくり）

“_CameraOpaqueTexture”は使わず、半透明オブジェクト描画結果と「どのぐ
らい歪ませるかバッファ」をもとに歪ませる
ShadowMap計算など
不透明オブジェクト描画
半透明オブジェクト描画
ここで不透明オブジェクト描画して、
その結果を”_CameraOpaqueTexture”バッ
ファに格納している
_CameraOpaqueTextureは使わない
半透明オブジェクト描画
（パーティクルなど）
歪みオブジェクトでどのぐらい歪ませるか
（x,y）を専用バッファに描画
どのぐらい歪ませるかバッファ
ポストエフェクトなど
半透明描画も終わった描画結果と、どこを
どのぐらい歪ませるかバッファをあわせて
描画
※ざっくり描画パイプライン
半透明込み描画結果


# Page. 13

![Page Image](https://bcdn.docswell.com/page/YJ6Y9RXQ7V.jpg)

すごいぞNovaShader

でもいくつか気になる点がある


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJ5GN8X2J4.jpg)

気になる点１

歪ませる箇所とそうでない箇所の境目がパッキリしている


# Page. 15

![Page Image](https://bcdn.docswell.com/page/LE3R28X175.jpg)

Distortionでは頂点アルファが効かない
パーティクル用Shader
Distortion用Shader
Meshは端の部分に頂点アルファを乗せて作ってある
パーティクル用Shaderには”Vertex
Alpha Mode”があるのに、Distortion用
Shaderにはない！


# Page. 16

![Page Image](https://bcdn.docswell.com/page/8EDYZM2KEG.jpg)

カスタマイズ１

“どのぐらい歪ませるか”の値に頂点アルファをかけることで、Meshの端に向か
うにつれて歪みを弱くする
カスタムDistortionShader


# Page. 17

![Page Image](https://bcdn.docswell.com/page/V7P6DR13J8.jpg)

気になる点２

歪ませる箇所とそうでない箇所の境目がパッキリしている（パート２）

球体Meshなど、頂点アルファを使えない場合


# Page. 18

![Page Image](https://bcdn.docswell.com/page/2JV31RYNEQ.jpg)

DistortionではRimが効かない
パーティクル用Shader
Distortion用Shader
パーティクル用Shaderには”Rim”があるのに、Distortion用Shaderにはない！
※SoftParticlesやDepthFadeはあるのになぜ


# Page. 19

![Page Image](https://bcdn.docswell.com/page/5EG32M957L.jpg)

カスタマイズ２

視線方向と法線の内積が0に近づくほど歪みを弱める
カスタムDistortionShader


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4JQ5PRWL7P.jpg)

まとめ

NovaShaderは超便利

Distortionはちょっと気になる点がある

頂点カラーのAlpha

Rim

カスタマイズすれば対応可能


# Page. 21

![Page Image](https://bcdn.docswell.com/page/K749Y8K5E1.jpg)

ご清聴ありがとうございました


