うにてぃブログ

主にUnityとC#に関する記事を書いていきます

Shader

【Unity】float で Color.rgb を近似する

Meshの情報を使ってShaderで色を操作する際、RGB値を渡すとfloat3が必要になりますが、多くの色を扱いたい場合はできるだけ使用する数を減らしたいですね。 そのような場合、RGBをfloatに変換し、Shader側でfloatからRGBに変換することで、完全には復元でき…

【Unity】URP12.1.8 のカスタマイズ用 Shader メモ

Shader を作成する際に、URPの中を探してコピーしてくるのが面倒だったので、基本的な Shader だけ抜き出して github にあげておきます 必要な際にご利用ください UnityURPShaderSample/URP12.1.8 at main · yayorozu/UnityURPShaderSample · GitHub

【Unity】RendererFeature を利用した複数地点のソナー表現

https://hacchi-man.hatenablog.com/entry/2023/01/05/220000hacchi-man.hatenablog.com では1地点のみのソナー表現でしたが、Shader側に複数の座標パラメータを渡すことにより複数地点でのソナー表現ができるようになりました パラメータをセットするのは何…

【Unity】RendererFeature を利用した PostProcess 用のテンプレート

Unity2021.3.15f1. URP 12.1.8 ※URP14の場合はこちら PostProcess 用のスクリプトをたまに忘れるのでこちらにメモしておきます using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; [Serializable] public class Sampl…

【Unity】uGUI 用 Dissolve Shader

ノイズテクスチャを使って uGUI で Dissolve っぽい表現をやってみたかったので Unity2020 の uGUI Shader をもとに作成してみました 使い方 以下の Shader を作成してから、以下のコンポーネントを Image がある GameObejct に追加し よしななノイズテクス…

【Unity】uGUI の Image を利用して背景をぼかす

iPhone で 通知センターを利用したときに背景がぼけるようなものを作りたかったので、GrabPass を利用してできないかやってみた 描画順が手前のものに対してちゃんとぼかしっぽいことができてるのが確認できる 使うには Material の Shader をこれにして Ima…

【Unity】ShaderLab: GrabPass を使ってみる

GrabPass 描画する際に、現在の画面のテクスチャを取得することができるパス 例 例えばこういったオブジェクト配置の際に D で GrabPass を利用すると以下のようなテクスチャが取得できる テクスチャ自体はこれですが、現在の描画位置に合わせて変換した座標…

【Unity】Shader コードの複数パスでパラメータを共有する

