ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【Unity】ComputeShader + Graphics.DrawMeshInstancedIndirectで大量のオブジェクトを描画する

今回はComputeShaderで大量のオブジェクトの座標を計算して、それをGPUインスタンシングを使って描画します。 オブジェクトの移動アルゴリズムはBoidアルゴリズムを使用していますが、今回こちらの解説は行いません。 youtu.be Step1 : ComputeShaderに必要…

【Unity】ディザリングを実装してみた

ディザリングとは 一定間隔で穴を空けることで、不透明だけど半透明に見せることができます。 通常の半透明で発生する不具合や、処理負荷の問題が発生しないのが利点です。 youtu.be 穴を開けるパターン 現在描画するピクセルがを開けるか判定する方法の一つ…

【Unity】Compute Shaderの基礎

ComputeShaderとは GPUで実行するプログラムです 画像処理、ポストエフェクト、物理シミュレーション、アニメーション、水面シミュレーション 、パーティクル演算などCPUよりもGPUの並列計算を使用したい時に使われます。 カーネル カーネルとは、GPUで実行…

【Unity】【URP】LUT (ルックアップテーブル)

カラーグレーディング(Color Grading) とは 画面の色合いを調整するポストエフェクトです。 LUTとは ルックアップテーブル(Look Up Table)の略称で、入力されたRGBを指定した別のRGBに変換するための情報が格納されてたテクスチャです。 カラーグレーディン…

【Unity】半透明描画について

半透明とブレンドモード 半透明を描画するときに背景の色とブレンドさせるにはブレンドモードという機能を使用します。 ブレンドモードは以下のように記述します。 Blend SrcFactor DstFactor SrcFactorとDstFactorはそのまま記述するのではなく、決められた…

【Unity】【URP】接空間まとめ