複数パスの Shader で各パスごとに全部記述していくと以下のようになる Shader "Custom/Outline" { Properties { _Stencil ("Stencil", int) = 10 } SubShader { Tags { "RenderType"="Opaque" } Pass { Stencil { Ref [_Stencil] Comp notequal } ZWrite Of…

【Unity】URP で PostProcess を利用する

URP で PostEffect を利用するには ForwardRendererData を作成して UniversalRenderPipeline に登録する必要がある この手順を記述する ScriptableRendererFeature の作成 ScriptableRendererFeature は レンダラーにレンダリングパスを追加するためのクラ…

【Shader】オブジェクトを重ねた数によって色を変える〜アルファちょっと対応〜

https://hacchi-man.hatenablog.com/entry/2021/02/23/220000hacchi-man.hatenablog.com 以前の記事でアルファ画像が対応できなかったのですが、少し調査したらまだ問題ありますが アルファを適当できたので、メモがてら追加しておきます オブジェクトのシェ…

【Shader】オブジェクトを重ねた数によって色を変える

Stencil Shader を利用して、オブジェクトの重なり具合に応じて色を変える実装をしてみます オブジェクトのShader Stencil Pass を利用して オブジェクトがある箇所のステンシルバッファの値を加算していきます こうすることでオブジェクトが重なっている箇…

【Unity】SpriteRenderer を FillAmount する

uGUI の Image は IMeshModifier を利用すれば、頂点座標や uv の変更ができました しかし、SpriteRenderer では Sprite の頂点座標や uv を利用しているため変更ができません そのため、Shader を利用して FillAmount を実装する必要があります 使い方 Spri…

【Shader】NoScaleOffset プロパティ

Unity で Unlit の Shader を作成すると以下のテンプレートコードが生成される ※ 本来は Fog の設定があるが消している Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" }…

【Unity】法線マッピングを使ってみる

法線マップ(Normal Map)(Bump mapping) - Unity マニュアル 公式にあるように法線 (Normal) マッピングとは、法線マップを利用してモデルの表面に凸凹や、傷などを付ける技法 上記のリンクより画像をそのままお借りしますが、石垣のテクスチャに対して …

【Unity】スクリプトから Shader もしくは Material にパラメータを渡す

Shader には SetGlobalColor や SetGlobalVector また Material には SetColor や SetVector などパラメータを渡すためのメソッドが用意してあります Shader では そのパラメータを持っている すべての Shader に対して変更を行えます Material では その Ma…

【Unity】指定した球の範囲のみ描画する Shader

昔マリオギャラクシーで一部分範囲だけ床が見えていて、見えている範囲が動き進んでいくステージがあったのを思い出し、 似たようなものが Shader で作れないかと思い作ってみました 処理は単純で pow(i.wpos.x - _Center.x, 2) + pow(i.wpos.y - _Center.y,…

【Unity】アルファテクスチャを利用できる Shader

通常テクスチャを表示する Shader では Alpha のあるテクスチャを利用すると 下図のようにAlpha部分は無く表示がおかしくなってしまいます Shader "Custom/Texture" { Properties { [NoScaleOffset] _MainTex("Texture", 2D) = "white" {} } SubShader { Tag…

【Unity】頂点カラーとテクスチャを乗算する Shader

頂点カラーとテクスチャの乗算色を表示する Shader Shader "Cust/TextureAndVertexColor" { Properties { [NoScaleOffset] _MainTex("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Unit…

【Unity】頂点カラー Shader

頂点カラーのみを表示する Shader Shader "Custom/VertexColor" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float4 color: COLOR; }; struct v2f { f…

【Unity】Material にパラメータをセットする際の速度計測

Material に パラメータをセットする際には Material.SetColor や Material.SetVector などを利用する この際に第一引数には string と int を指定することができる string の場合でも 結局 int に変換されるのですが、この変換処理が遅いらしいので調べてみ…

【Unity】Shader で三角関数の値をテクスチャから読み込む

三角関数はもっと遅い - Vitalabolove 店長の雑記帳 上記のサイトを見ていただければ分かるように 三角関数 の計算は遅い なので Shader で利用する際には使いすぎないように注意しようと言われている だから テクスチャ の rgb に sin, cos, tan の結果を書…

【Unity】Shader を利用して Sprite Animation をする

画像はこちらのを利用させていただく Lightning Bolt Effect for Unity | Particles/Effects | Unity Asset Store 縦横の分割数と、1枚あたりの時間を指定して利用する そうするとこのように Shader で SpriteAnimation ができます Shader "Unlit/SpriteAnim…

【Unity】輪郭 Shader を作る

ddx と ddy を利用して輪郭が取得できるかのテストを兼ねて作成してみました 画像は以下のサイトから利用させていただいています [無料写真] 空に浮かぶ風船 - パブリックドメインQ:著作権フリー画像素材集 輪郭 色の差分が少ないところは灰色になってるの…

【Unity】Surface + Vertex Shader

Surface Shader の頂点処理を差し込む場合は pragma の最後に指定してやれば良い #pragma surface surf Lambert vertex:vert Shader "SurfaceVert" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossi…

【Unity】Z-Depth が取得できないことがある

カメラの Z-Depth を利用する Shader を記述していると一部オブジェクトで Z-Depthが取得できないことがあった 調べてみると Unlit Shader の場合は Z-Depth が取得できないようでした 理由も調査したのですが、詳しい理由はわかりませんでした・・・ 対応 …

【Unity】vert_img を使った 頂点処理の記述を省略したシェーダー

UnityCG.cginc 内に vert_img という頂点処理用のメソッドが用意されているので 頂点とuvしか利用しない場合こちらを利用したほうが手軽で行数も少なくなる struct appdata_img { float4 vertex : POSITION; half2 texcoord : TEXCOORD0; }; struct v2f_img …

【Unity】ライティングが無効な Surface Shader

Surface Shader でライトを無効にしたいことがあり、作成 左側がライトが有効なもので、左側がライトが無効なものです Shader "Custom/UnlitSurf" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" }…

【Unity】どうぶつの森のような曲がった世界を作る

どうぶつの森のような曲がった世界を Unity で再現してみたかったのでやってみます あつまれ どうぶつの森 | Nintendo Switch | 任天堂 計算式 ある点から進むにつれて頂点の座標を下図グラフのように下げてやれば 同じようにできるはずなので、これをもとに…

【Unity】セピア シェーダー

画像のセピア色への変換(備忘録) 上記記事を参考にポストエフェクトを利用して セピア に変換してみました Shader "Unlit/Sepia" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGP…

【Unity】モザイク シェーダー

SizeXとSizeYを調整することで縦横のモザイクサイズを変更できます 上と左が0.5ずれているのを直したいが直し方が分からなかったため、いつか直します Shader "Unlit/Pixelation" { Properties { [NoScaleOffset] _MainTex ("Main Tex", 2D) = "white" {} _S…