接空間とは ポリゴンの表面を基準とした座標空間です。 ローカル空間の法線を全て面に対して垂直にした時、ポリゴンの向きによって法線の値が変わりますが、接空間ではポリゴンの向きに影響されません。 うにばな(ノーマル(法線)基本 と ノーマルマップ合…

タイルベースレンダリングとは

タイルベースレンダリングとは? スマートフォンやタブレットで採用されているレンダリング手法で、GPU画面を複数のタイルに分割して、描画します。メモリの容量を節約し、描画速度を上げてくれます。 PowerVR - embedded graphics processors powering icon…

【Unity】シェーダーモデルとは

シェーダーモデル(Shader Model)とは? GPUによって、サポートされているシェーダーの機能は異なります。 サポートされていない機能をコンパイル時にエラーが発生したり、デバイスが実行時にシェーダーをサポートできなくなる可能性があります。 これはグラ…

【Unity】テクスチャストリーミング

テクスチャストリーミングとは 通常、ミップマップは全ミップがメモリにロードされますが、テクスチャストリーミングを使用すれば、現在のカメラ位置のレンダリングに必要な分だけ、ミップマップをロードするので、GPU メモリを節約することができます。 手…

【Unity】ミップマップとテクスチャフィルタリング

ミップマップの基本 - Unity マニュアル引用 ミップマップとは? 元のテクスチャ解像度を1/2ずつ縮小しながら何枚もテクスチャを生成します。生成した一つ一つのテクスチャをミップといい、全てのミップのまとめたものをミップマップと言います。 youtu.be …

【Unity】【URP】URPにおけるディファードレンダリング

ディファードレンダリングについての解説とURPではどのように実装さているのか見ていきたいと思います。 フォワードレンダリングの実装についてはこちらで解説しているので、よろしければご覧ください。 ny-program.hatenablog.com ディファードレンダリング…

インクルードガード

URPのLitShaderを眺めているとLitFowardPass.hlslに 謎のディレクティブがあったので、調べてみました。 // LitFowardPass.hlsl #ifndef UNIVERSAL_FORWARD_LIT_PASS_INCLUDED #define UNIVERSAL_FORWARD_LIT_PASS_INCLUDED ・ ・ ・ #endif どうやらこれは…

三角関数まとめ

Const float PI = 3.14159; ラジアンの範囲(0-2PI) sin値(斜辺 / 高さ) cos値(斜辺 / 底辺) tan値(高さ / 斜辺) 三角関数 sin ラジアンからsin値を求める cos ラジアンからcos値を求める tan ラジアンからtan値を求める 逆三角関数 asin sin値からラジアンを…

【Shader】座標系まとめ

座標系についてまとめておきます 。 Homogeneous Coordinates(同次座標系) ( x,y,z,w)4次元として扱うこと。 非同次座標系(直交座標系)への変換は(x,y,z,w) = ( x/w ,y/w ,z/w ,1)というように行う。 この変換を正規化という。 ObjectSpace(オブジェクト座標…

【Unity】【URP】【物理カメラ】カメラについて解説

今回はURPのカメラについて解説していきます。 UniversalAdditionalCameraDataコンポーネント URPにはCameraコンポーネントをつけると自動でUniversal Additional CameraDataというコンポーネントが追加されます。 このコンポーネントはURPで拡張された機能…

【Unity】【URP】 Chromatic Aberration (色収差)

Chromatic Aberration (色収差) エフェクト 光の屈折率は色によって異なるため、レンズを通過した際に焦点距離に差が発生し、ずれて見えます。 実装 実装方法としてはRチャンネルとBチャンネルを_Intensityに応じて拡大しています。 Shader "Hidden/Chromati…

【Unity】GPU インスタンシング、Static Batching、Dynamic Batching、SRP Batcherを解説

BatchとDraw CallとSetPass Call Batchは同一マテリアルである等のバッチング条件を満たした結合メッシュ単位の描画処理を指します。 SetPass Callはマテリアルの設定値をCPUがGPUに送る処理です。 Draw CallはCPUがGPUに、描画を命令することです。 CPUから…

【Unity】【URP】Litシェーダーのライティング処理を見る

UPRのLitシェーダーのライティング処理を一通り解説します。 ライティングの流れ ライティングの流れは大まかに以下のようになっています。 最終ライトカラー値 = ①メインライト + ②追加ライト(ピクセル単位) + ③追加ライト(頂点単位) + ④大域照明ライト…

【Unity】【シェーダー】描画するオブジェクトの深度値と深度バッファの取得方法

Shader "Zpos" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex :…

【Unity】Disney Diffuse BRDF

記号 説明 視線方向を表す単位ベクトル 入射光の方向を表す単位ベクトル 法線方向を表す単位ベクトル ハーフベクトル BRDFの拡散反射成分 拡散反射率(ディフューズアルベド) 法線方向から入射する光の反射率 グレージング角から入射する光の反射率 Disney …

【Unity】幾何減衰

マイクロファセット(微細表面) マイクロファセットとは物体の表面には目では見えない凹凸のことです。 物理ベースレンダリング入門 その① - 物理ベースレンダリングとは? - LIGHT11引用 幾何減衰 マイクロファセットにより入射光が遮断される(シャドウイン…

【Unity】マイクロファセット法線分布関数 (NDF)

マイクロファセット(微細表面) マイクロファセットとは物体の表面には目では見えない凹凸のことです。 物理ベースレンダリング入門 その① - 物理ベースレンダリングとは? - LIGHT11引用 ハーフベクトル ハーフベクトルは光源方向と視点方向ベクトルを加算…

リニアワークフロー 概念の説明とUnityにおける実装と設定

視覚のガンマ 下の画像を見てください。 左から右に行くにつれて、白から黒へとグラデーションしており、人間の目で見た輝度はリニア(線形)になっています。 つまり黒の明るさを0、白の明るさを1とすると、中間の明るさは0.5に見えます。 リニアワークフロー…

【Unity】環境マッピング (キューブマッピング)

環境マッピングとは 環境マッピングはオブジェクトに背景が映り込ませる技術です。 環境マップという背景を映した特殊なテクスチャをキューブ上に並べ、オブジェクトの反射ベクトルの先にある環境マップの色を描画します。 【連載】Unity時代の3D入門 – 第7…

【Unity】【シェーダー】 フレネル反射

フレネル反射とは? フレネル反射とは、視線と法線が直角になる部分ほど反射成分が大きくなることで背景がより強く見える現象で、水やプラスチックなどの非金属よく見られます。 フルネルの近似式 フレネルの式 - Wikipediaより引用 フルネルの近似式をシェ…

【Unity】URP(Universal Render Pipeline)の導入方法

URP導入方法について説明します。 URPをインストールする URPの導入方法は2種類あります。 プロジェクトの新規作成時にURPのテンプレートを選択する場合 プロジェクトの新規作成時にテンプレートを選択する場合です。 Unity Hubの新規作成画面でURPのテンプ…

【HDR】【Emissive】トーンマッピングでオブジェクトを発光させる

発光表現を行うには? 下の画像のように光源をシェーダーで実装したいと思った時にフラグメントシェーダーで出力するRGBの値は、一番明るくしても白色(RGB = 1,1,1)なので、強い光を表現をすることができません。 このようなRGBAのそれぞれのチャンネルで0~2…

【Unity】SRP (Scriptable Render Pipeline) 入門②

前回はSRPで画面を塗りつぶしました。 今回は不透明オブジェクトと半透明オブジェクトを描画します。 ny-program.hatenablog.com スクリプト using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEng…

【Unity】SRP (Scriptable Render Pipeline) 入門①

SRPとは? Unityではプログラマが作業をしなくてもレンダリングしてくれますが、既存の描画フローを変更することができません。 細かい部分まで突き詰めようとすると、Unity既存の描画フローを使わずに自作したくなります。 それを可能とするのがSRP(Scripta…

CommandBufferで簡単なポストエフェクトを作る

前回のおさらい 前回はレンダリングターゲットの切り替えについて学びました。 こちらを先に見ておくと理解が捗ります。 ny-program.hatenablog.com CommandBufferとは? CommandBufferとは描画命令の塊を任意のタイミングで行える機能です。 docs.unity3d.c…