├── LICENSE ├── NiloInvLerpRemap.hlsl ├── NiloOutlineUtil.hlsl ├── NiloZOffset.hlsl ├── README.md ├── SimpleURPToonLitOutlineExample.shader ├── SimpleURPToonLitOutlineExample_LightingEquation.hlsl └── SimpleURPToonLitOutlineExample_Shared.hlsl /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 ColinLeung-NiloCat 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NiloInvLerpRemap.hlsl: -------------------------------------------------------------------------------- 1 | // https://github.com/ronja-tutorials/ShaderTutorials/blob/master/Assets/047_InverseInterpolationAndRemap/Interpolation.cginc 2 | // edit float to half for optimization, because we usually use this to process color data(half) 3 | 4 | #ifndef Include_NiloInvLerpRemap 5 | #define Include_NiloInvLerpRemap 6 | 7 | // just like smoothstep(), but linear, not clamped 8 | half invLerp(half from, half to, half value) 9 | { 10 | return (value - from) / (to - from); 11 | } 12 | half invLerpClamp(half from, half to, half value) 13 | { 14 | return saturate(invLerp(from,to,value)); 15 | } 16 | // full control remap, but slower 17 | half remap(half origFrom, half origTo, half targetFrom, half targetTo, half value) 18 | { 19 | half rel = invLerp(origFrom, origTo, value); 20 | return lerp(targetFrom, targetTo, rel); 21 | } 22 | #endif 23 | -------------------------------------------------------------------------------- /NiloOutlineUtil.hlsl: -------------------------------------------------------------------------------- 1 | // For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample 2 | 3 | #ifndef Include_NiloOutlineUtil 4 | #define Include_NiloOutlineUtil 5 | 6 | // If your project has a faster way to get camera fov in shader, you can replace this slow function to your method. 7 | // For example, you write cmd.SetGlobalFloat("_CurrentCameraFOV",cameraFOV) using a new RendererFeature in C#. 8 | // For this tutorial shader, we will keep things simple and use this slower but convenient method to get camera fov 9 | float GetCameraFOV() 10 | { 11 | //https://answers.unity.com/questions/770838/how-can-i-extract-the-fov-information-from-the-pro.html 12 | float t = unity_CameraProjection._m11; 13 | float Rad2Deg = 180 / 3.1415; 14 | float fov = atan(1.0f / t) * 2.0 * Rad2Deg; 15 | return fov; 16 | } 17 | float ApplyOutlineDistanceFadeOut(float inputMulFix) 18 | { 19 | //make outline "fadeout" if character is too small in camera's view 20 | return saturate(inputMulFix); 21 | } 22 | float GetOutlineCameraFovAndDistanceFixMultiplier(float positionVS_Z) 23 | { 24 | float cameraMulFix; 25 | if(unity_OrthoParams.w == 0) 26 | { 27 | //////////////////////////////// 28 | // Perspective camera case 29 | //////////////////////////////// 30 | 31 | // keep outline similar width on screen accoss all camera distance 32 | cameraMulFix = abs(positionVS_Z); 33 | 34 | // can replace to a tonemap function if a smooth stop is needed 35 | cameraMulFix = ApplyOutlineDistanceFadeOut(cameraMulFix); 36 | 37 | // keep outline similar width on screen accoss all camera fov 38 | cameraMulFix *= GetCameraFOV(); 39 | } 40 | else 41 | { 42 | //////////////////////////////// 43 | // Orthographic camera case 44 | //////////////////////////////// 45 | float orthoSize = abs(unity_OrthoParams.y); 46 | orthoSize = ApplyOutlineDistanceFadeOut(orthoSize); 47 | cameraMulFix = orthoSize * 50; // 50 is a magic number to match perspective camera's outline width 48 | } 49 | 50 | return cameraMulFix * 0.00005; // mul a const to make return result = default normal expand amount WS 51 | } 52 | #endif 53 | 54 | -------------------------------------------------------------------------------- /NiloZOffset.hlsl: -------------------------------------------------------------------------------- 1 | // For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample 2 | 3 | #ifndef Include_NiloZOffset 4 | #define Include_NiloZOffset 5 | 6 | // Push an imaginary vertex towards camera in view space (linear, view space unit), 7 | // then only overwrite original positionCS.z using imaginary vertex's result positionCS.z value 8 | // Will only affect ZTest ZWrite's depth value of vertex shader 9 | 10 | // Useful for: 11 | // -Hide ugly outline on face/eye 12 | // -Make eyebrow render on top of hair 13 | // -Solve ZFighting issue without moving geometry 14 | float4 NiloGetNewClipPosWithZOffset(float4 originalPositionCS, float viewSpaceZOffsetAmount) 15 | { 16 | if(unity_OrthoParams.w == 0) 17 | { 18 | //////////////////////////////// 19 | //Perspective camera case 20 | //////////////////////////////// 21 | float2 ProjM_ZRow_ZW = UNITY_MATRIX_P[2].zw; 22 | float modifiedPositionVS_Z = -originalPositionCS.w + -viewSpaceZOffsetAmount; // push imaginary vertex 23 | float modifiedPositionCS_Z = modifiedPositionVS_Z * ProjM_ZRow_ZW[0] + ProjM_ZRow_ZW[1]; 24 | originalPositionCS.z = modifiedPositionCS_Z * originalPositionCS.w / (-modifiedPositionVS_Z); // overwrite positionCS.z 25 | return originalPositionCS; 26 | } 27 | else 28 | { 29 | //////////////////////////////// 30 | //Orthographic camera case 31 | //////////////////////////////// 32 | originalPositionCS.z += -viewSpaceZOffsetAmount / _ProjectionParams.z; // push imaginary vertex and overwrite positionCS.z 33 | return originalPositionCS; 34 | } 35 | } 36 | 37 | #endif 38 | 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About this repository 2 | 3 | This repository does NOT contain the full version of NiloToonURP. 4 | Instead, it includes a simple, short and easy-to-read URP toon shader example for Unity2022.3LTS, which is intended for shader coding tutorial purposes. The shader example is licensed under the MIT license, giving you the freedom to use the code as you wish. If you'd like to retain the current tutorial shader, we recommend forking it or downloading a copy now, as it may be removed in the future. 5 | 6 | *this README also shows photos and information about the NiloToonURP(full version) 7 | 8 | # NiloToonURP(full version)'s rendering 9 | 10 | ![screenshot](https://i.imgur.com/lfu2wZd.jpg) 11 | ![screenshot](https://i.imgur.com/F0nlZYh.jpg) 12 | shader ON 13 | ![screenshot](https://i.imgur.com/fSpM9zM.jpg) 14 | shader OFF 15 | ![screenshot](https://i.imgur.com/91vkMJk.jpg) 16 | shader ON 17 | ![screenshot](https://i.imgur.com/N7J2A28.jpg) 18 | shader OFF 19 | ![screenshot](https://i.imgur.com/9tiHehF.jpg) 20 | shader ON 21 | ![screenshot](https://i.imgur.com/195Mzq7.jpg) 22 | shader OFF 23 | ![screenshot](https://i.imgur.com/zFk6dHl.jpg) 24 | 25 | ![screenshot](https://i.imgur.com/EIq6z9B.jpg) 26 | Outline options(1/2/3) 27 | ![screenshot](https://i.imgur.com/Vkx0oN9.gif) 28 | ![screenshot](https://i.imgur.com/wUrVD7n.jpg) 29 | ![screenshot](https://i.imgur.com/aP3YmYV.jpg) 30 | ![screenshot](https://i.imgur.com/FxIv1Yl.jpg) 31 | ![screenshot](https://i.imgur.com/XW5aNL4.jpg) 32 | shader ON 33 | ![screenshot](https://i.imgur.com/VlA6hU6.jpg) 34 | shader OFF 35 | ![screenshot](https://i.imgur.com/o1xm92a.jpg) 36 | ![screenshot](https://i.imgur.com/6dtu43p.jpg) 37 | ![screenshot](https://i.imgur.com/UyXuss9.jpg) 38 | ![screenshot](https://i.imgur.com/UbtyddV.jpg) 39 | ![screenshot](https://i.imgur.com/jUrwwLb.jpg) 40 | ![screenshot](https://i.imgur.com/ZSBwaHo.jpg) 41 | ![screenshot](https://i.imgur.com/WccM1g8.jpg) 42 | ![screenshot](https://i.imgur.com/i4O6m4z.jpg) 43 | 44 | We are now developing an 'easy-to-use, high-performance, and cross-platform (including mobile, VR, and WebGL)' closed-source toon shader package—NiloToonURP—to assist Unity URP users in achieving high-quality anime/toon-like rendering. 45 | 46 | NiloToonURP is supporting: 47 | - Unity 2021.3LTS(URP 12.x) 48 | - Unity 2022.3LTS(URP 14.x) 49 | - Unity 2023.2 (URP 16.x) 50 | - Unity6 (URP 17.x) 51 | 52 | # Download NiloToonURP PC .exe demo (2021.3.17LTS build): 53 | - https://drive.google.com/file/d/1MubGDhlDRKKxR9xyl7fcLyECyBJdsqrI/view?usp=sharing 54 | 55 | # Download NiloToonURP Android .apk demo (2021.3.17LTS build): 56 | - https://drive.google.com/file/d/1CBSYiniHTAaNtlkd5X7TUxjAsQ7eBNxK/view?usp=sharing 57 | 58 | # NiloToonURP's demo runtime video: 59 | - https://www.youtube.com/c/colinleungNiloCat/videos 60 | - https://space.bilibili.com/325873 61 | 62 | # NiloToonURP's UI preview: 63 | - https://drive.google.com/drive/folders/1SlOhvqCZrDBRkSgzwW0ZIzAkDqonpa26?usp=sharing 64 | 65 | # How to get NiloToonURP full source code? 66 | If you or your company/organization/team needs: 67 | - latest full source code (with all detail comments and notes, NOT Obfuscated code, NOT .dll) 68 | - latest user document 69 | - perpetual royalty-free commercial license 70 | - every future update 71 | - NiloToon's tech support 72 | - (optional) we set up your character models's rendering in the best way possible for you, using NiloToonURP 73 | - (optional) your project-specific customization and support 74 | 75 | of NiloToonURP for your URP project, please send the following info to nilotoon@gmail.com 76 | - name (your personal name or your company/organization/team's name) 77 | - a google account email for gaining permission to download all NiloToonURP files in google drive 78 | - any public website that shows your/your company/organization/team's work or public media (e.g. personal website/company website/youtube/bilibili/twitter...) 79 | 80 | # NiloToonURP user's creations (public media, not NDA content) 81 | *we only provided NiloToonURP's download permission + tech support, we didn't work on these creations directly 82 | 83 | ### Genshin Impact MV - When The Stars Align (Genshin Impact website -> http://genshin.hoyoverse.com) 84 | ![screenshot](https://i.imgur.com/RermmVG.jpg) 85 | ![screenshot](https://i.imgur.com/VD7K3zX.jpg) 86 | ![screenshot](https://i.imgur.com/sQeT2h9.jpg) 87 | ![screenshot](https://i.imgur.com/xIY8OjB.jpg) 88 | ![screenshot](https://i.imgur.com/Cw9ZkkA.jpg) 89 | ![screenshot](https://i.imgur.com/dSsZo49.jpg) 90 | ![screenshot](https://i.imgur.com/pKciABD.jpg) 91 | ![screenshot](https://i.imgur.com/pUGytbt.jpg) 92 | ![screenshot](https://i.imgur.com/WXCPzCj.jpg) 93 | ![screenshot](https://i.imgur.com/xCbVHYf.jpg) 94 | ![screenshot](https://i.imgur.com/AxOlQ1V.jpg) 95 | ![screenshot](https://i.imgur.com/N9DfuWO.jpg) 96 | ![screenshot](https://i.imgur.com/ozunRqI.jpg) 97 | ![screenshot](https://i.imgur.com/bEjNiOj.jpg) 98 | - 【原神生日会】When The Stars Align -> https://www.bilibili.com/video/BV1vT411T79n 99 | 100 | ### キラッとプリ⭐︎チャン (https://twitter.com/pretty_vlive) 101 | ![screenshot](https://i.imgur.com/Ul1u4hz.jpg) 102 | ![screenshot](https://i.imgur.com/hJPCGmE.jpg) 103 | ![screenshot](https://i.imgur.com/qwcCPN0.jpg) 104 | ![screenshot](https://i.imgur.com/JbZRJXG.jpg) 105 | ![screenshot](https://i.imgur.com/TwBlQe0.jpg) 106 | ![screenshot](https://i.imgur.com/FnpWMuV.jpg) 107 | ![screenshot](https://i.imgur.com/frhGcNt.jpg) 108 | ![screenshot](https://i.imgur.com/8suihAg.jpg) 109 | ![screenshot](https://i.imgur.com/RCo6T3s.jpg) 110 | ![screenshot](https://i.imgur.com/apSrmFa.jpg) 111 | ![screenshot](https://i.imgur.com/SdgQvOA.jpg) 112 | ![screenshot](https://i.imgur.com/pTyaOOW.jpg) 113 | ![screenshot](https://i.imgur.com/gSJLGDF.jpg) 114 | ![screenshot](https://i.imgur.com/AtJqovW.jpg) 115 | - バーチャルミュージカル「ハイスクール!キラッとプリ☆チャン ~キラキラ☆未来の運命~」 -> https://www.zan-live.com/ja/live/detail/10395 116 | 117 | ### VSPO!(ぶいすぽっ!) - 空澄セナ -Asumi Sena- (https://www.youtube.com/@asumi_sena) 118 | ![screenshot](https://i.imgur.com/QQco4TK.jpg) 119 | ![screenshot](https://i.imgur.com/fWkpEF8.jpg) 120 | ![screenshot](https://i.imgur.com/wBlNuYi.jpg) 121 | ![screenshot](https://i.imgur.com/B2gnt6M.jpg) 122 | ![screenshot](https://i.imgur.com/cIGqIeB.jpg) 123 | ![screenshot](https://i.imgur.com/4fdkINy.jpg) 124 | ![screenshot](https://i.imgur.com/tLFP24Z.jpg) 125 | ![screenshot](https://i.imgur.com/lQ7fd0U.jpg) 126 | ![screenshot](https://i.imgur.com/hmTzJbs.jpg) 127 | ![screenshot](https://i.imgur.com/KcIz27F.jpg) 128 | - [【#空澄セナ4周年記念LIVE】~私がここにいる理由~ 【空澄セナ/ぶいすぽっ!】](https://www.youtube.com/live/rFmmP-8AfHs?si=_iu6meNxc53i4WYF&t=1003) 129 | - [- デビルじゃないもん w/星川サラ](https://www.youtube.com/live/rFmmP-8AfHs?si=6lFF51APLpsNbgI-&t=1323) 130 | 131 | ### Suisei Channel - hololive (https://www.youtube.com/@HoshimachiSuisei) 132 | ![screenshot](https://i.imgur.com/XX23J0Q.jpg) 133 | ![screenshot](https://i.imgur.com/MMbNWCA.jpg) 134 | ![screenshot](https://i.imgur.com/x4PLSHc.jpg) 135 | ![screenshot](https://i.imgur.com/G7L6O6u.jpg) 136 | ![screenshot](https://i.imgur.com/kdG28ik.jpg) 137 | ![screenshot](https://i.imgur.com/CTOI2aK.jpg) 138 | ![screenshot](https://i.imgur.com/b5Ku6pB.jpg) 139 | ![screenshot](https://i.imgur.com/jh3AMVa.jpg) 140 | ![screenshot](https://i.imgur.com/jWLC9wA.jpg) 141 | ![screenshot](https://i.imgur.com/STP9tAD.jpg) 142 | ![screenshot](https://i.imgur.com/4BCD4O0.jpg) 143 | ![screenshot](https://i.imgur.com/QeJhkWk.jpg) 144 | ![screenshot](https://i.imgur.com/Pvb7u7X.jpg) 145 | ![screenshot](https://i.imgur.com/WWmhvl8.jpg) 146 | ![screenshot](https://i.imgur.com/4xlD9UM.jpg) 147 | - [シュガーラッシュ / miComet(official)](https://youtu.be/gtgME6MJpk4?si=cIsl6r1l8eSqd4Fl) 148 | 149 | ### WAKTAVERSE - 이세계아이돌/IsegyeIdol (https://www.youtube.com/@waktaverse) 150 | ![screenshot](https://i.imgur.com/8DDcN1B.jpg) 151 | ![screenshot](https://i.imgur.com/PaZN6M8.jpg) 152 | ![screenshot](https://i.imgur.com/gsSU1sF.jpg) 153 | ![screenshot](https://i.imgur.com/0TjHy21.jpg) 154 | ![screenshot](https://i.imgur.com/ZgDVDyL.jpg) 155 | ![screenshot](https://i.imgur.com/Eqkxs0k.jpg) 156 | ![screenshot](https://i.imgur.com/AAmAoT0.jpg) 157 | ![screenshot](https://i.imgur.com/VnymUeL.jpg) 158 | ![screenshot](https://i.imgur.com/b3TrbrP.jpg) 159 | ![screenshot](https://i.imgur.com/yWQr1rR.jpg) 160 | - [Snow halation - 이세계아이돌 COVER│러브 라이브! OST](https://youtu.be/uw-ZnT-iAEI?si=nWDLRTpAP4bfmgnO) 161 | 162 | ### VSPO!(ぶいすぽっ!) - 胡桃のあ (https://www.youtube.com/@963Noah) 163 | ![screenshot](https://i.imgur.com/bRNlOWG.jpg) 164 | ![screenshot](https://i.imgur.com/Ffuybg8.jpg) 165 | ![screenshot](https://i.imgur.com/xewWdKO.jpg) 166 | ![screenshot](https://i.imgur.com/TdYcCSz.jpg) 167 | ![screenshot](https://i.imgur.com/7itrZ89.jpg) 168 | ![screenshot](https://i.imgur.com/Ro1uw6s.jpg) 169 | ![screenshot](https://i.imgur.com/B1zzDqV.jpg) 170 | ![screenshot](https://i.imgur.com/lTYv5uO.jpg) 171 | ![screenshot](https://i.imgur.com/ThgxjXs.jpg) 172 | - #胡桃のあ3Dライブ│ 星降る夜に願いを込めて 🌠 -> https://www.youtube.com/live/otBLdDjhmp4?si=4YsH2jpEedQ7UaHK&t=1875 173 | 174 | ### VVV MUSIC LIVE 公式(ブイスリー) (https://twitter.com/VVVMusicLive) 175 | ![screenshot](https://i.imgur.com/9Xi2ae3.jpg) 176 | ![screenshot](https://i.imgur.com/7ioCq51.jpg) 177 | ![screenshot](https://i.imgur.com/7YcVoPO.jpg) 178 | ![screenshot](https://i.imgur.com/SWOr8Gh.jpg) 179 | ![screenshot](https://i.imgur.com/s8YWX0N.jpg) 180 | ![screenshot](https://i.imgur.com/4wkNyIJ.jpg) 181 | ![screenshot](https://i.imgur.com/VDFnNm2.jpg) 182 | ![screenshot](https://i.imgur.com/rnJo98j.jpg) 183 | ![screenshot](https://i.imgur.com/kI65eW8.jpg) 184 | - [VVV MUSIC LIVE 2023 RE:TUNE【第1部】](https://live.nicovideo.jp/watch/lv344122922) 185 | - [VVV MUSIC LIVE 2023 RE:TUNE - X Preview 1](https://twitter.com/VVVMusicLive/status/1772926536095850622) 186 | - [VVV MUSIC LIVE 2023 RE:TUNE - X Preview 2](https://twitter.com/VVVMusicLive/status/1773288934870839380) 187 | - [VVV MUSIC LIVE 2023 RE:TUNE - X Preview 3](https://twitter.com/VVVMusicLive/status/1773651312409813377) 188 | - [VVV MUSIC LIVE 2023 RE:TUNE - X Preview 4](https://twitter.com/VVVMusicLive/status/1774013705090371721) 189 | 190 | ### 泠鸢yousa (https://space.bilibili.com/282994) 191 | ![screenshot](https://i.imgur.com/Y5ZqAQR.jpg) 192 | ![screenshot](https://i.imgur.com/Jx2hWbF.jpg) 193 | ![screenshot](https://i.imgur.com/lWlwyQj.jpg) 194 | ![screenshot](https://i.imgur.com/42ZWOk4.jpg) 195 | ![screenshot](https://i.imgur.com/SBuq9fg.jpg) 196 | ![screenshot](https://i.imgur.com/JxshOYt.jpg) 197 | ![screenshot](https://i.imgur.com/N87LdKE.jpg) 198 | ![screenshot](https://i.imgur.com/eKaaJS2.jpg) 199 | ![screenshot](https://i.imgur.com/7Cab1UP.jpg) 200 | - 《我的故事未写完》【原创曲-泠鸢词曲】 -> https://www.bilibili.com/video/BV1JG4y1W7ub 201 | 202 | ### hololive ホロライブ - VTuber Group (https://www.youtube.com/@hololive) 203 | ![screenshot](https://i.imgur.com/Qrexl3d.jpg) 204 | ![screenshot](https://i.imgur.com/BnvXUik.jpg) 205 | ![screenshot](https://i.imgur.com/JGOzDqK.jpg) 206 | ![screenshot](https://i.imgur.com/OOqILCu.jpg) 207 | ![screenshot](https://i.imgur.com/ngu3bM3.jpg) 208 | ![screenshot](https://i.imgur.com/txbqSyH.jpg) 209 | ![screenshot](https://i.imgur.com/Io4Mjcf.jpg) 210 | ![screenshot](https://i.imgur.com/oMlV5Kk.jpg) 211 | ![screenshot](https://i.imgur.com/qyxZXew.jpg) 212 | ![screenshot](https://i.imgur.com/eFNnSlt.jpg) 213 | ![screenshot](https://i.imgur.com/riHY7nk.jpg) 214 | - 『ホロライブ・サマー2023 3DLIVE Splash Party!』ティザーPV【#hololivesummer2023】 -> https://youtu.be/8aKFN2YbGLQ 215 | 216 | ### 杏仁ミル Annin Miru Channel (https://www.youtube.com/@AnninMiru) 217 | ![screenshot](https://i.imgur.com/ynQZIdr.jpg) 218 | ![screenshot](https://i.imgur.com/rmpF7lb.jpg) 219 | ![screenshot](https://i.imgur.com/f2SJHtG.jpg) 220 | ![screenshot](https://i.imgur.com/6Prfcc3.jpg) 221 | ![screenshot](https://i.imgur.com/ep6Cxym.jpg) 222 | ![screenshot](https://i.imgur.com/QI9xM6x.jpg) 223 | ![screenshot](https://i.imgur.com/RRPgbSQ.jpg) 224 | ![screenshot](https://i.imgur.com/oAgTkxU.jpg) 225 | ![screenshot](https://i.imgur.com/qkJO7Cr.jpg) 226 | ![screenshot](https://i.imgur.com/4gkLntJ.jpg) 227 | ![screenshot](https://i.imgur.com/QzvwSx3.jpg) 228 | - [【3D LIVE映像】Rabbit - Cover by 杏仁ミルxRumi懶貓子【#杏仁ミル 5周年LIVE影像】](https://www.youtube.com/watch?v=iCo2gQCupvs&list=PLHHwxaEhb01NztWik7JRj7CCKH8wQ6eI-&index=6) 229 | - [【3D LIVE映像】ライオン - Cover by 杏仁ミル x カグラナナ【#杏仁ミル 5周年LIVE影像】](https://www.youtube.com/watch?v=u4kN1qDqRx0&list=PLHHwxaEhb01NztWik7JRj7CCKH8wQ6eI-&index=13) 230 | - [【3D LIVE映像】チョコレートディスコ - Cover by 杏仁ミル x 久遠たま x 花丸はれる【#杏仁ミル 5周年LIVE影像】](https://youtu.be/qeTaEnlpRJI?si=QcZh7glczm_99Gaa) 231 | - [【3D LIVE映像】ハートビート・フロムユー - Cover by 杏仁ミル【#杏仁ミル 5周年LIVE影像】](https://www.youtube.com/watch?v=4cnekD1wk30&list=PLHHwxaEhb01NztWik7JRj7CCKH8wQ6eI-&index=10) 232 | - [【3D LIVE映像】おねだり大作戦 - Cover by 杏仁ミル【#杏仁ミル 5周年LIVE影像】](https://www.youtube.com/watch?v=0xC972nEMYM&list=PLHHwxaEhb01NztWik7JRj7CCKH8wQ6eI-&index=12) 233 | - [【3D LIVE映像】僕らのレットイットビー - Cover by 杏仁ミル【#杏仁ミル 5周年LIVE影像】](https://youtu.be/LagMYTFRq1Y?si=2OC3dtxNGjq5adcj) 234 | - [【3D LIVE映像】おじゃま虫 - Cover by 杏仁ミル【#杏仁ミル 5周年LIVE影像】](https://youtu.be/NC_Yr18wLq4?si=QanNLNz157gIT2WA) 235 | - [【3D LIVE映像】ドレミファロンド - Cover by 杏仁ミル【#杏仁ミル 5周年LIVE影像】](https://youtu.be/6FxpGLUvw8M?si=7N-pU8-E5dBcSFmV) 236 | - [【#杏仁ミル5周年LIVE】Back To A Beginner's Spirit | 回歸初心3D演唱會【#杏仁ミル】(Youtube)](https://youtu.be/lx7kct7BNes?si=ZY9BnyK6_D0i-vTv&t=3272) 237 | - [【#杏仁ミル5周年LIVE】Back To A Beginner's Spirit | 回歸初心3D演唱會【#杏仁ミル】(Twitch)](https://www.twitch.tv/videos/2014344400?t=00h54m30s) 238 | 239 | ### ISEGYE IDOL (이세계아이돌) - 주르르 JURURU (https://www.youtube.com/@JU_RURU) 240 | ![screenshot](https://i.imgur.com/acdR9Lj.jpg) 241 | ![screenshot](https://i.imgur.com/DUq6AlZ.jpg) 242 | ![screenshot](https://i.imgur.com/ZOT96go.jpg) 243 | ![screenshot](https://i.imgur.com/SSKKyLY.jpg) 244 | ![screenshot](https://i.imgur.com/l0W9J72.jpg) 245 | ![screenshot](https://i.imgur.com/nC3nGFo.jpg) 246 | ![screenshot](https://i.imgur.com/v7NusDY.jpg) 247 | ![screenshot](https://i.imgur.com/Ytln6oQ.jpg) 248 | ![screenshot](https://i.imgur.com/XAL2vEg.jpg) 249 | ![screenshot](https://i.imgur.com/K9OlGaK.jpg) 250 | ![screenshot](https://i.imgur.com/yGgFYYB.jpg) 251 | ![screenshot](https://i.imgur.com/R9Sq8bw.jpg) 252 | - [GIRL'S DAY - Darling|Cover by Jururu](https://youtu.be/7sFIjj5BW3M?si=xySDbq-FxfX-KPWJ) 253 | 254 | ### ぶいごまチャンネル V後藤真希 (https://www.youtube.com/@V_GOTO_MAKI) 255 | ![screenshot](https://i.imgur.com/gFAPtTS.jpg) 256 | ![screenshot](https://i.imgur.com/hI9cd0g.jpg) 257 | ![screenshot](https://i.imgur.com/9gcADgz.jpg) 258 | ![screenshot](https://i.imgur.com/EWcR7xg.jpg) 259 | ![screenshot](https://i.imgur.com/RBnZmGK.jpg) 260 | ![screenshot](https://i.imgur.com/okgCZ5b.jpg) 261 | ![screenshot](https://i.imgur.com/6yXHYed.jpg) 262 | ![screenshot](https://i.imgur.com/gZpw73O.jpg) 263 | ![screenshot](https://i.imgur.com/c4II8j3.jpg) 264 | ![screenshot](https://i.imgur.com/N426j2R.jpg) 265 | ![screenshot](https://i.imgur.com/r44ixaR.jpg) 266 | - モーニング娘。『LOVEマシーン』 / V後藤真希が歌って踊ってみた -> https://youtu.be/zyuLj0fbn9w?si=ovX0OF4bOx-wscD2 267 | 268 | ### VSPO!(ぶいすぽっ!) - 小森めと (https://www.youtube.com/@Met_Komori) 269 | ![screenshot](https://i.imgur.com/G8slEDj.jpg) 270 | ![screenshot](https://i.imgur.com/UzofUqj.jpg) 271 | ![screenshot](https://i.imgur.com/APcD4Cy.jpg) 272 | ![screenshot](https://i.imgur.com/Z6sGj3c.jpg) 273 | ![screenshot](https://i.imgur.com/Cx0qTOb.jpg) 274 | ![screenshot](https://i.imgur.com/ILqORSQ.jpg) 275 | ![screenshot](https://i.imgur.com/s9dyTJP.jpg) 276 | ![screenshot](https://i.imgur.com/ppVwAsN.jpg) 277 | ![screenshot](https://i.imgur.com/BHzmmYt.jpg) 278 | - 【 #小森めと爆誕2023 】小森めと爆誕3Dライブ!~食え!寝ろ!遊べ!~ 【 ぶいすぽっ! / 小森めと 】 -> https://www.youtube.com/live/buF_TtzS9SA?si=vU6pt_XNCuwr5CB6&t=179 279 | 280 | ### Veibae (https://www.youtube.com/@Veibae) 281 | ![screenshot](https://i.imgur.com/EfJUnkz.jpg) 282 | ![screenshot](https://i.imgur.com/wXHOoIa.jpg) 283 | ![screenshot](https://i.imgur.com/dDdoZnB.jpg) 284 | ![screenshot](https://i.imgur.com/BoK7p87.jpg) 285 | ![screenshot](https://i.imgur.com/H5oVtXj.jpg) 286 | ![screenshot](https://i.imgur.com/sQTNs6S.jpg) 287 | ![screenshot](https://i.imgur.com/xidweRe.jpg) 288 | ![screenshot](https://i.imgur.com/voydXQ4.jpg) 289 | ![screenshot](https://i.imgur.com/Q6pwhNT.jpg) 290 | ![screenshot](https://i.imgur.com/h26aQOn.jpg) 291 | - [[17.02.2024] Vei - 3D Comeback Stream (new 3D model debut)](https://youtu.be/mTeJOx-487s?si=Mbb5leehGoQXSF3-&t=1805) 292 | - [whatcha lookin at](https://twitter.com/Veibae/status/1758207305479336311) 293 | - [omw back to streamin as 3d 😳](https://twitter.com/Veibae/status/1751654864726507959) 294 | - [butt \ʕ •ᴥ•ʔ/](https://twitter.com/Veibae/status/1760078411937034745) 295 | - [bumpin heads](https://twitter.com/Veibae/status/1758589960590852408) 296 | - [Veibae vs Buckshot Roulette](https://youtu.be/d67CvouX68M?si=-sDEIyC7GCa2hmuT) 297 | - [raaaaaaaaaaarrrr](https://twitter.com/Veibae/status/1772694929422119048) 298 | 299 | ### Starseed:Asnia Trigger / 스타시드: 아스니아 트리거 ([starseed.com2us.com](https://starseed.com2us.com/)) 300 | ![screenshot](https://i.imgur.com/W6zA3ZV.jpg) 301 | ![screenshot](https://i.imgur.com/KtQAiRJ.jpg) 302 | ![screenshot](https://i.imgur.com/PQbcTYi.jpg) 303 | ![screenshot](https://i.imgur.com/6ljWdZ4.jpg) 304 | ![screenshot](https://i.imgur.com/IYKvGE0.jpg) 305 | ![screenshot](https://i.imgur.com/xUWxSWv.jpg) 306 | ![screenshot](https://i.imgur.com/HzI4y9D.jpg) 307 | ![screenshot](https://i.imgur.com/Kf3wvxB.jpg) 308 | ![screenshot](https://i.imgur.com/HsxHq0S.jpg) 309 | ![screenshot](https://i.imgur.com/b0naICA.jpg) 310 | - [Starseed:Asnia Trigger - X](https://twitter.com/STARSEED_KR) 311 | - [Mobile GamePlay](https://youtu.be/4foNIb2-i1E?si=sujfks8YxXpn-Zk6) 312 | 313 | ### Neo-Porte(ネオポルテ)- 天帝フォルテ / Tentei Forte (https://www.youtube.com/@tenteiforte4631) 314 | ![screenshot](https://i.imgur.com/AJRw1g8.jpg) 315 | ![screenshot](https://i.imgur.com/MFMZThA.jpg) 316 | ![screenshot](https://i.imgur.com/q4loeqX.jpg) 317 | ![screenshot](https://i.imgur.com/4sBONjf.jpg) 318 | ![screenshot](https://i.imgur.com/HhyFlkI.jpg) 319 | ![screenshot](https://i.imgur.com/6AoJNqt.jpg) 320 | ![screenshot](https://i.imgur.com/Kqh1Uem.jpg) 321 | ![screenshot](https://i.imgur.com/3KiFI7U.jpg) 322 | ![screenshot](https://i.imgur.com/ivZ4zVr.jpg) 323 | ![screenshot](https://i.imgur.com/iFcIs0y.jpg) 324 | - [【#天帝フォルテ3D】動くのか…!?動けるのか…!?3Dお披露目!【天帝フォルテ / ネオポルテ】](https://www.youtube.com/live/yuV3gcmt5lg?si=wDN36D7yszt4kEB_&t=197) 325 | - [- 晩餐歌](https://www.youtube.com/live/yuV3gcmt5lg?si=EXO8wc28qo4FuG3s&t=1538) 326 | 327 | ### VirtuaReal / Nijisanji CN - 七海Nana7mi (https://space.bilibili.com/434334701) 328 | ![screenshot](https://i.imgur.com/Tp29cyb.jpg) 329 | ![screenshot](https://i.imgur.com/9OsMvwh.jpg) 330 | ![screenshot](https://i.imgur.com/HTBHcYg.jpg) 331 | ![screenshot](https://i.imgur.com/PvSWEwl.jpg) 332 | - 【恋愛偏差値上昇中!】 -> https://www.bilibili.com/video/BV1v84y1K74A 333 | - 【情人节当一天恋爱脑也可以吧!】 -> https://www.bilibili.com/video/BV1wv4y1x7NZ 334 | - 【这次是全身版!!】 -> https://www.bilibili.com/video/BV1QM411b7pe 335 | - 【因为我是最棒滴!【僕が最高だから/ハコニワリリィ】】 -> https://www.bilibili.com/video/BV1rs4y1S7uB 336 | 337 | ### Neo-Porte(ネオポルテ)- 夜絆ニウ / yozuna niu (https://www.youtube.com/@niu_yozuna) 338 | ![screenshot](https://i.imgur.com/MKQQBHs.jpg) 339 | ![screenshot](https://i.imgur.com/lO8wU94.jpg) 340 | ![screenshot](https://i.imgur.com/zq0XXe7.jpg) 341 | ![screenshot](https://i.imgur.com/5nuatCB.jpg) 342 | ![screenshot](https://i.imgur.com/wXG7rQt.jpg) 343 | ![screenshot](https://i.imgur.com/2peors3.jpg) 344 | ![screenshot](https://i.imgur.com/o9RNSlt.jpg) 345 | - [【 #夜絆ニウ3D 】しっぽが見れるぞ!3Dお披露目IKZ!【夜絆ニウ / NeoPorte (ネオポルテ) 】](https://www.youtube.com/live/lZ3Rlvh6e1Q?t=832s) 346 | 347 | ### ISEGYE IDOL (이세계아이돌) - 주르르 JURURU (https://www.youtube.com/@JU_RURU) 348 | ![screenshot](https://i.imgur.com/Qukmpkh.jpg) 349 | ![screenshot](https://i.imgur.com/evk4e6N.jpg) 350 | ![screenshot](https://i.imgur.com/T14Vs0G.jpg) 351 | ![screenshot](https://i.imgur.com/o0RlbiU.jpg) 352 | ![screenshot](https://i.imgur.com/udZYkVo.jpg) 353 | ![screenshot](https://i.imgur.com/z9M8a3i.jpg) 354 | ![screenshot](https://i.imgur.com/TaFH5RU.jpg) 355 | ![screenshot](https://i.imgur.com/eEQAj8Z.jpg) 356 | ![screenshot](https://i.imgur.com/u4h1HwE.jpg) 357 | ![screenshot](https://i.imgur.com/JULVBCH.jpg) 358 | - [TWICE(트와이스) - "What is Love?"|Cover by 주르르](https://youtu.be/T-LRqnvEi9E?si=_9itufJ4CZrANSfL) 359 | 360 | ### すいみゃ / suimya (https://www.youtube.com/@suimya) 361 | ![screenshot](https://i.imgur.com/mz0z2P9.jpg) 362 | ![screenshot](https://i.imgur.com/Gsrt9DR.jpg) 363 | ![screenshot](https://i.imgur.com/sFGOiQW.jpg) 364 | ![screenshot](https://i.imgur.com/A9Y8qON.jpg) 365 | ![screenshot](https://i.imgur.com/SpUftHm.jpg) 366 | ![screenshot](https://i.imgur.com/mUHsn2U.jpg) 367 | ![screenshot](https://i.imgur.com/yN0SCYY.jpg) 368 | ![screenshot](https://i.imgur.com/YvvhOE8.jpg) 369 | ![screenshot](https://i.imgur.com/UrOn2qi.jpg) 370 | ![screenshot](https://i.imgur.com/K79aRqM.jpg) 371 | - [【3DMV】SOS /covered by すいみゃ【シャニマス】](https://youtu.be/kQBl0hmQZLk?si=OwoV_edmbq3hfzx0) 372 | 373 | ### StelLive - 아라하시 타비 ARAHASHI TABI (https://www.youtube.com/@arahashitabi) 374 | ![screenshot](https://i.imgur.com/QucI6Zn.jpg) 375 | ![screenshot](https://i.imgur.com/fsAqe1X.jpg) 376 | ![screenshot](https://i.imgur.com/WGZQyv9.jpg) 377 | ![screenshot](https://i.imgur.com/2D5ULfA.jpg) 378 | ![screenshot](https://i.imgur.com/OCFs9VP.jpg) 379 | ![screenshot](https://i.imgur.com/hIigeTi.jpg) 380 | ![screenshot](https://i.imgur.com/ZcgVXOc.jpg) 381 | ![screenshot](https://i.imgur.com/fN7KMQJ.jpg) 382 | ![screenshot](https://i.imgur.com/EhcvVJi.jpg) 383 | - [[4K] 스텔라이브 아라하시 타비! 3D 데뷔!](https://youtu.be/E_G9otMLf64?si=DrPfrCgRHJOlEQkr&t=3079) 384 | 385 | ### Stargazer Official @ 스타게이저 @ スターゲイザー (https://twitter.com/StargazerCoLtd) 386 | ![screenshot](https://i.imgur.com/n01LCwX.jpg) 387 | - [24ちゃん(イーサーちゃん)⚓🦷24Chan in 3D](https://twitter.com/StargazerCoLtd/status/1771108689916637350) 388 | 389 | ### VSPO!(ぶいすぽっ!) - 花芽すみれ (https://www.youtube.com/@KagaSumire) 390 | ![screenshot](https://i.imgur.com/zk7AsTW.jpg) 391 | ![screenshot](https://i.imgur.com/Asq0arH.jpg) 392 | ![screenshot](https://i.imgur.com/GeX49uo.jpg) 393 | ![screenshot](https://i.imgur.com/kLlSAgm.jpg) 394 | ![screenshot](https://i.imgur.com/kCPEPt0.jpg) 395 | ![screenshot](https://i.imgur.com/bSb3PY6.jpg) 396 | ![screenshot](https://i.imgur.com/pLPpfKY.jpg) 397 | ![screenshot](https://i.imgur.com/LV0zGNF.jpg) 398 | ![screenshot](https://i.imgur.com/h9PCXAh.jpg) 399 | - #花芽すみれ3D うおおおおお!!【 ぶいすぽ / 花芽すみれ 】 -> https://www.youtube.com/live/g-bN6gisi3g?si=_5opnk-tvTbVU3x5&t=1321 400 | 401 | ### VirtuaReal Star - hanser (https://space.bilibili.com/11073) 402 | ![screenshot](https://i.imgur.com/nfVckVo.jpg) 403 | ![screenshot](https://i.imgur.com/Ij7zvhz.jpg) 404 | ![screenshot](https://i.imgur.com/ooybJus.jpg) 405 | ![screenshot](https://i.imgur.com/LtziYj5.jpg) 406 | - 感谢300关注 跳个舞 -> https://www.bilibili.com/video/BV1CR4y1j7bY/ 407 | 408 | ### Gawr Gura Ch. hololive-EN (https://www.youtube.com/@GawrGura): 409 | ![screenshot](https://i.imgur.com/cp5VTI1.jpg) 410 | ![screenshot](https://i.imgur.com/9CloXLw.jpg) 411 | ![screenshot](https://i.imgur.com/eVTmJT7.jpg) 412 | ![screenshot](https://i.imgur.com/bc46ZRF.jpg) 413 | ![screenshot](https://i.imgur.com/Ls2lt02.jpg) 414 | ![screenshot](https://i.imgur.com/wfzBTfb.jpg) 415 | ![screenshot](https://i.imgur.com/CLNxKnu.jpg) 416 | ![screenshot](https://i.imgur.com/DcfrNdL.jpg) 417 | ![screenshot](https://i.imgur.com/2ZggtS7.jpg) 418 | - 【3D BIRTHDAY】PARTY TIME! 🌊 #gawrgura -> https://youtu.be/lsFr7NzVVM8?t=2042 419 | 420 | ### Neo-Porte(ネオポルテ)- [緋月ゆい / Hizuki Yui](https://www.youtube.com/@Hizuki_Yui_) 421 | ![screenshot](https://i.imgur.com/wJJ2VWV.jpg) 422 | ![screenshot](https://i.imgur.com/kp7z2il.jpg) 423 | ![screenshot](https://i.imgur.com/qODzhx3.jpg) 424 | ![screenshot](https://i.imgur.com/Cszcz0D.jpg) 425 | ![screenshot](https://i.imgur.com/fXfZ54k.jpg) 426 | ![screenshot](https://i.imgur.com/fz50ZMS.jpg) 427 | ![screenshot](https://i.imgur.com/JGjAIls.jpg) 428 | - [【#緋月ゆい3D】遂に"3D"になる…!?✨️【緋月ゆい/ネオポルテ】](https://www.youtube.com/live/jLvXmNRJFbI?si=Z3EcG1zwFJoSTxzr&t=1768) 429 | 430 | ### VSPO!(ぶいすぽっ!【公式】) (https://www.youtube.com/@Vspo77) 431 | ![screenshot](https://i.imgur.com/4LV7Sv3.jpg) 432 | ![screenshot](https://i.imgur.com/NfBeCOG.jpg) 433 | ![screenshot](https://i.imgur.com/PBRMIDn.jpg) 434 | ![screenshot](https://i.imgur.com/cWntQRN.jpg) 435 | ![screenshot](https://i.imgur.com/RUUPu2E.jpg) 436 | ![screenshot](https://i.imgur.com/BqvLFq4.jpg) 437 | ![screenshot](https://i.imgur.com/8wJCcs3.jpg) 438 | ![screenshot](https://i.imgur.com/m1X2Odj.jpg) 439 | ![screenshot](https://i.imgur.com/y1BvqRe.jpg) 440 | ![screenshot](https://i.imgur.com/CET2UlW.jpg) 441 | ![screenshot](https://i.imgur.com/IAEDyfl.jpg) 442 | - [【3D企画】ぶいすぽ公式音楽番組「ぶいすPOP!」【#ぶいすぽ3D】](https://www.youtube.com/live/9GaGcoDiULw?si=MTzHPHCocQWuNiEu&t=559) 443 | 444 | ### Takanashi Kiara Ch. hololive-EN (https://www.youtube.com/@TakanashiKiara) 445 | ![screenshot](https://i.imgur.com/QT0acUh.jpg) 446 | ![screenshot](https://i.imgur.com/TW8QBwh.jpg) 447 | ![screenshot](https://i.imgur.com/eA1YPzW.jpg) 448 | ![screenshot](https://i.imgur.com/pS7qRwM.jpg) 449 | ![screenshot](https://i.imgur.com/8hh4MU0.jpg) 450 | ![screenshot](https://i.imgur.com/AzE873T.jpg) 451 | ![screenshot](https://i.imgur.com/burEUOf.jpg) 452 | - DO U - Takanashi Kiara (Official Music Video) -> https://youtu.be/QI96hnhcr2E 453 | 454 | ### 浠Mizuki Channel (https://www.youtube.com/@MizukiVsinger) 455 | ![screenshot](https://i.imgur.com/MLD53cv.jpg) 456 | ![screenshot](https://i.imgur.com/hPGrptq.jpg) 457 | ![screenshot](https://i.imgur.com/N1nzvz8.jpg) 458 | ![screenshot](https://i.imgur.com/Irlz7pv.jpg) 459 | ![screenshot](https://i.imgur.com/mvWl3a2.jpg) 460 | ![screenshot](https://i.imgur.com/eX5wcLm.jpg) 461 | ![screenshot](https://i.imgur.com/0UjUA7U.jpg) 462 | ![screenshot](https://i.imgur.com/0FALsOV.jpg) 463 | ![screenshot](https://i.imgur.com/IM414Xu.jpg) 464 | ![screenshot](https://i.imgur.com/QyXXtuF.jpg) 465 | ![screenshot](https://i.imgur.com/PIdv650.jpg) 466 | - [浠Mizuki 1st 3D Live『Bon Voyage!』](https://www.youtube.com/live/Z8vh7LdIfd8?si=4Rk2oSldZn_4HkGg&t=3475) 467 | 468 | ### IRyS Ch. hololive-EN (https://www.youtube.com/@IRyS) 469 | ![screenshot](https://i.imgur.com/uzXUBzM.jpg) 470 | ![screenshot](https://i.imgur.com/AVkvVNr.jpg) 471 | ![screenshot](https://i.imgur.com/9IuhUxd.jpg) 472 | ![screenshot](https://i.imgur.com/WXdlda5.jpg) 473 | ![screenshot](https://i.imgur.com/ogHarSC.jpg) 474 | ![screenshot](https://i.imgur.com/9EZ5npm.jpg) 475 | ![screenshot](https://i.imgur.com/oq98GQb.jpg) 476 | ![screenshot](https://i.imgur.com/vtgqxfn.jpg) 477 | - [IRyS - Carbonated Love【Original Song 3D MV】](https://youtu.be/DjNNpw2x2dU?si=l8likvl1mhKgysJQ) 478 | - [IRyS - Carbonated Love【Original Song MV Teaser】](https://youtu.be/AtJO819M7XU?si=8P67HeUf04lJo6n8) 479 | 480 | ### VSPO!(ぶいすぽっ!【公式】) (https://www.youtube.com/@Vspo77) 481 | ![screenshot](https://i.imgur.com/gbCCiSL.jpg) 482 | ![screenshot](https://i.imgur.com/OQk9nOn.jpg) 483 | ![screenshot](https://i.imgur.com/3HcUwDK.jpg) 484 | ![screenshot](https://i.imgur.com/V1FPVDM.jpg) 485 | ![screenshot](https://i.imgur.com/7JGTBzZ.jpg) 486 | ![screenshot](https://i.imgur.com/hEwWEhA.jpg) 487 | ![screenshot](https://i.imgur.com/iOmmMpW.jpg) 488 | ![screenshot](https://i.imgur.com/sm316MD.jpg) 489 | ![screenshot](https://i.imgur.com/DGiiKKK.jpg) 490 | ![screenshot](https://i.imgur.com/uM0JEzg.jpg) 491 | ![screenshot](https://i.imgur.com/y3yRORf.jpg) 492 | - 【3D企画】ぶいすぽ公式音楽番組「ぶいすPOP!」第2弾【#ぶいすぽ3D】-> https://www.youtube.com/live/97_o-WI4ihc?feature=share 493 | 494 | ### 阿梓从小就很可爱 (https://space.bilibili.com/7706705/) 495 | ![screenshot](https://i.imgur.com/v3VNAbm.jpg) 496 | ![screenshot](https://i.imgur.com/ywGqO4f.jpg) 497 | ![screenshot](https://i.imgur.com/8RYOo4a.jpg) 498 | ![screenshot](https://i.imgur.com/y13uJN0.jpg) 499 | ![screenshot](https://i.imgur.com/186xRLg.jpg) 500 | - 【【直播回放】【3d】三周年新衣发布~ 2023年8月9日19点场】 -> https://www.bilibili.com/video/BV1uX4y1j7BY 501 | 502 | ### WAKTAVERSE (https://www.youtube.com/@waktaverse) 503 | ![screenshot](https://i.imgur.com/AgWJEqV.jpg) 504 | ![screenshot](https://i.imgur.com/vIgo9rc.jpg) 505 | ![screenshot](https://i.imgur.com/Ez8aqpv.jpg) 506 | ![screenshot](https://i.imgur.com/hfqbqL3.jpg) 507 | ![screenshot](https://i.imgur.com/3wg0oFU.jpg) 508 | ![screenshot](https://i.imgur.com/iMxGJ1q.jpg) 509 | ![screenshot](https://i.imgur.com/6NCf9Yh.jpg) 510 | ![screenshot](https://i.imgur.com/8e9rczR.jpg) 511 | ![screenshot](https://i.imgur.com/1wRb1fA.jpg) 512 | ![screenshot](https://i.imgur.com/lkWZqnE.jpg) 513 | ![screenshot](https://i.imgur.com/U24OrRQ.jpg) 514 | ![screenshot](https://i.imgur.com/40pXFdE.jpg) 515 | - [Kissing You(키싱유) 이세계아이돌 COVERㅣ[소녀시대 - Kissing You(키싱유)] (ISEGYE IDOL)](https://youtu.be/OrFyzG5yTC4?si=WAkRHXFEqmPUFa9d) 516 | 517 | ### VSPO!(ぶいすぽっ!) - 夜乃くろむ (https://www.youtube.com/@YanoKuromu) 518 | ![screenshot](https://i.imgur.com/XkqlbNI.jpg) 519 | - [〖#夜乃くろむ3D 〗これがOTONAの魅力ってやつだよ。の巻〖 ぶいすぽっ! / 夜乃くろむ 〗](https://www.youtube.com/live/QtZQ3qHd5qQ?si=Tm3tBY9zcdgBVYHB&t=1438) 520 | - [Greedy Greedy](https://www.youtube.com/live/QtZQ3qHd5qQ?si=Yh_gqFe7pBTnlhuX&t=120) 521 | 522 | ### hololive - Shion Ch. 紫咲シオン (https://www.youtube.com/@MurasakiShion) 523 | ![screenshot](https://i.imgur.com/qjVT4M7.jpg) 524 | ![screenshot](https://i.imgur.com/i050aGy.jpg) 525 | ![screenshot](https://i.imgur.com/pOOn3wn.jpg) 526 | ![screenshot](https://i.imgur.com/p33Rr9U.jpg) 527 | - 【holo*27 MV】紫咲シオン x ラプラス・ダークネス - リップシンク【ホロライブ x DECO*27】 -> https://youtu.be/NjtIAuZQN_E 528 | 529 | ### VSPO!(ぶいすぽっ!【公式】) (https://www.youtube.com/@Vspo77) 530 | ![screenshot](https://i.imgur.com/6EPwhK3.jpg) 531 | ![screenshot](https://i.imgur.com/9AZN4eJ.jpg) 532 | ![screenshot](https://i.imgur.com/Ggco1mq.jpg) 533 | ![screenshot](https://i.imgur.com/ZKBLdgX.jpg) 534 | ![screenshot](https://i.imgur.com/OF5Kbhw.jpg) 535 | ![screenshot](https://i.imgur.com/cQZ8jP5.jpg) 536 | - 【協力脱出】ぶいすぽデスゲーム【#ぶいすぽ3D】 -> https://www.youtube.com/live/nMTQyZ70TCQ?feature=share 537 | 538 | ### Kanauru (https://www.youtube.com/user/kanauru): 539 | ![screenshot](https://i.imgur.com/iVbJHQo.jpg) 540 | ![screenshot](https://i.imgur.com/x8WdatG.jpg) 541 | ![screenshot](https://i.imgur.com/OUXsMzI.jpg) 542 | - Hoshimachi Suisei - TRUE GIRL SHOW | Kanauru PV -> https://youtu.be/FhtabnK3kso 543 | 544 | ### VSPO!(ぶいすぽっ!) - 八雲べに (https://www.youtube.com/@yakumo_beni) 545 | ![screenshot](https://i.imgur.com/TpMR0Sa.jpg) 546 | ![screenshot](https://i.imgur.com/2zWQ7pf.jpg) 547 | ![screenshot](https://i.imgur.com/m74CdfV.jpg) 548 | ![screenshot](https://i.imgur.com/eNPQhVi.jpg) 549 | ![screenshot](https://i.imgur.com/ooIHqsB.jpg) 550 | - 【#八雲べに3D】ついにキタ!耐えろYouTube!【ぶいすぽ/八雲べに】 -> https://www.youtube.com/live/WZ2zvy_gxtM?feature=share 551 | 552 | ### Moona Hoshinova hololive-ID (https://www.youtube.com/@MoonaHoshinova): 553 | ![screenshot](https://i.imgur.com/CJGhfxo.jpg) 554 | ![screenshot](https://i.imgur.com/F5vRtLR.jpg) 555 | ![screenshot](https://i.imgur.com/vJjAac3.jpg) 556 | ![screenshot](https://i.imgur.com/LGWJVnc.jpg) 557 | ![screenshot](https://i.imgur.com/DuxCEVM.jpg) 558 | ![screenshot](https://i.imgur.com/5PtoW1R.jpg) 559 | ![screenshot](https://i.imgur.com/cCxz82L.jpg) 560 | ![screenshot](https://i.imgur.com/skcjPAy.jpg) 561 | - 【Original Song】Who’s Toxic ? It’s You! - Moona Hoshinova【3DMV】 -> https://youtu.be/PFoGNZ05CJw 562 | 563 | ### AIChannel中国绊爱 (https://space.bilibili.com/484322035) 564 | ![screenshot](https://i.imgur.com/xEyCBXZ.jpg) 565 | ![screenshot](https://i.imgur.com/cRAhEE4.jpg) 566 | ![screenshot](https://i.imgur.com/6FZiC00.jpg) 567 | ![screenshot](https://i.imgur.com/5gzCGpn.jpg) 568 | ![screenshot](https://i.imgur.com/hhSrW74.jpg) 569 | ![screenshot](https://i.imgur.com/Us8tEer.jpg) 570 | ![screenshot](https://i.imgur.com/uAYhE8V.jpg) 571 | - 小 看 我 了 吧✨【BDF2023聚光】 -> https://www.bilibili.com/video/BV1FL411Y7Zc 572 | 573 | ### 史黛菈 埃蕾諾亞 / Stella Eleanor Ch. (https://www.youtube.com/@NKStellaEleanor) 574 | ![screenshot](https://i.imgur.com/jm7YKxb.jpg) 575 | ![screenshot](https://i.imgur.com/Boo6tIe.jpg) 576 | ![screenshot](https://i.imgur.com/4KYX2eP.jpg) 577 | ![screenshot](https://i.imgur.com/suKw6aT.jpg) 578 | ![screenshot](https://i.imgur.com/uFeHTSK.jpg) 579 | ![screenshot](https://i.imgur.com/cjlqz0u.jpg) 580 | ![screenshot](https://i.imgur.com/Dy6adLl.jpg) 581 | ![screenshot](https://i.imgur.com/KfwFGio.jpg) 582 | - [ShinWork Stella NiloToon Test 史黛菈女武神](https://youtu.be/jLhFQcBt6jM?si=G5g78GPf6EBclwqs) 583 | 584 | ### 泠鸢yousa (https://space.bilibili.com/282994) 585 | ![screenshot](https://i.imgur.com/SVWHinD.jpg) 586 | ![screenshot](https://i.imgur.com/NKlm7QI.jpg) 587 | ![screenshot](https://i.imgur.com/fHIsbYi.jpg) 588 | ![screenshot](https://i.imgur.com/krowLnM.jpg) 589 | ![screenshot](https://i.imgur.com/IEHSsvf.jpg) 590 | ![screenshot](https://i.imgur.com/0dfC7BB.jpg) 591 | ![screenshot](https://i.imgur.com/2vTqHqb.jpg) 592 | ![screenshot](https://i.imgur.com/47TXt3q.jpg) 593 | ![screenshot](https://i.imgur.com/EslbmcQ.jpg) 594 | ![screenshot](https://i.imgur.com/QKidTrM.jpg) 595 | - 【高清回放】泠鸢个人演唱会【时光标记】十周年纪念-高清全程回放 -> https://www.bilibili.com/video/BV1D24y1B7FA 596 | - 【泠鸢时光标记演唱会】 一镜到底4K纯享版】 -> https://space.bilibili.com/434021034/channel/collectiondetail?sid=1082531 597 | 598 | ### エルセ/ Else (https://x.com/Else_PJblue) 599 | ![screenshot](https://i.imgur.com/bQ7raIT.jpg) 600 | ![screenshot](https://i.imgur.com/WB5Bb3u.jpg) 601 | ![screenshot](https://i.imgur.com/OPwEsPw.jpg) 602 | ![screenshot](https://i.imgur.com/pmnMeeF.jpg) 603 | ![screenshot](https://i.imgur.com/jEgC5yw.jpg) 604 | 605 | ### Nijisanji & bilibili - VirtuaReal (https://www.nijisanji.jp/talents?filter=virtuareal): 606 | ![screenshot](https://i.imgur.com/IKpdkTI.jpg) 607 | ![screenshot](https://i.imgur.com/ixS8EQW.jpg) 608 | ![screenshot](https://i.imgur.com/6k1D6ag.jpg) 609 | ![screenshot](https://i.imgur.com/oAvEF7g.jpg) 610 | ![screenshot](https://i.imgur.com/HVL9Ysa.jpg) 611 | ![screenshot](https://i.imgur.com/aAy01vv.jpg) 612 | ![screenshot](https://i.imgur.com/RA86RGL.jpg) 613 | ![screenshot](https://i.imgur.com/NgdtQJ8.jpg) 614 | ![screenshot](https://i.imgur.com/Fkx2mnn.jpg) 615 | ![screenshot](https://i.imgur.com/wyZgbaq.jpg) 616 | ![screenshot](https://i.imgur.com/qdbruDW.jpg) 617 | ![screenshot](https://i.imgur.com/PHFtPXc.jpg) 618 | ![screenshot](https://i.imgur.com/7wTiBrh.jpg) 619 | ![screenshot](https://i.imgur.com/aUQHF1m.jpg) 620 | ![screenshot](https://i.imgur.com/N3nCelq.jpg) 621 | ![screenshot](https://i.imgur.com/d250aAg.jpg) 622 | ![screenshot](https://i.imgur.com/qF6N0qG.jpg) 623 | ![screenshot](https://i.imgur.com/Rrhv8zc.jpg) 624 | ![screenshot](https://i.imgur.com/WWbyhD7.jpg) 625 | ![screenshot](https://i.imgur.com/5L8rOAm.jpg) 626 | ![screenshot](https://i.imgur.com/VLOGmBY.jpg) 627 | ![screenshot](https://i.imgur.com/9sV2qkn.jpg) 628 | ![screenshot](https://i.imgur.com/biEL7ZZ.jpg) 629 | - VirtuaReal 夏日合唱(2022) -> https://www.bilibili.com/festival/VRSummerSuper 630 | 631 | ### ISEGYE IDOL (이세계아이돌) - 비챤 VIichan (https://www.youtube.com/@viichan116) 632 | ![screenshot](https://i.imgur.com/HUpf5p3.jpg) 633 | ![screenshot](https://i.imgur.com/TCciYcn.jpg) 634 | ![screenshot](https://i.imgur.com/feMsCFg.jpg) 635 | ![screenshot](https://i.imgur.com/a2xB9Ts.jpg) 636 | - Tot Musica - Cover by 비챤 | MV Teaser -> https://youtu.be/OrXUERKzILg 637 | 638 | ![screenshot](https://i.imgur.com/UFVxyAp.jpg) 639 | ![screenshot](https://i.imgur.com/6lS0bmP.jpg) 640 | ![screenshot](https://i.imgur.com/AYJmxGD.jpg) 641 | ![screenshot](https://i.imgur.com/v6UOoNf.jpg) 642 | ![screenshot](https://i.imgur.com/qQQo47d.jpg) 643 | ![screenshot](https://i.imgur.com/zURXH2G.jpg) 644 | - [MV] Tot Musica - Cover by 비챤 -> https://youtu.be/sP0E6y0gWxA 645 | 646 | ### 崩坏学园2-灵依娘desu (https://space.bilibili.com/133934): 647 | ![screenshot](https://i.imgur.com/u8igVrL.jpg) 648 | ![screenshot](https://i.imgur.com/cM07F1y.jpg) 649 | ![screenshot](https://i.imgur.com/a1z5kJL.jpg) 650 | ![screenshot](https://i.imgur.com/ABCUJ9R.jpg) 651 | ![screenshot](https://i.imgur.com/Z5AI8oh.jpg) 652 | ![screenshot](https://i.imgur.com/AdvMZa8.jpg) 653 | - 【崩坏学园2】「启晨之星」菲米莉丝印象曲 -> https://www.bilibili.com/video/BV1Z64y1b7BW?share_source=copy_web 654 | - 「始まりの星」 PV制作花絮 - 角色篇 -> https://www.bilibili.com/video/BV1kU4y1c7AG?share_source=copy_web 655 | 656 | ### 懶貓子 & 杏仁ミル 657 | ![screenshot](https://i.imgur.com/xEHHKrE.jpg) 658 | ![screenshot](https://i.imgur.com/OO7EeR1.jpg) 659 | - 【Cute Dance】一起跳了超可愛的體操!! #shorts #さくゆいたいそう -> https://youtube.com/shorts/c4bXwAXbv1o?feature=share 660 | 661 | ### Rumi ch. 懶貓子 (https://youtu.be/Zlef92wDMnA): 662 | ![screenshot](https://i.imgur.com/VXjRjME.jpg) 663 | ![screenshot](https://i.imgur.com/kJAV5MD.jpg) 664 | ![screenshot](https://i.imgur.com/VQAGeIY.jpg) 665 | ![screenshot](https://i.imgur.com/diy3FOZ.jpg) 666 | ![screenshot](https://i.imgur.com/PXA8toS.jpg) 667 | ![screenshot](https://i.imgur.com/NF0d6tN.jpg) 668 | ![screenshot](https://i.imgur.com/bWnkbcB.jpg) 669 | ![screenshot](https://i.imgur.com/SP2HkMA.jpg) 670 | ![screenshot](https://i.imgur.com/LQrF8MD.jpg) 671 | ![screenshot](https://i.imgur.com/zioRmpu.jpg) 672 | ![screenshot](https://i.imgur.com/JAdtEAO.jpg) 673 | ![screenshot](https://i.imgur.com/oCcqtIS.jpg) 674 | ![screenshot](https://i.imgur.com/iPa9wZ8.jpg) 675 | ![screenshot](https://i.imgur.com/JopBcUs.jpg) 676 | ![screenshot](https://i.imgur.com/zaUh3Ql.jpg) 677 | ![screenshot](https://i.imgur.com/tvnep6K.jpg) 678 | ![screenshot](https://i.imgur.com/BGVkmF2.jpg) 679 | - 【#Rumi3D】3D首次亮相✨生日LIVE🍰🎤|Rumi/懶貓子 -> https://youtu.be/Zlef92wDMnA 680 | - 【3Ddance ver.】笑顔はここにある【#Rumi3D】 -> https://youtu.be/ugTNvBA3-So 681 | - 【3D cover】未知未踏アルスハイル【#Rumi3D】 -> https://youtu.be/X1T4tqdlrZQ 682 | - 【3Ddance ver.】NON STOP SOUL!!!【#Rumi3D】 -> https://youtu.be/10TDfSzRnp8 683 | - 【#Rumi3D】Jugemu Jugemu dance! -> https://youtube.com/shorts/dU-t123n7q8?feature=share 684 | - 【#原神】#提納里 #柯萊 登場!抽卡PK!!!ft.BOSS #19 -> https://youtu.be/R3qM8CwUED8 685 | - 歌ってみた】トウキョウ・シャンディ・ランデヴ - MAISONdes feat. 花譜, ツミキ -> https://youtu.be/XK10jQIaA7s 686 | 687 | ### 杏仁ミル (https://www.youtube.com/@AnninMiru): 688 | ![screenshot](https://i.imgur.com/tQ5y5Dd.jpg) 689 | ![screenshot](https://i.imgur.com/h16ZKW3.jpg) 690 | ![screenshot](https://i.imgur.com/pSFZ5uM.jpg) 691 | ![screenshot](https://i.imgur.com/bcAjy0e.jpg) 692 | ![screenshot](https://i.imgur.com/lIYfaRV.jpg) 693 | ![screenshot](https://i.imgur.com/HD7YE8U.jpg) 694 | ![screenshot](https://i.imgur.com/GS7MMU2.jpg) 695 | ![screenshot](https://i.imgur.com/W0SsYoz.jpg) 696 | ![screenshot](https://i.imgur.com/mzXHdU6.jpg) 697 | ![screenshot](https://i.imgur.com/nYw45Ax.jpg) 698 | ![screenshot](https://i.imgur.com/RfQCpVK.jpg) 699 | ![screenshot](https://i.imgur.com/kDh9aI1.jpg) 700 | ![screenshot](https://i.imgur.com/IswkuJg.jpg) 701 | ![screenshot](https://i.imgur.com/zqFjdNW.jpg) 702 | - 【3D Live】ニャタタリズム - 杏仁ミル【#杏仁ミル3D】-> https://youtu.be/vICHoj4d_jE 703 | - 【3D Live】アスミルキミヘ - 杏仁ミル【#杏仁ミル3D】-> https://youtu.be/ujcUdrf7YBg 704 | 705 | ### 징버거 JINGBURGER (https://www.youtube.com/@jingburger) 706 | ![screenshot](https://i.imgur.com/7CqskrR.jpg) 707 | ![screenshot](https://i.imgur.com/iJumrEs.jpg) 708 | ![screenshot](https://i.imgur.com/0Nw9t3t.jpg) 709 | ![screenshot](https://i.imgur.com/YdOUkzn.jpg) 710 | ![screenshot](https://i.imgur.com/ayhOHNQ.jpg) 711 | - [Can't slow me downㅣ징버거 COVER (feat. 곽춘식)](https://youtu.be/goBJJTlcC_M?si=8a7wW3hZaoXC-Zw2) 712 | 713 | ### Nemesis ch. 涅默 (https://www.youtube.com/@NemesisXDFP) 714 | ![screenshot](https://i.imgur.com/wcMHIBm.jpg) 715 | ![screenshot](https://i.imgur.com/4VFUoMP.jpg) 716 | ![screenshot](https://i.imgur.com/3q7yWQU.jpg) 717 | ![screenshot](https://i.imgur.com/UL3T6uR.jpg) 718 | ![screenshot](https://i.imgur.com/3plWxoL.jpg) 719 | ![screenshot](https://i.imgur.com/uLZH0kQ.jpg) 720 | ![screenshot](https://i.imgur.com/UGNt89o.jpg) 721 | ![screenshot](https://i.imgur.com/5Pnd4O1.jpg) 722 | ![screenshot](https://i.imgur.com/YbgE5Cl.jpg) 723 | - [【3D SHOWCASE】降落!因你而存在的太陽伴星,想帶給你們歡樂又有活力的演出! #Nemomo3D 春魚創意 x VIVE ORIGINALS x BEATDAY【涅默Nemesis】](https://www.youtube.com/live/JIZ3hYas5VY?si=Dqs5uEPWtz0zKDxN&t=2126) 724 | 725 | ### 穆小泠Official (https://space.bilibili.com/43272050) 726 | ![screenshot](https://i.imgur.com/QF7t3x2.jpg) 727 | ![screenshot](https://i.imgur.com/K2YAc33.jpg) 728 | ![screenshot](https://i.imgur.com/nfSngMl.jpg) 729 | ![screenshot](https://i.imgur.com/MwkNyDt.jpg) 730 | - 【【国风原创曲】弹指醉|精美歌舞MMD【穆小泠】】 -> https://www.bilibili.com/video/BV1WG4y1t7o1 731 | 732 | ### 兔眠可可 (https://space.bilibili.com/1096034982) 733 | ![screenshot](https://i.imgur.com/PlJCN49.jpg) 734 | ![screenshot](https://i.imgur.com/la6Qg7n.jpg) 735 | ![screenshot](https://i.imgur.com/KEUiqAo.jpg) 736 | ![screenshot](https://i.imgur.com/hZ3279a.jpg) 737 | ![screenshot](https://i.imgur.com/KgLGgot.jpg) 738 | ![screenshot](https://i.imgur.com/Y1iv1xR.jpg) 739 | - 【个人整了个6位数的舞台跳寄明月,效果还行吗?】 -> https://www.bilibili.com/video/BV12N4y1y7DX 740 | - 【做v一年花了6位数用3D跳舞,值吗?】 -> https://www.bilibili.com/video/BV1334y1G7Wf 741 | - 【谁家的温婉姑娘,邀你花月成双❀《花月成双》3D舞台4K纯享版】 -> https://www.bilibili.com/video/BV1pN4y1y7Mx 742 | 743 | ### psplive - 白神遥Haruka (https://space.bilibili.com/477332594) 744 | ![screenshot](https://i.imgur.com/6hhvJei.jpg) 745 | ![screenshot](https://i.imgur.com/CDfhokR.jpg) 746 | ![screenshot](https://i.imgur.com/sCZ9WGe.jpg) 747 | ![screenshot](https://i.imgur.com/6Cg3e8B.jpg) 748 | ![screenshot](https://i.imgur.com/ph6yXau.jpg) 749 | - [【日清合味道× psplive】原创歌曲《若行星海》MV正式发布!](https://www.bilibili.com/video/BV1qj411B7ps/?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce) 750 | 751 | ### Kanauru (https://www.youtube.com/user/kanauru): 752 | ![screenshot](https://i.imgur.com/7TRdfHh.jpg) 753 | - Takane Lui - Overd ( オーバード ) | Kanauru Dance -> https://youtu.be/9qHbGbK8YnU 754 | 755 | ![screenshot](https://i.imgur.com/cvEciNf.jpg) 756 | ![screenshot](https://i.imgur.com/kfZocG4.jpg) 757 | ![screenshot](https://i.imgur.com/nMlQRiU.jpg) 758 | ![screenshot](https://i.imgur.com/WAW4kph.jpg) 759 | ![screenshot](https://i.imgur.com/uwqMRaM.jpg) 760 | - Laplus - 濁雨 Cover | Kanauru Dance -> https://youtu.be/psrZ-l8ZWOE 761 | 762 | ![screenshot](https://i.imgur.com/lW1w46W.jpg) 763 | ![screenshot](https://i.imgur.com/OBRN3uk.jpg) 764 | ![screenshot](https://i.imgur.com/f5Rlbvn.jpg) 765 | - Nanashi Mumei - The Forgotten Song | Kanauru MV -> https://youtu.be/nHUqPZfaXyI 766 | 767 | ![screenshot](https://i.imgur.com/vH3X61I.jpg) 768 | ![screenshot](https://i.imgur.com/pXcQT0g.jpg) 769 | ![screenshot](https://i.imgur.com/b6Elupz.jpg) 770 | ![screenshot](https://i.imgur.com/6yR1Y0l.jpg) 771 | - Kureiji Ollie Boba Shop Rap MV | Avilon - Speed | Kanauru Original -> https://youtu.be/2CTSe6Q5-xI 772 | 773 | ![screenshot](https://i.imgur.com/1x3NXLg.jpg) 774 | ![screenshot](https://i.imgur.com/kfnccw6.jpg) 775 | - VSHOJO Mahou Idols - Nyanners Ironmouse Silvervale | VILLS -> https://youtu.be/-OultaM3TMg 776 | 777 | ### VirtuaReal (https://space.bilibili.com/413748120) 778 | ![screenshot](https://i.imgur.com/mFYajQZ.jpg) 779 | ![screenshot](https://i.imgur.com/ouCYYuu.jpg) 780 | ![screenshot](https://i.imgur.com/4PIdzV0.jpg) 781 | ![screenshot](https://i.imgur.com/SZuYnrT.jpg) 782 | ![screenshot](https://i.imgur.com/P7vwKgc.jpg) 783 | ![screenshot](https://i.imgur.com/UDSkD38.jpg) 784 | ![screenshot](https://i.imgur.com/yBeVFyq.jpg) 785 | ![screenshot](https://i.imgur.com/OU85vvo.jpg) 786 | ![screenshot](https://i.imgur.com/VYdimOq.jpg) 787 | ![screenshot](https://i.imgur.com/DhjXBtS.jpg) 788 | ![screenshot](https://i.imgur.com/iVony9f.jpg) 789 | ![screenshot](https://i.imgur.com/0IMkaM1.jpg) 790 | ![screenshot](https://i.imgur.com/9bjvA9d.jpg) 791 | - 【【4K】summertime 夏日海边我们在一起】 -> https://www.bilibili.com/video/BV1XN4y1R7K9 792 | - 【【4K】LOVE DIVE 没想到我们跳了吧】 -> https://www.bilibili.com/video/BV1Hz4y1K7K6 793 | - 【【4K】泳装这么可爱真是抱歉/可愛くてごめん~】 -> https://www.bilibili.com/video/BV1xF411k7T7 794 | - 【想去海边 3D泳装直播】 https://www.bilibili.com/video/BV1jN411q7Qy 795 | 796 | ### Warudo on Steam(supporting NiloToonURP) (https://store.steampowered.com/app/2079120/Warudo/) 797 | ![screenshot](https://i.imgur.com/CLq5tte.jpg) 798 | ![screenshot](https://i.imgur.com/weIU8Ua.jpg) 799 | ![screenshot](https://i.imgur.com/9Zzfmd5.jpg) 800 | ![screenshot](https://i.imgur.com/aM2foCp.jpg) 801 | ![screenshot](https://i.imgur.com/OZRHUaO.jpg) 802 | ![screenshot](https://i.imgur.com/XVT386s.jpg) 803 | ![screenshot](https://i.imgur.com/Rq3uqR8.jpg) 804 | ![screenshot](https://i.imgur.com/njJBhHV.jpg) 805 | - 【超高可玩性!全新3D虚拟主播软件【Warudo】】-> https://www.bilibili.com/video/BV198411D7Ui 806 | 807 | ### VShojo Highlights (https://www.youtube.com/@VShojoHighlights) 808 | ![screenshot](https://i.imgur.com/gPQc1Ls.jpg) 809 | ![screenshot](https://i.imgur.com/91a36og.jpg) 810 | ![screenshot](https://i.imgur.com/c8UJW1u.jpg) 811 | ![screenshot](https://i.imgur.com/N6WRNiJ.jpg) 812 | ![screenshot](https://i.imgur.com/VAyfegx.jpg) 813 | - Celebrating 2 Years of VShojo -> https://youtu.be/QxvTqRzwmW4 814 | 815 | ### Kanauru (https://www.youtube.com/user/kanauru): 816 | ![screenshot](https://i.imgur.com/fo9h7YR.jpg) 817 | - Kanauru MV | CapSule - Mori Calliope x Hoshimachi Suisei 818 | 819 | ![screenshot](https://i.imgur.com/TzekRQa.jpg) 820 | ![screenshot](https://i.imgur.com/J5wRsE0.jpg) 821 | ![screenshot](https://i.imgur.com/3ALDYo5.jpg) 822 | - Ninomae Ina'nis - VIOLET | Kanauru MV -> https://youtu.be/vpS0Or-PHqs 823 | 824 | ![screenshot](https://i.imgur.com/SSMqmlR.jpg) 825 | - Suisei humming and playing Tetris at the train station -> https://youtu.be/qZn2qtov6Bo 826 | 827 | ### 米亞 Mya (https://www.youtube.com/@mya./featured) 828 | ![screenshot](https://i.imgur.com/QzISOsI.jpg) 829 | ![screenshot](https://i.imgur.com/MQ07xce.jpg) 830 | ![screenshot](https://i.imgur.com/W4UI45S.jpg) 831 | ![screenshot](https://i.imgur.com/E3WiIi8.jpg) 832 | ![screenshot](https://i.imgur.com/0bZFhwU.jpg) 833 | - 【#米亞兩週年】🎉兩週年🌸新房間攝影大會!補讀SC & 雜談 -> https://youtu.be/eC1djsRKSjY 834 | - 【#米亞兩週年】🎉跟大家一起慶祝 🎈 回饋粉絲向、紀念活動發表!-> https://youtu.be/1acQeY5hsgg?t=3480 835 | - 🔴讀觀眾投稿的爛GAG…笑場即懲罰?!🎃 -> https://youtu.be/-p4KDJC9Xeg 836 | - 🔴週年活動來入坑!玩玩彈射世界🐼<有好多免費抽抽喔...我能抽到好東西嗎✨! -> https://youtu.be/z3pQR7wgCdc 837 | 838 | ### VSPO!(ぶいすぽっ!) - 英リサ.Hanabusa Lisa (https://www.youtube.com/@lisahanabusa) 839 | ![screenshot](https://i.imgur.com/gQHAQhs.jpg) 840 | ![screenshot](https://i.imgur.com/budQFko.jpg) 841 | ![screenshot](https://i.imgur.com/ghUkysz.jpg) 842 | ![screenshot](https://i.imgur.com/nT0EUVI.jpg) 843 | - 【#英リサ3Dお披露目】3次元、お邪魔します【ぶいすぽっ!/英リサ】 -> https://www.youtube.com/live/ey9KCNzSALQ?feature=share 844 | 845 | ### myer gugu(崩坏的栗子_108番) (https://www.artstation.com/myergugu) 846 | ![screenshot](https://i.imgur.com/VZPTL1E.jpg) 847 | ![screenshot](https://i.imgur.com/1VNCjuo.jpg) 848 | ![screenshot](https://i.imgur.com/cTFqrJx.jpg) 849 | ![screenshot](https://i.imgur.com/q8Yxfpu.jpg) 850 | ![screenshot](https://i.imgur.com/35iWFiR.jpg) 851 | ![screenshot](https://i.imgur.com/diLy0kf.jpg) 852 | ![screenshot](https://i.imgur.com/7HRTU3X.jpg) 853 | ![screenshot](https://i.imgur.com/1gVV5ca.jpg) 854 | ![screenshot](https://i.imgur.com/Hu26qqI.jpg) 855 | ![screenshot](https://i.imgur.com/yhCtWsh.jpg) 856 | ![screenshot](https://i.imgur.com/9ClFTst.jpg) 857 | ![screenshot](https://i.imgur.com/8PNIXUo.jpg) 858 | 859 | ### 泠鸢yousa (https://space.bilibili.com/282994) 860 | ![screenshot](https://i.imgur.com/fsAc12K.jpg) 861 | ![screenshot](https://i.imgur.com/lnkV7Io.jpg) 862 | ![screenshot](https://i.imgur.com/IJZiIYD.jpg) 863 | ![screenshot](https://i.imgur.com/11C2mJK.jpg) 864 | ![screenshot](https://i.imgur.com/8n8ZKt4.jpg) 865 | ![screenshot](https://i.imgur.com/mfRS2d7.jpg) 866 | ![screenshot](https://i.imgur.com/VpySKDt.jpg) 867 | 868 | ### Nijisanji & bilibili - VirtuaReal (https://www.nijisanji.jp/talents?filter=virtuareal): 869 | ![screenshot](https://i.imgur.com/GPi2ahM.jpg) 870 | ![screenshot](https://i.imgur.com/k0etAYv.jpg) 871 | ![screenshot](https://i.imgur.com/oGXzquC.jpg) 872 | ![screenshot](https://i.imgur.com/vwwjgVI.jpg) 873 | - https://www.bilibili.com/video/BV1G3411q7un?share_source=copy_web 874 | - https://www.bilibili.com/video/BV1QL411b78T?share_source=copy_web 875 | 876 | ![screenshot](https://i.imgur.com/IygURSJ.jpg) 877 | ![screenshot](https://i.imgur.com/OJskVEW.jpg) 878 | ![screenshot](https://i.imgur.com/tq7sd8C.jpg) 879 | ![screenshot](https://i.imgur.com/CLyb3Od.jpg) 880 | ![screenshot](https://i.imgur.com/TDkGyLs.jpg) 881 | (after clicking the link below, it will require you to press enter on the link again in your browser) 882 | - https://www.bilibili.com/video/BV1Ba411d7dc?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce 883 | - https://www.bilibili.com/video/BV18T411c7XM?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce 884 | 885 | ![screenshot](https://i.imgur.com/JMhgyGz.jpg) 886 | (after clicking the link below, it will require you to press enter on the link again in your browser) 887 | - https://www.bilibili.com/video/BV14Y4y1j7LL?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce 888 | 889 | ![screenshot](https://i.imgur.com/e65IfZH.jpg) 890 | ![screenshot](https://i.imgur.com/xIBhYck.jpg) 891 | ![screenshot](https://i.imgur.com/jbxWnli.jpg) 892 | ![screenshot](https://i.imgur.com/DypAxQR.jpg) 893 | ![screenshot](https://i.imgur.com/cERhwTq.jpg) 894 | - https://www.bilibili.com/video/BV1Sg411V7HU?share_source=copy_web 895 | - https://www.bilibili.com/video/BV1X64y1a7go?share_source=copy_web 896 | 897 | ![screenshot](https://i.imgur.com/vJGTDR8.jpg) 898 | ![screenshot](https://i.imgur.com/lyrUH3X.jpg) 899 | - https://www.bilibili.com/video/BV18f4y1P7Vr?share_source=copy_web 900 | 901 | ![screenshot](https://i.imgur.com/kPShSKQ.jpg) 902 | ![screenshot](https://i.imgur.com/Ma8oU7M.jpg) 903 | ![screenshot](https://i.imgur.com/Pvtxr0h.jpg) 904 | - https://www.bilibili.com/video/BV12h411W7Sm?share_source=copy_web 905 | - https://www.bilibili.com/video/BV1764y1Y7MD?p=2&share_source=copy_web 906 | 907 | ![screenshot](https://i.imgur.com/stWRga3.jpg) 908 | ![screenshot](https://i.imgur.com/qEiRTR9.jpg) 909 | ![screenshot](https://i.imgur.com/mEB7MuT.jpg) 910 | - https://www.bilibili.com/video/BV12h411W7ff?share_source=copy_web 911 | 912 | ![screenshot](https://i.imgur.com/GSGmNEs.jpg) 913 | - https://www.bilibili.com/video/BV1nQ4y1a7ht?share_source=copy_web 914 | 915 | ![screenshot](https://i.imgur.com/PGSN8ed.jpg) 916 | - https://www.bilibili.com/video/BV1Cg411V7qm?share_source=copy_web 917 | 918 | - https://www.bilibili.com/video/BV1ef4y1H7h9?share_source=copy_web 919 | - https://www.bilibili.com/video/BV1Jh411W7RQ?share_source=copy_web 920 | - https://www.bilibili.com/video/BV1q3411B74t?share_source=copy_web 921 | 922 | ![screenshot](https://i.imgur.com/mBD4ued.jpg) 923 | - https://www.bilibili.com/video/BV1ha411q7dY?share_source=copy_web 924 | - https://www.bilibili.com/video/BV1SZ4y1677A?share_source=copy_web 925 | 926 | ![screenshot](https://i.imgur.com/RA67Yjw.jpg) 927 | ![screenshot](https://i.imgur.com/xEZpxnl.jpg) 928 | ![screenshot](https://i.imgur.com/8pU5fhg.jpg) 929 | ![screenshot](https://i.imgur.com/mVe4ezo.jpg) 930 | - https://www.bilibili.com/video/BV1jP4y1K76s?share_source=copy_web 931 | 932 | ![screenshot](https://i.imgur.com/v6Cxuru.jpg) 933 | ![screenshot](https://i.imgur.com/yD5SRt1.jpg) 934 | ![screenshot](https://i.imgur.com/w40M6v9.jpg) 935 | - https://www.bilibili.com/video/BV1eY411g78R?share_source=copy_web (you need to enter the link to the browser again in order to play it) 936 | 937 | ![screenshot](https://i.imgur.com/aLIQO3q.jpg) 938 | - https://www.bilibili.com/video/BV1eS4y1372a?share_source=copy_web 939 | 940 | ### Kanauru (https://www.youtube.com/user/kanauru): 941 | ![screenshot](https://i.imgur.com/fyPlgr4.jpg) 942 | - Pastel Tea Time by Omaru Polka | Kanauru Dance -> https://youtu.be/fri5IKzKDf4 943 | 944 | ![screenshot](https://i.imgur.com/wPxsf1G.jpg) 945 | - Mumei and Kronii walking in the rain -> https://youtube.com/shorts/X3kQZ85N-hE?feature=share 946 | 947 | ![screenshot](https://i.imgur.com/nbZ69KC.jpg) 948 | ![screenshot](https://i.imgur.com/BIjpGAp.jpg) 949 | ![screenshot](https://i.imgur.com/9KcIdQD.jpg) 950 | ![screenshot](https://i.imgur.com/vSvp02D.jpg) 951 | ![screenshot](https://i.imgur.com/lmQWiMp.jpg) 952 | ![screenshot](https://i.imgur.com/d0JkDTk.jpg) 953 | 954 | ### VirtuaReal Star - hanser (https://space.bilibili.com/11073) 955 | ![screenshot](https://i.imgur.com/vPlJSKP.jpg) 956 | ![screenshot](https://i.imgur.com/aCJQOt7.jpg) 957 | - 是小天使2021年百大up主的获奖感言呀~ -> https://www.bilibili.com/video/BV1pF411v7gu 958 | 959 | ![screenshot](https://i.imgur.com/xJ78uRL.jpg) 960 | - (4K画质)hanser个人演唱会《海上油菜花》-> https://www.bilibili.com/video/BV1Bq4y1r7bn (part of the rendering is NiloToonURP) 961 | 962 | ### 泠鸢yousa (https://space.bilibili.com/282994) 963 | ![screenshot](https://i.imgur.com/ENqYsBN.jpg) 964 | ![screenshot](https://i.imgur.com/tUfB3hf.jpg) 965 | ![screenshot](https://i.imgur.com/DaNt9rE.jpg) 966 | ![screenshot](https://i.imgur.com/5Aq4670.jpg) 967 | ![screenshot](https://i.imgur.com/WAzMctg.jpg) 968 | ![screenshot](https://i.imgur.com/amtHwjT.jpg) 969 | ![screenshot](https://i.imgur.com/iGxEgFP.jpg) 970 | ![screenshot](https://i.imgur.com/eZ5xByR.jpg) 971 | ![screenshot](https://i.imgur.com/y9BQsXg.jpg) 972 | 973 | ![screenshot](https://i.imgur.com/BP00DAs.jpg) 974 | ![screenshot](https://i.imgur.com/ge6Jray.jpg) 975 | ![screenshot](https://i.imgur.com/XPhB5pp.jpg) 976 | - https://www.bilibili.com/video/BV1BF41177Wa?share_source=copy_web 977 | - https://www.bilibili.com/video/BV11Z4y1h7hA?share_source=copy_web 978 | - https://www.bilibili.com/video/BV16v4y1N7wy?share_source=copy_web 979 | - https://www.bilibili.com/video/BV1e44y137BL (you need to enter the link to the browser again in order to play it) 980 | - https://www.bilibili.com/video/BV1Ng411X7e8?share_source=copy_web (you need to enter the link to the browser again in order to play it) 981 | 982 | ### hololive-EN (https://hololive.hololivepro.com/en/talents?gp=english): 983 | ![screenshot](https://i.imgur.com/ahpwnk3.jpg) 984 | ![screenshot](https://i.imgur.com/vyutd2p.jpg) 985 | - https://youtu.be/vjBZzYN3aAs 986 | 987 | ![screenshot](https://i.imgur.com/moVfqce.jpg) 988 | ![screenshot](https://i.imgur.com/UU1Isvv.jpg) 989 | ![screenshot](https://i.imgur.com/gp1X9Gj.jpg) 990 | ![screenshot](https://i.imgur.com/9SG2p9U.jpg) 991 | - https://youtu.be/ZyuAdljyvoc 992 | 993 | ### 咩栗&呜米 (https://space.bilibili.com/745493 & https://space.bilibili.com/617459493): 994 | ![screenshot](https://i.imgur.com/3YqHA3L.jpg) 995 | ![screenshot](https://i.imgur.com/XyN1c7b.jpg) 996 | ![screenshot](https://i.imgur.com/f7pmfVU.jpg) 997 | (you need to enter the link to the browser again in order to play it) 998 | - https://www.bilibili.com/video/BV1Ya411X7sZ?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce 999 | - https://www.bilibili.com/video/BV1pN4y1V7KU?share_source=copy_web&vd_source=833e89d3d9a150b0feba26e590fd09ce 1000 | 1001 | # Other NiloToonURP's images (gallery) 1002 | 1003 | ![screenshot](https://i.imgur.com/NYgkGQp.jpg) 1004 | 1005 | shader ON 1006 | ![screenshot](https://i.imgur.com/vXcIGQ0.jpg) 1007 | shader OFF 1008 | ![screenshot](https://i.imgur.com/tx643sR.jpg) 1009 | 1010 | ![screenshot](https://i.imgur.com/tduYcFM.jpg) 1011 | 1012 | shader ON 1013 | ![screenshot](https://i.imgur.com/cM5RJFJ.jpg) 1014 | normal debug 1015 | ![screenshot](https://i.imgur.com/ynw0UBz.jpg) 1016 | shader OFF 1017 | ![screenshot](https://i.imgur.com/XPmC2nt.jpg) 1018 | 1019 | ![screenshot](https://i.imgur.com/kPiktkr.jpg) 1020 | ![screenshot](https://i.imgur.com/ltT2yHs.jpg) 1021 | ![screenshot](https://i.imgur.com/JWbp20K.jpg) 1022 | ![screenshot](https://i.imgur.com/183MzTr.jpg) 1023 | ![screenshot](https://i.imgur.com/6LUJMZV.jpg) 1024 | ![screenshot](https://i.imgur.com/1F9GxjT.jpg) 1025 | ![screenshot](https://i.imgur.com/wXNlCNq.jpg) 1026 | ![screenshot](https://i.imgur.com/Pbs5LAf.jpg) 1027 | ![screenshot](https://i.imgur.com/4J2AExL.jpg) 1028 | ![screenshot](https://i.imgur.com/AieVmMb.jpg) 1029 | ![screenshot](https://i.imgur.com/jHrb3Gb.jpg) 1030 | ![screenshot](https://i.imgur.com/BcyWUKz.jpg) 1031 | ![screenshot](https://i.imgur.com/Pj7sETw.jpg) 1032 | ![screenshot](https://i.imgur.com/G9Eo2eb.jpg) 1033 | ![screenshot](https://i.imgur.com/HUX3Em4.jpg) 1034 | ![screenshot](https://i.imgur.com/vQQsD7j.jpg) 1035 | ![screenshot](https://i.imgur.com/M3vVDZZ.jpg) 1036 | ![screenshot](https://i.imgur.com/DfAGBNL.jpg) 1037 | ![screenshot](https://i.imgur.com/gIbAOkS.jpg) 1038 | ![screenshot](https://i.imgur.com/LdKhKsA.jpg) 1039 | ![screenshot](https://i.imgur.com/LHrgEw8.jpg) 1040 | ![screenshot](https://i.imgur.com/x1KZFou.jpg) 1041 | ![screenshot](https://i.imgur.com/V2N59VY.jpg) 1042 | ![screenshot](https://i.imgur.com/D4VeHH5.jpg) 1043 | ![screenshot](https://i.imgur.com/qJBkQ0X.jpg) 1044 | ![screenshot](https://i.imgur.com/oVO96ml.jpg) 1045 | ![screenshot](https://i.imgur.com/v7E6fkU.jpg) 1046 | ![screenshot](https://i.imgur.com/d2R1L10.jpg) 1047 | ![screenshot](https://i.imgur.com/MinoelW.jpg) 1048 | ![screenshot](https://i.imgur.com/c0zQJP5.jpg) 1049 | ![screenshot](https://i.imgur.com/3RPeUSP.jpg) 1050 | ![screenshot](https://i.imgur.com/PZP4P3f.jpg) 1051 | ![screenshot](https://i.imgur.com/NRHrNfc.jpg) 1052 | ![screenshot](https://i.imgur.com/cZHp2de.jpg) 1053 | ![screenshot](https://i.imgur.com/cb9H6YP.jpg) 1054 | ![screenshot](https://i.imgur.com/2avJKYG.jpg) 1055 | ![screenshot](https://i.imgur.com/wf00agx.jpg) 1056 | ![screenshot](https://i.imgur.com/eYoZpKo.jpg) 1057 | ![screenshot](https://i.imgur.com/VjsNwS8.jpg) 1058 | ![screenshot](https://i.imgur.com/jClzSlf.jpg) 1059 | ![screenshot](https://i.imgur.com/AKM46Os.jpg) 1060 | ![screenshot](https://i.imgur.com/K8qHw6E.jpg) 1061 | ![screenshot](https://i.imgur.com/Xw5PBsw.jpg) 1062 | ![screenshot](https://i.imgur.com/N02piW3.jpg) 1063 | 1064 | ------------------- 1065 | 1066 | SHADER ON 1067 | ![screenshot](https://i.imgur.com/QyrLHYb.jpg) 1068 | ![screenshot](https://i.imgur.com/T00U1qO.jpg) 1069 | BEFORE 1070 | ![screenshot](https://i.imgur.com/qAbvxEZ.jpg) 1071 | AFTER: 1072 | ![screenshot](https://i.imgur.com/373jFLC.jpg) 1073 | see it in motion-> https://youtu.be/D9ocVzGJfI8 1074 | 1075 | --- 1076 | 3D enviroment model TEST 1077 | ![screenshot](https://i.imgur.com/Ob6xlwI.jpg) 1078 | ![screenshot](https://i.imgur.com/1GgqIZx.jpg) 1079 | see it in motion-> https://youtu.be/GcW0pNo-zus 1080 | --- 1081 | 湊 あくあ(みなと あくあ,Minato Aqua) model TEST 1082 | ![screenshot](https://i.imgur.com/bV1fIu8.jpg) 1083 | ![screenshot](https://i.imgur.com/vCcnuso.jpg) 1084 | ![screenshot](https://i.imgur.com/phqlwZE.jpg) 1085 | see it in motion-> https://youtu.be/7zICgzdxuGg 1086 | --- 1087 | see it in motion-> https://youtu.be/X3XoYMTleJ0 1088 | --- 1089 | Auto Phong tessellation 1090 | 1091 | (shader off, no tessellation) 1092 | ![screenshot](https://i.imgur.com/OLAKa24.jpg) 1093 | (shader on, no tessellation) 1094 | ![screenshot](https://i.imgur.com/Q2DyIG7.jpg) 1095 | (shader on, enable tessellation! Phong tessellation can make your model smooth without changing your .fbx) 1096 | ![screenshot](https://i.imgur.com/qlJ2bQQ.jpg) 1097 | see it in motion-> https://youtu.be/D-MxyBa0nJE 1098 | --- 1099 | 1100 | Kawaii model TEST (@ganbaru_sisters) 1101 | ![screenshot](https://i.imgur.com/v9TRN5A.jpg) 1102 | ![screenshot](https://i.imgur.com/FIeltjQ.jpg) 1103 | 1104 | SHADER ON 1105 | ![screenshot](https://i.imgur.com/ztEdBPp.jpg) 1106 | SHADER OFF 1107 | ![screenshot](https://i.imgur.com/JiqrUkk.jpg) 1108 | HD 1109 | ![screenshot](https://i.imgur.com/oV6iTsP.jpg) 1110 | 1111 | shader ON 1112 | ![screenshot](https://i.imgur.com/ZZ0vVjz.jpg) 1113 | shader OFF 1114 | ![screenshot](https://i.imgur.com/POagEfm.jpg) 1115 | 1116 | --- 1117 | 1118 | BEFORE 1119 | ![screenshot](https://i.imgur.com/oxi44CQ.jpg) 1120 | AFTER 1121 | ![screenshot](https://i.imgur.com/FpbVbc0.jpg) 1122 | see it in motion-> https://youtu.be/KpRkxPnHuK0 1123 | --- 1124 | BEFORE 1125 | ![screenshot](https://i.imgur.com/ChhR8Bj.jpg) 1126 | AFTER 1127 | ![screenshot](https://i.imgur.com/h8lkC3L.jpg) 1128 | (more shadow from trees) 1129 | ![screenshot](https://i.imgur.com/GV1QZh6.jpg) 1130 | --- 1131 | 1132 | BEFORE 1133 | ![screenshot](https://i.imgur.com/vgssMwd.jpg) 1134 | AFTER: 1135 | ![screenshot](https://i.imgur.com/MUBfY1H.jpg) 1136 | see it in motion-> https://youtu.be/hUWacEQH6js 1137 | --- 1138 | BEFORE 1139 | 1140 | ![screenshot](https://i.imgur.com/x9mhDzt.jpg) 1141 | 1142 | AFTER: 1143 | 1144 | ![screenshot](https://i.imgur.com/Gf5RyTd.jpg) 1145 | 1146 | BEFORE 1147 | 1148 | 1149 | ![screenshot](https://i.imgur.com/Y39qHYk.jpg) 1150 | 1151 | 1152 | AFTER: 1153 | 1154 | 1155 | ![screenshot](https://i.imgur.com/VwIN3sH.jpg) 1156 | 1157 | 1158 | add 2D hair shadow & rim light 1159 | 1160 | 1161 | ![screenshot](https://i.imgur.com/3UqLwYH.jpg) 1162 | 1163 | 1164 | 1165 | 1166 | see it in motion-> https://youtu.be/S67GlGAnvWA 1167 | --- 1168 | 1169 | --- 1170 | BEFORE 1171 | ![screenshot](https://i.imgur.com/qeljSpf.jpg) 1172 | AFTER: 1173 | ![screenshot](https://i.imgur.com/dzK985t.jpg) 1174 | 1175 | see it in motion-> https://youtu.be/M6FKoEiOAzU 1176 | --- 1177 | ------------------- 1178 | BEFORE 1179 | ![screenshot](https://i.imgur.com/A2PyqyJ.jpg) 1180 | AFTER: 1181 | Sunny + StreetLight ON 1182 | ![screenshot](https://i.imgur.com/mFoMG6n.jpg) 1183 | Sunny + StreetLight OFF 1184 | ![screenshot](https://i.imgur.com/CwQwVWV.jpg) 1185 | Night + StreetLight ON 1186 | ![screenshot](https://i.imgur.com/K2sGcZH.jpg) 1187 | Night + StreetLight OFF 1188 | ![screenshot](https://i.imgur.com/CXCeJsK.jpg) 1189 | see it in motion -> https://youtu.be/jDSnJmZrKPw 1190 | --- 1191 | BEFORE 1192 | ![screenshot](https://i.imgur.com/xY7XacI.jpg) 1193 | AFTER 1194 | ![screenshot](https://i.imgur.com/NLSgYm9.jpg) 1195 | --- 1196 | BEFORE 1197 | ![screenshot](https://i.imgur.com/t9UnHK0.jpg) 1198 | AFTER 1199 | ![screenshot](https://i.imgur.com/qlDP3KN.jpg) 1200 | see it in motion -> https://youtu.be/ZfSZOHTBypc 1201 | --- 1202 | BEFORE 1203 | ![screenshot](https://i.imgur.com/4aEs2eo.jpg) 1204 | AFTER 1205 | ![screenshot](https://i.imgur.com/Nsl24so.jpg) 1206 | see it in motion -> https://youtu.be/EgxiWPk-vaE 1207 | 1208 | --- 1209 | BEFORE 1210 | ![screenshot](https://i.imgur.com/7hgVTZb.jpg) 1211 | AFTER 1212 | ![screenshot](https://i.imgur.com/3jzOYAs.jpg) 1213 | see it in motion -> https://youtu.be/Ty4DXLFqqDo 1214 | --- 1215 | BEFORE 1216 | ![screenshot](https://i.imgur.com/K08rm3X.jpg) 1217 | AFTER 1218 | ![screenshot](https://i.imgur.com/PknYemC.jpg) 1219 | see it in motion -> https://youtu.be/cebGl_MaWnI 1220 | --- 1221 | BEFORE 1222 | ![screenshot](https://i.imgur.com/QUFEnam.jpg) 1223 | AFTER 1224 | ![screenshot](https://i.imgur.com/0fpAVnH.jpg) 1225 | see it in motion ->https://youtu.be/nl5z0r8a9vk 1226 | --- 1227 | ![screenshot](https://i.imgur.com/leuzJ5w.jpg) 1228 | ![screenshot](https://i.imgur.com/AaHctFN.jpg) 1229 | ![screenshot](https://i.imgur.com/Ie6nYSH.jpg) 1230 | see it in motion -> https://youtu.be/uVI_QOioER4 1231 | --- 1232 | Fake Skin SSS & specular 1233 | ![screenshot](https://i.imgur.com/aO6a3gU.jpg) 1234 | ![screenshot](https://i.imgur.com/kVZ0vVg.jpg) 1235 | 1236 | BEFORE 1237 | ![screenshot](https://i.imgur.com/PQoFKIM.jpg) 1238 | AFTER 1239 | ![screenshot](https://i.imgur.com/P7CIuSX.jpg) 1240 | 1241 | 1242 | What is included in this simplified tutorial example toon-lit shader repository? 1243 | ------------------- 1244 | This repository only contains a very simple toon-lit URP tutorial shader example, to help people write their first custom toon-lit shader in URP. 1245 | 1246 | This example shader's default result(without editing material params) = the following picture 1247 | ![screenshot](https://i.imgur.com/7vo6Duo.jpg) 1248 | 1249 | Because this example toon lit shader aims to help people learn shader writing in URP, it is an extremely simplified version. This repository only contains ~3% of the NiloToonURP(full version)'s code, which only contains the most basic & easily understandable sections, to make sure everyone can understand the shader code easily. 1250 | 1251 | It is actually a "How to write your first custom toon-lit shader in URP?" example, instead of a good-looking toon-lit shader (lots of toon-lit tricks are not included in this example shader, for tutorial reasons). 1252 | 1253 | Why create this "simplified version" toon lit shader? 1254 | ------------------- 1255 | Lots of my shader friends are looking for a toon-lit example shader in URP (not Shader Graph), I want them to switch to URP(instead of still staying in built-in RP), so I decided to provide a simple enough URP toon-lit shader example in URP. 1256 | 1257 | How to try this simplified toon-lit example shader in my URP project? 1258 | ------------------- 1259 | 1. Clone all .shader & .hlsl files into your URP project. 1260 | 2. Put these files inside the same folder. 1261 | 3. Change your character's material's shader to "SimpleURPToonLitExample(With Outline)" 1262 | 4. make sure at least _BaseMap(albedo) is assigned 1263 | 5. setup DONE, you can now test your character with light probe/directional light/point light/spot light 1264 | 6. edit the material properties to see how the render result changes 1265 | 7. Most important: open these shader files, and spend some time reading them, you will understand how to write custom lit shaders in URP very quickly 1266 | 8. Most important: open "SimpleURPToonLitOutlineExample_LightingEquation.hlsl", edit it, and experiment with your own toon lighting equation ideas, which is the key part of toon lit shader! 1267 | 1268 | I see the shader is working now, but the outline is broken? 1269 | ------------------- 1270 | For this tutorial shader, you can let Unity calculate smoothed normal for you, which can produce a better outline, 1271 | but doing this will make the lighting slightly incorrect. 1272 | 1273 | 1. click your character's .fbx 1274 | 2. In the model tab 1275 | 3. edit "Normals" to Calculate 1276 | 4. edit "Smoothing Angle" to 180 1277 | 1278 | ![screenshot](https://i.imgur.com/rqefuLr.jpg) 1279 | before calculating smooth normal (print screen of the tutorial shader, not NiloToonURP) 1280 | ![screenshot](https://i.imgur.com/wbjjNtF.jpg) 1281 | after calculating smooth normal (print screen of the tutorial shader, not NiloToonURP) 1282 | ![screenshot](https://i.imgur.com/fTscZV0.jpg) 1283 | 1284 | *NiloToonURP(full version) contains many editor/runtime C# scripts, some of them are for producing correct lighting and perfect outline together automatically. 1285 | 1286 | What is NOT included in this simplified tutorial shader? 1287 | ------------------- 1288 | For simplicity reasons, most of the features from the NiloToonURP(full version) are removed, or else for beginners, this simple tutorial example shader will be way too complex for reading & learning. Some of the removed features are: 1289 | - face anime lighting (auto-fix face ugly lighting due to vertex normal without modifying .fbx, very important) 1290 | - smooth outline normal auto baking (auto-fix ugly outlines without modifying .fbx and lighting normal, very important) 1291 | - auto 2D hair shadow on the face (very important, it is very difficult to produce good-looking shadow results on the face using URP's shadow map) 1292 | - constant width rim light (similar to the method of Blue Protocol / Genshin Impact) 1293 | - tricks to render eye/eyebrow over hair (ZOffset, stencil, and renderer redraw helpers) 1294 | - PBR specular lighting (GGX) 1295 | - all kinds of MatCap features(additive/multiply/shadow/replace...) 1296 | - "HSV,tint,texture tint,texture override" shadow & outline color control 1297 | - almost all the extra texture input options like roughness, specular, normal map, detail map, parallax, occlusion, emission... 1298 | - LOTS of sliders to control lighting style, shadow color, final color, outline, rim light... 1299 | - per character "dither fade inout / rim light / color control / extra outline / dissolve / ..." control script 1300 | - volume override control of global "rim light / shadow / color control..." 1301 | - special bloom post-process volume that can control the param of character/non-character area separately. Usually to prevent character over-bloom, or make the character emitting bloom on allowed areas only 1302 | - anime postprocessing volume 1303 | - shadow control volume 1304 | - perspective removal per character, to avoid character's 3D distorted by high FOV camera 1305 | - shader stripping editor script, to keep runtime shader memory usage and build time lower 1306 | - (lots of other features) 1307 | * just too much for me to write all the removed features here, the NiloToonURP(full version) and this simple tutorial shader example are two totally different products already 1308 | 1309 | How to get a test character model? 1310 | ------------------- 1311 | The easiest way to get a character model is by downloading Unity-Chan in the Unity AssetStore. 1312 | 1313 | Also, here are some websites where you can download models(If the creator allows it) 1314 | - https://3d.nicovideo.jp/ 1315 | - https://hub.vroid.com/ 1316 | 1317 | if you downloaded a .pmx file, use MMD4Mecanim to convert it to .fbx & prefab directly inside unity 1318 | http://stereoarts.jp/ 1319 | 1320 | if you downloaded a .vrm file, use UniVRM to convert it to prefab directly inside Unity 1321 | https://github.com/vrm-c/UniVRM 1322 | 1323 | Editor version requirement 1324 | ----------------------- 1325 | - Unity 2022.3 1326 | 1327 | --------------------------- 1328 | Apply our shader to another model (2020-2 early version screenshots) 1329 | https://youtu.be/uVI_QOioER4 1330 | 1331 | ![screenshot](https://i.imgur.com/qsx3VYw.jpg) 1332 | ![screenshot](https://i.imgur.com/NTek8q8.jpg) 1333 | ![screenshot](https://i.imgur.com/ee9dakE.jpg) 1334 | ![screenshot](https://i.imgur.com/Bs0AKcb.jpg) 1335 | ![screenshot](https://i.imgur.com/RITr1Il.jpg) 1336 | ![screenshot](https://i.imgur.com/R2yHbz7.jpg) 1337 | 1338 | More old screenshots from the Full version shader: 1339 | --- 1340 | 1341 | ![screenshot](https://i.imgur.com/j5RgZpO.jpg) 1342 | https://youtu.be/IP293mAmBCk 1343 | 1344 | ![screenshot](https://i.imgur.com/Wi0qy8V.jpg) 1345 | ![screenshot](https://i.imgur.com/ncdJ7vp.jpg) 1346 | ![screenshot](https://i.imgur.com/xoxrIZW.jpg) 1347 | 1348 | ![screenshot](https://i.imgur.com/aj12x53.jpg) 1349 | ![screenshot](https://i.imgur.com/mXOkXOJ.jpg) 1350 | 1351 | different Background image TEST 1352 | ![screenshot](https://i.imgur.com/p6EcR8C.jpg) 1353 | ![screenshot](https://i.imgur.com/yT1IFKo.jpg) 1354 | ![screenshot](https://i.imgur.com/EyKmmH5.jpg) 1355 | ![screenshot](https://i.imgur.com/WzuA4rN.jpg) 1356 | ![screenshot](https://i.imgur.com/QxJ3tUR.jpg) 1357 | 1358 | Credits 1359 | ------------------------ 1360 | model's creator in shader demo image/video: 1361 | - https://i-fox.club/pcr/ 1362 | - https://sketchfab.com/3d-models/band-of-sisters-2f1c0626d4cf4fd286c4cf5d109f7a32 1363 | - miHoYo - Honkai Impact 3 1364 | - Kuro Game - Punishing: Grey Raven 1365 | - Azur Lane: Crosswave 1366 | - Sour式鏡音リン 1367 | - Unity-Chan 1368 | - https://www.bilibili.com/blackboard/activity-mrfzrlha.html 1369 | - 【オリジナル3Dモデル】Eve -イヴ- by ganbaru_sisters https://booth.pm/en/items/2557029 1370 | - https://www.mmd.hololive.tv/ 1371 | - Japanese Street by Art Equilibrium https://assetstore.unity.com/packages/3d/environments/urban/japanese-street-170162 1372 | - miHoYo - Genshin Impact 1373 | - 【セール中】【オリジナル3Dモデル】ドラゴニュート・シェンナ by rokota https://rokota.booth.pm/items/2661189 1374 | - Cygames - Uma Musume 1375 | - Cygames/Arc System Works - Granblue Fantasy Versus 1376 | - 魔使マオ by 百舌谷@mozuya_ 1377 | - QuQu - https://sonovr.booth.pm/ 1378 | - nero -ネロ- by KM3 Doll - https://booth.pm/en/items/3167314 1379 | - Kanauru's credit list - https://youtu.be/2CTSe6Q5-xI 1380 | - YOYOGIMORI (【VRC / VRM 対応3Dモデル】imiut ver3.03) - https://yoyogi-mori.booth.pm/items/2040691 1381 | - YOYOGIMORI (【VRC / VRM 対応3Dモデル】白鳥 -Shiratori- ver3.03) - https://yoyogi-mori.booth.pm/items/2482022 1382 | - Blue Archive Shun - https://bluearchive.jp/ 1383 | - アイドリープライド,IDOLY PRIDE - https://idolypride.jp/ 1384 | - Little Witch Nobeta - https://store.steampowered.com/app/1049890/Little_Witch_Nobeta/ 1385 | - オリジナル3Dモデル「桔梗」by ぽんでろ - https://booth.pm/en/items/3681787 1386 | - 千反田える 3Dモデル(3ds Max) by @itou_nko - https://twitter.com/itou_nko (https://itou-nko.fanbox.cc/) 1387 | - HoYoverse - Zenless Zone Zero - zenless.hoyoverse.com 1388 | - アイドリープライド,IDOLY PRIDE - https://idolypride.jp/ 1389 | - Honkai: Star Rail - https://hsr.hoyoverse.com/ 1390 | - Girls Frontline 2 Exilium 1391 | 1392 | -------------------------------------------------------------------------------- /SimpleURPToonLitOutlineExample.shader: -------------------------------------------------------------------------------- 1 | // For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample 2 | 3 | /* 4 | This shader is a simple and short example showing you how to write your first URP custom toon lit shader with "minimum" shader code. 5 | You can use this shader as a starting point, add/edit code to develop your own custom toon lit shader for URP14(Unity2022.3) or above. 6 | 7 | Usually, just by editing "SimpleURPToonLitOutlineExample_LightingEquation.hlsl" alone can control most of the visual result. 8 | 9 | This shader includes 5 passes: 10 | 0.UniversalForwardOnly pass (this pass will always render to the _CameraColorAttachment* & _CameraDepthAttachment*) 11 | 1.Outline pass (this pass will always render to the _CameraColorAttachment* & _CameraDepthAttachment*) 12 | 2.ShadowCaster pass (only for URP's shadow caster rendering, render to the _MainLightShadowmapTexture* and _AdditionalLightsShadowmapTexture*. This pass won't render at all if your character don't cast shadow) 13 | 3.DepthOnly pass (only for URP's _CameraDepthTexture's rendering. This pass won't render at all if your project don't render URP's offscreen depth prepass) 14 | 4.DepthNormalsOnly pass (only for URP's _CameraDepthTexture + _CameraNormalsTexture's rendering. This pass won't render at all if your project don't render URP's offscreen depth+normal prepass) 15 | 16 | - Because most of the time, you use this toon lit shader for unique dynamic characters, so all lightmap related code are removed for simplicity. 17 | - For batching, we only rely on SRP batching, which is the most practical batching method in URP for rendering lots of unique animated SkinnedMeshRenderer characters using the same shader 18 | 19 | Most of the properties will try to follow URP Lit shader's naming convention, 20 | so switching your URP lit material's shader to this toon lit shader will preserve most of the original properties if defined in this shader. 21 | For URP Lit shader's naming convention, see URP's Lit.shader. 22 | 23 | In this shader, sometimes we choose "conditional move (a?b:c)" or "static uniform branching (if(_Uniform))" over "shader_feature & multi_compile" for some of the toggleable features, 24 | because: 25 | - we want to avoid this shader's build time takes too long (2^n) 26 | - we want to avoid shader size and memory usage becomes too large easily (2^n), 2GB memory iOS mobile will crash easily if you use too much multi_compile 27 | - we want to avoid rendering spike/hiccup when a new shader variant was seen by the camera first time ("create GPU program" in profiler) 28 | - we want to avoid increasing ShaderVariantCollection's keyword combination complexity 29 | - we want to avoid breaking SRP batching because SRP batching is per shader variant batching, not per shader 30 | 31 | All modern GPU(include the latest high-end mobile devices) can handle "static uniform branching" with "almost" no performance cost (if register pressure is not the bottleneck). 32 | Usually, there exist 4 cases of branching, here we sorted them by cost, from lowest cost to highest cost, 33 | and you usually only need to worry about the "case 4" only! 34 | 35 | case 1 - compile time constant if(): 36 | // absolutely 0 performance cost for any platform, unity's shader compiler will treat the false side of if() as dead code and remove it completely 37 | // shader compiler is very good at dead code removal 38 | #define SHOULD_RUN_FANCY_CODE 0 39 | if(SHOULD_RUN_FANCY_CODE) {...} 40 | 41 | case 2 - static uniform branching if(): 42 | // reasonable low performance cost (except OpenGLES2, OpenGLES2 doesn't have branching and will always run both paths and discard the false path) 43 | // since OpenGLES2 is not important anymore in 2024, we will use static uniform branching if() when suitable 44 | CBUFFER_START(UnityPerMaterial) 45 | float _ShouldRunFancyCode; // usually controlled by a [Toggle] in material inspector, or material.SetFloat(1 or 0) in C# 46 | CBUFFER_END 47 | if(_ShouldRunFancyCode) {...} 48 | 49 | case 3 - dynamic branching if() without divergence inside a wavefront/warp: 50 | bool shouldRunFancyCode = (some shader calculation); // all pixels inside a wavefront/warp(imagine it is a group of 8x8 pixels) all goes into the same path, then no divergence. 51 | if(shouldRunFancyCode) {...} 52 | 53 | case 4 - dynamic branching if() WITH divergence inside a wavefront/warp: 54 | // this is the only case that will make GPU really slow! You will want to avoid it as much as possible 55 | bool shouldRunFancyCode = (some shader calculation); // pixels inside a wavefront/warp(imagine it is a group of 8x8 pixels) goes into different paths, even it is 63 vs 1 within a 8x8 thread group, it is still divergence! 56 | if(shouldRunFancyCode) {...} 57 | 58 | If you want to understand the difference between case 1-4, 59 | Here are some extra resources about the cost of if() / branching / divergence in shader: 60 | - https://stackoverflow.com/questions/37827216/do-conditional-statements-slow-down-shaders 61 | - https://stackoverflow.com/questions/5340237/how-much-performance-do-conditionals-and-unused-samplers-textures-add-to-sm2-3-p/5362006#5362006 62 | - https://twitter.com/bgolus/status/1235351597816795136 63 | - https://twitter.com/bgolus/status/1235254923819802626?s=20 64 | - https://www.shadertoy.com/view/wlsGDl?fbclid=IwAR1ByDhQBck8VO0AMPS5XpbtBPSzSN9Mh8clW4itRgDIpy5ROcXW1Iyf86g 65 | 66 | [TLDR] 67 | Just remember(even for mobile platform): 68 | - if() itself is not evil, you CAN use it if you know there is no divergence inside a wavefront/warp, still, it is not free on mobile. 69 | - "a ? b : c" is just a conditional move(movc / cmov) in assembly code, don't worry using it if you have calculated b and c already 70 | - Don't try to optimize if() or "a ? b : c" by replacing them by lerp(b,c,step())..., because "a ? b : c" is always faster if you have calculated b and c already 71 | - branching is not evil, still it is not free. Sometimes we can use branching to help GPU run faster if the skipped task is heavy! 72 | - but, divergence is evil! If you want to use if(condition){...}else{...}, make sure the "condition" is the same within as many groups of 8x8 pixels as possible 73 | 74 | [Note from the developer (1)] 75 | Using shader permutation(multi_compile/shader_feature) is still the fastest way to skip shader calculation, 76 | because once the code doesn't exist, it will enable many compiler optimizations. 77 | If you need the best GPU performance, and you can accept long build time and huge memory usage, you can use multi_compile/shader_feature more, especially for features with texture read. 78 | 79 | NiloToonURP's character shader will always prefer shader permutation if it can skip any texture read, 80 | because the GPU hardware has very strong ALU(pure calculation) power growth since 2015 (including mobile), 81 | but relatively weak growth in memory bandwidth(usually means buffer/texture read). 82 | (https://community.arm.com/developer/tools-software/graphics/b/blog/posts/moving-mobile-graphics#siggraph2015) 83 | 84 | And when GPU is waiting for receiving texture fetch, it won't become idle, 85 | GPU will still continue any available ALU work(latency hiding) until there is 100% nothing to calculate anymore, 86 | also bandwidth is the biggest source of heat generation (especially on mobile without active cooling = easier overheat/thermal throttling). 87 | So we should try our best to keep memory bandwidth usage low (since more ALU is ok, but more texture read is not ok), 88 | the easiest way is to remove texture read using shader permutation. 89 | 90 | But if the code is ALU only(pure calculation), and calculation is simple on both paths on the if & else side, NiloToonURP will prefer "a ? b : c". 91 | The rest will be static uniform branching (usually means heavy ALU only code inside an if()). 92 | 93 | [Note from the developer (2)] 94 | If you are working on a game project, not a generic tool like NiloToonURP, you will always want to pack 4data (occlusion/specular/smoothness/any mask.....) into 1 RGBA texture(for fragment shader), 95 | and pack 4data (outlineWidth/ZOffset/face area mask....) into another RGBA texture(for vertex shader), to reduce the number of texture read without changing visual result(if we ignore texture compression). 96 | But since NiloToonURP is a generic tool that is used by different person/team/company, 97 | we know it is VERY important for all users to be able to apply NiloToon shader to any model easily/fast/without effort, 98 | and we know that it is almost not practical if we force regular user to pack their texture into a special format just for NiloToon shader, 99 | so we decided we will keep every texture separated, even it is VERY slow compared to the packed texture method. 100 | That is a sad decision in terms of performance, but a good decision for ease of use. 101 | If user don't need the best performance, this decision is actually a plus to them since it is much more flexible when using this shader. 102 | 103 | [About multi_compile or shader_feature's _vertex and _fragment suffixes] 104 | In unity 2020.3, unity added _vertex, _fragment suffixes to multi_compile and shader_feature 105 | https://docs.unity3d.com/2020.3/Documentation/Manual/SL-MultipleProgramVariants.html (Using stage-specific keyword directives) 106 | 107 | The only disadvantage of NOT using _vertex and _fragment suffixes is only compilation time, not build size/memory usage: 108 | https://docs.unity3d.com/2020.3/Documentation/Manual/SL-MultipleProgramVariants.html (Stage-specific keyword directives) 109 | "Unity identifies and removes duplicates afterwards, so this redundant work does not affect build sizes or runtime performance; 110 | however, if you have a lot of stages and/or variants, the time wasted during shader compilation can be significant." 111 | 112 | --------------------------------------------------------------------------- 113 | More information about mobile GPU optimization can be found here, most of the best practice can apply both GPU(Mali & Adreno): 114 | https://developer.arm.com/solutions/graphics-and-gaming/arm-mali-gpu-training 115 | 116 | [Shader build time and memory] 117 | https://blog.unity.com/engine-platform/2021-lts-improvements-to-shader-build-times-and-memory-usage 118 | 119 | [Support SinglePassInstancing] 120 | https://docs.unity3d.com/2022.2/Documentation/Manual/SinglePassInstancing.html 121 | 122 | [Conditionals can affect #pragma directives] 123 | preprocessor conditionals can be used to influence, which #pragma directives are selected. 124 | https://forum.unity.com/threads/new-shader-preprocessor.790328/ 125 | https://docs.unity3d.com/Manual/shader-variant-stripping.html 126 | Example code: 127 | { 128 | #ifdef SHADER_API_DESKTOP 129 | #pragma multi_compile _ RED GREEN BLUE WHITE 130 | #else 131 | #pragma shader_feature RED GREEN BLUE WHITE 132 | #endif 133 | } 134 | { 135 | #if SHADER_API_DESKTOP 136 | #pragma geometry ForwardPassGeometry 137 | #endif 138 | } 139 | { 140 | #if SHADER_API_DESKTOP 141 | #pragma vertex DesktopVert 142 | #else 143 | #pragma vertex MobileVert 144 | #endif 145 | } 146 | { 147 | #if SHADER_API_DESKTOP 148 | #pragma multi_compile SHADOWS_LOW SHADOWS_HIGH 149 | #pragma multi_compile REFLECTIONS_LOW REFLECTIONS_HIGH 150 | #pragma multi_compile CAUSTICS_LOW CAUSTICS_HIGH 151 | #elif SHADER_API_MOBILE 152 | #pragma multi_compile QUALITY_LOW QUALITY_HIGH 153 | #pragma shader_feature CAUSTICS // Uses shader_feature, so Unity strips variants that use CAUSTICS if there are no Materials that use the keyword at build time. 154 | #endif 155 | } 156 | But this will not work (Keywords coming from pragmas (shader_feature, multi_compile and variations) will not affect other pragmas.): 157 | { 158 | #pragma shader_feature WIREFRAME_MODE_ON 159 | 160 | #ifdef WIREFRAME_MODE_ON 161 | #pragma geometry ForwardPassGeometry 162 | #endif 163 | } 164 | 165 | [Write .shader and .hlsl using an IDE] 166 | Rider is the best IDE for writing shader in Unity, there should be no other better tool than Rider. 167 | If you never used Rider to write hlsl before, we highly recommend trying it for a month for free. 168 | https://www.jetbrains.com/rider/ 169 | 170 | [hlsl code is inactive in Rider] 171 | You may encounter an issue that some hlsl code is inactive within the #if #endif section, so Rider's "auto complete" and "systax highlightd" is not active, 172 | to solve this problem, please switch the context using the "Unity Shader Context picker in the status bar" UI at the bottom right of Rider 173 | 174 | For details, see this Rider document about "Unity Shader Context picker in the status bar": 175 | https://github.com/JetBrains/resharper-unity/wiki/Switching-code-analysis-context-for-hlsl-cginc-files-in-Rider 176 | */ 177 | Shader "SimpleURPToonLitExample(With Outline)" 178 | { 179 | Properties 180 | { 181 | [Header(High Level Setting)] 182 | [ToggleUI]_IsFace("Is Face? (face/eye/mouth)", Float) = 0 183 | 184 | [Header(Base Color)] 185 | [MainTexture]_BaseMap("Base Map", 2D) = "white" {} 186 | [HDR][MainColor]_BaseColor("Base Color", Color) = (1,1,1,1) 187 | 188 | [Header(Alpha Clipping)] 189 | [Toggle(_UseAlphaClipping)]_UseAlphaClipping("Enable?", Float) = 0 190 | _Cutoff(" Cutoff", Range(0.0, 1.0)) = 0.5 191 | 192 | [Header(Emission)] 193 | [Toggle]_UseEmission("Enable?", Float) = 0 194 | [HDR] _EmissionColor(" Color", Color) = (0,0,0) 195 | _EmissionMulByBaseColor(" Mul Base Color", Range(0,1)) = 0 196 | [NoScaleOffset]_EmissionMap(" Emission Map", 2D) = "white" {} 197 | _EmissionMapChannelMask(" ChannelMask", Vector) = (1,1,1,0) 198 | 199 | [Header(Occlusion)] 200 | [Toggle]_UseOcclusion("Enable?", Float) = 0 201 | _OcclusionStrength(" Strength", Range(0.0, 1.0)) = 1.0 202 | [NoScaleOffset]_OcclusionMap(" OcclusionMap", 2D) = "white" {} 203 | _OcclusionMapChannelMask(" ChannelMask", Vector) = (1,0,0,0) 204 | _OcclusionRemapStart(" RemapStart", Range(0,1)) = 0 205 | _OcclusionRemapEnd(" RemapEnd", Range(0,1)) = 1 206 | 207 | [Header(Indirect Light)] 208 | _IndirectLightMinColor("Min Color", Color) = (0.1,0.1,0.1,1) // can prevent completely black if light prob is not baked 209 | _IndirectLightMultiplier("Multiplier", Range(0,1)) = 1 210 | 211 | [Header(Direct Light)] 212 | _DirectLightMultiplier("Brightness", Range(0,1)) = 1 213 | _CelShadeMidPoint("MidPoint", Range(-1,1)) = -0.5 214 | _CelShadeSoftness("Softness", Range(0,1)) = 0.05 215 | _MainLightIgnoreCelShade("Remove Shadow", Range(0,1)) = 0 216 | 217 | [Header(Additional Light)] 218 | _AdditionalLightIgnoreCelShade("Remove Shadow", Range(0,1)) = 0.9 219 | 220 | [Header(Shadow Mapping)] 221 | _ReceiveShadowMappingAmount("Strength", Range(0,1)) = 0.65 222 | _ShadowMapColor(" Shadow Color", Color) = (1,0.825,0.78) 223 | _ReceiveShadowMappingPosOffset(" Depth Bias", Float) = 0 224 | 225 | [Header(Outline)] 226 | _OutlineWidth("Width", Range(0,4)) = 1 227 | _OutlineColor("Color", Color) = (0.5,0.5,0.5,1) 228 | 229 | [Header(Outline ZOffset)] 230 | _OutlineZOffset("ZOffset (View Space)", Range(0,1)) = 0.0001 231 | [NoScaleOffset]_OutlineZOffsetMaskTex(" Mask (black is apply ZOffset)", 2D) = "black" {} 232 | _OutlineZOffsetMaskRemapStart(" RemapStart", Range(0,1)) = 0 233 | _OutlineZOffsetMaskRemapEnd(" RemapEnd", Range(0,1)) = 1 234 | } 235 | SubShader 236 | { 237 | Tags 238 | { 239 | // SRP introduced a new "RenderPipeline" tag in Subshader. This allows you to create shaders 240 | // that can match multiple render pipelines. If a RenderPipeline tag is not set it will match 241 | // any render pipeline. In case you want your SubShader to only run in URP, set the tag to 242 | // "UniversalPipeline" 243 | 244 | // here "UniversalPipeline" tag is required, because we only want this shader to run in URP. 245 | // If Universal render pipeline is not set in the graphics settings, this SubShader will fail. 246 | 247 | // One can add a SubShader below or fallback to Standard built-in to make this 248 | // material works with both Universal Render Pipeline and Builtin-RP 249 | 250 | // the tag value is "UniversalPipeline", not "UniversalRenderPipeline", be careful! 251 | "RenderPipeline" = "UniversalPipeline" 252 | 253 | // explicit SubShader tag to avoid confusion 254 | "RenderType" = "Opaque" 255 | "IgnoreProjector" = "True" 256 | "UniversalMaterialType" = "ComplexLit" 257 | "Queue"="Geometry" 258 | } 259 | 260 | // You can use LOD to control if this SubShader should be used. 261 | // if this SubShader is not allowed to be use due to LOD, 262 | // Unity will consider the next SubShader 263 | LOD 100 264 | 265 | // We can extract duplicated hlsl code from all passes into this HLSLINCLUDE section. Less duplicated code = Less error 266 | HLSLINCLUDE 267 | 268 | // all Passes will need this keyword 269 | #pragma shader_feature_local_fragment _UseAlphaClipping 270 | 271 | ENDHLSL 272 | 273 | // [#0 Pass - ForwardLit] 274 | // Forward only pass. 275 | // Acts also as an opaque forward fallback for deferred rendering. 276 | // Shades GI, all lights, shadow, emission and fog in a single pass. 277 | // Compared to Builtin pipeline forward renderer, URP forward renderer will 278 | // render a scene with multiple lights with less draw calls and less overdraw. 279 | Pass 280 | { 281 | Name "ForwardLit" 282 | Tags 283 | { 284 | // "LightMode" matches the "ShaderPassName" set in UniversalRenderPipeline.cs. 285 | // SRPDefaultUnlit and passes with no LightMode tag are also rendered by URP 286 | 287 | // "LightMode" tag must be "UniversalForward" in order to render lit objects in URP. 288 | "LightMode" = "UniversalForwardOnly" 289 | } 290 | 291 | // ------------------------------------- 292 | // Render State Commands 293 | // - explicit render state to avoid confusion 294 | // - you can expose these render state to material inspector if needed (see URP's Lit.shader) 295 | Blend One Zero 296 | ZWrite On 297 | Cull Off 298 | ZTest LEqual 299 | 300 | HLSLPROGRAM 301 | #pragma target 2.0 302 | 303 | // ------------------------------------- 304 | // Shader Stages 305 | #pragma vertex VertexShaderWork 306 | #pragma fragment ShadeFinalColor 307 | 308 | // ------------------------------------- 309 | // Material Keywords 310 | // (all shader_feature that we needed were extracted to a shared SubShader level HLSL block already) 311 | 312 | // ------------------------------------- 313 | // Universal Pipeline keywords 314 | // You can always copy this section from URP's ComplexLit.shader 315 | // When doing custom shaders you most often want to copy and paste these #pragma multi_compile 316 | // These multi_compile variants are stripped from the build depending on: 317 | // 1) Settings in the URP Asset assigned in the GraphicsSettings at build time 318 | // e.g If you disabled AdditionalLights in all the URP assets then all _ADDITIONA_LIGHTS variants 319 | // will be stripped from build 320 | // 2) Invalid combinations are stripped. 321 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN 322 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 323 | #pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX 324 | #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS 325 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING 326 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION 327 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 328 | #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION 329 | #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 330 | #pragma multi_compile_fragment _ _LIGHT_LAYERS 331 | #pragma multi_compile_fragment _ _LIGHT_COOKIES 332 | #pragma multi_compile _ _FORWARD_PLUS 333 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" 334 | 335 | // ------------------------------------- 336 | // Unity defined keywords 337 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 338 | #pragma multi_compile _ SHADOWS_SHADOWMASK 339 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 340 | #pragma multi_compile _ LIGHTMAP_ON 341 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 342 | #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE 343 | #pragma multi_compile_fog 344 | #pragma multi_compile_fragment _ DEBUG_DISPLAY 345 | 346 | //-------------------------------------- 347 | // GPU Instancing 348 | #pragma multi_compile_instancing 349 | #pragma instancing_options renderinglayer 350 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl" 351 | 352 | //-------------------------------------- 353 | // Defines 354 | // - because this pass is just a ForwardLitOnly pass, no need any special #define 355 | // (no special #define) 356 | 357 | // ------------------------------------- 358 | // Includes 359 | // - all shader logic written inside this .hlsl, remember to write all #define BEFORE writing #include 360 | #include "SimpleURPToonLitOutlineExample_Shared.hlsl" 361 | 362 | ENDHLSL 363 | } 364 | 365 | // [#1 Pass - Outline] 366 | // Same as the above "ForwardLit" pass, but: 367 | // - vertex position are pushed out a bit base on normal direction 368 | // - also color is tinted by outline color 369 | // - Cull Front instead of Cull Off because Cull Front is a must for any 2 pass outline method 370 | Pass 371 | { 372 | Name "Outline" 373 | Tags 374 | { 375 | // IMPORTANT: don't write this line for any custom pass(e.g. outline pass)! 376 | // else this outline pass(custom pass) will not be rendered by URP! 377 | //"LightMode" = "UniversalForwardOnly" 378 | 379 | // [Important CPU performance note] 380 | // If you need to add a custom pass to your shader (e.g. outline pass, planar shadow pass, Xray overlay pass when blocked....), 381 | // follow these steps: 382 | // (1) Add a new Pass{} to your shader 383 | // (2) Write "LightMode" = "YourCustomPassTag" inside new Pass's Tags{} 384 | // (3) Add a new custom RendererFeature(C#) to your renderer, 385 | // (4) write cmd.DrawRenderers() with ShaderPassName = "YourCustomPassTag" 386 | // (5) if done correctly, URP will render your new Pass{} for your shader, in a SRP-batching friendly way (usually in 1 big SRP batch) 387 | 388 | // For tutorial purpose, current everything is just shader files without any C#, so this Outline pass is actually NOT SRP-batching friendly. 389 | // If you are working on a project with lots of characters, make sure you use the above method to make Outline pass SRP-batching friendly! 390 | } 391 | 392 | // ------------------------------------- 393 | // Render State Commands 394 | // - Cull Front is a must for extra pass outline method 395 | Blend One Zero 396 | ZWrite On 397 | Cull Front 398 | ZTest LEqual 399 | 400 | HLSLPROGRAM 401 | #pragma target 2.0 402 | 403 | // ------------------------------------- 404 | // Shader Stages 405 | #pragma vertex VertexShaderWork 406 | #pragma fragment ShadeFinalColor 407 | 408 | // ------------------------------------- 409 | // Material Keywords 410 | // (all shader_feature that we needed were extracted to a shared SubShader level HLSL block already) 411 | 412 | // ------------------------------------- 413 | // Universal Pipeline keywords 414 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN 415 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 416 | #pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX 417 | #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS 418 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING 419 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION 420 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 421 | #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION 422 | #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 423 | #pragma multi_compile_fragment _ _LIGHT_LAYERS 424 | #pragma multi_compile_fragment _ _LIGHT_COOKIES 425 | #pragma multi_compile _ _FORWARD_PLUS 426 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" 427 | 428 | 429 | // ------------------------------------- 430 | // Unity defined keywords 431 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 432 | #pragma multi_compile _ SHADOWS_SHADOWMASK 433 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 434 | #pragma multi_compile _ LIGHTMAP_ON 435 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 436 | #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE 437 | #pragma multi_compile_fog 438 | #pragma multi_compile_fragment _ DEBUG_DISPLAY 439 | 440 | //-------------------------------------- 441 | // GPU Instancing 442 | #pragma multi_compile_instancing 443 | #pragma instancing_options renderinglayer 444 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl" 445 | 446 | //-------------------------------------- 447 | // Defines 448 | // - because this is an Outline pass, define "ToonShaderIsOutline" to inject outline related code into both VertexShaderWork() and ShadeFinalColor() 449 | #define ToonShaderIsOutline 450 | 451 | // ------------------------------------- 452 | // Includes 453 | // - all shader logic written inside this .hlsl, remember to write all #define BEFORE writing #include 454 | #include "SimpleURPToonLitOutlineExample_Shared.hlsl" 455 | 456 | ENDHLSL 457 | } 458 | 459 | // ShadowCaster pass. Used for rendering URP's shadowmaps 460 | Pass 461 | { 462 | Name "ShadowCaster" 463 | Tags 464 | { 465 | "LightMode" = "ShadowCaster" 466 | } 467 | 468 | // ------------------------------------- 469 | // Render State Commands 470 | // - more explicit render state to avoid confusion 471 | ZWrite On // the only goal of this pass is to write depth! 472 | ZTest LEqual // early exit at Early-Z stage if possible 473 | ColorMask 0 // we don't care about color, we just want to write depth in shadow maps, ColorMask 0 will save some write bandwidth 474 | Cull Off 475 | 476 | HLSLPROGRAM 477 | #pragma target 2.0 478 | 479 | // ------------------------------------- 480 | // Shader Stages 481 | #pragma vertex VertexShaderWork 482 | #pragma fragment AlphaClipAndLODTest // we only need to do Clip(), no need shading 483 | 484 | // ------------------------------------- 485 | // Material Keywords 486 | // - the only keywords we need in this pass = _UseAlphaClipping, which is already defined inside the SubShader level HLSLINCLUDE block 487 | // (so no need to write any extra shader_feature in this pass) 488 | 489 | //-------------------------------------- 490 | // GPU Instancing 491 | #pragma multi_compile_instancing 492 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl" 493 | 494 | // ------------------------------------- 495 | // Unity defined keywords 496 | #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE 497 | 498 | // This is used during shadow map generation to differentiate between directional and punctual light shadows, as they use different formulas to apply Normal Bias 499 | #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW 500 | 501 | //-------------------------------------- 502 | // Defines 503 | // - because it is a ShadowCaster pass, define "ToonShaderApplyShadowBiasFix" to inject "remove shadow mapping artifact" code into VertexShaderWork() 504 | #define ToonShaderApplyShadowBiasFix 505 | 506 | // ------------------------------------- 507 | // Includes 508 | // - all shader logic written inside this .hlsl, remember to write all #define BEFORE writing #include 509 | #include "SimpleURPToonLitOutlineExample_Shared.hlsl" 510 | 511 | ENDHLSL 512 | } 513 | 514 | // (X) No "GBuffer" Pass 515 | 516 | // DepthOnly pass. Used for rendering URP's offscreen depth prepass (you can search DepthOnlyPass.cs in URP package) 517 | // For example, when depth texture is on, we need to perform this offscreen depth prepass for this toon shader. 518 | Pass 519 | { 520 | Name "DepthOnly" 521 | Tags 522 | { 523 | "LightMode" = "DepthOnly" 524 | } 525 | 526 | // ------------------------------------- 527 | // Render State Commands 528 | // - more explicit render state to avoid confusion 529 | ZWrite On // the only goal of this pass is to write depth! 530 | ZTest LEqual // early exit at Early-Z stage if possible 531 | ColorMask R // we don't care about RGB color, we just want to write depth, ColorMask R will save some write bandwidth 532 | Cull Off 533 | 534 | HLSLPROGRAM 535 | #pragma target 2.0 536 | 537 | // ------------------------------------- 538 | // Shader Stages 539 | #pragma vertex VertexShaderWork 540 | #pragma fragment DepthOnlyFragment // we only need to do Clip(), no need color shading 541 | 542 | // ------------------------------------- 543 | // Material Keywords 544 | // - the only keywords we need in this pass = _UseAlphaClipping, which is already defined inside the SubShader level HLSLINCLUDE block 545 | // (so no need to write any extra shader_feature in this pass) 546 | 547 | // ------------------------------------- 548 | // Unity defined keywords 549 | #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE 550 | 551 | //-------------------------------------- 552 | // GPU Instancing 553 | #pragma multi_compile_instancing 554 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl" 555 | 556 | //-------------------------------------- 557 | // Defines 558 | // - because Outline area should write to depth also, define "ToonShaderIsOutline" to inject outline related code into VertexShaderWork() 559 | #define ToonShaderIsOutline 560 | 561 | // ------------------------------------- 562 | // Includes 563 | // - all shader logic written inside this .hlsl, remember to write all #define BEFORE writing #include 564 | #include "SimpleURPToonLitOutlineExample_Shared.hlsl" 565 | 566 | ENDHLSL 567 | } 568 | 569 | // This pass is used when drawing to a _CameraNormalsTexture texture with the forward renderer or the depthNormal prepass with the deferred renderer. 570 | // URP can generate a normal texture _CameraNormalsTexture + _CameraDepthTexture together when requested, 571 | // if requested by a renderer feature(e.g. request by URP's SSAO). 572 | Pass 573 | { 574 | Name "DepthNormalsOnly" 575 | Tags 576 | { 577 | "LightMode" = "DepthNormalsOnly" 578 | } 579 | 580 | // ------------------------------------- 581 | // Render State Commands 582 | // - more explicit render state to avoid confusion 583 | ZWrite On // the only goal of this pass is to write depth! 584 | ZTest LEqual // early exit at Early-Z stage if possible 585 | ColorMask RGBA // we want to draw normal as rgb color! 586 | Cull Off 587 | 588 | HLSLPROGRAM 589 | #pragma target 2.0 590 | 591 | // ------------------------------------- 592 | // Shader Stages 593 | #pragma vertex VertexShaderWork 594 | #pragma fragment DepthNormalsFragment // we only need to do Clip() + normal as rgb color shading 595 | 596 | // ------------------------------------- 597 | // Material Keywords 598 | // - the only keywords we need in this pass = _UseAlphaClipping, which is already defined inside the SubShader level HLSLINCLUDE block 599 | // (so no need to write any extra shader_feature in this pass) 600 | 601 | // ------------------------------------- 602 | // Universal Pipeline keywords 603 | #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT // forward-only variant 604 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" 605 | 606 | // ------------------------------------- 607 | // Unity defined keywords 608 | #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE 609 | 610 | //-------------------------------------- 611 | // GPU Instancing 612 | #pragma multi_compile_instancing 613 | #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl" 614 | 615 | //-------------------------------------- 616 | // Defines 617 | 618 | // ------------------------------------- 619 | // Includes 620 | // - all shader logic written inside this .hlsl, remember to write all #define BEFORE writing #include 621 | #include "SimpleURPToonLitOutlineExample_Shared.hlsl" 622 | 623 | ENDHLSL 624 | } 625 | 626 | // (X) No "Meta" pass 627 | // (X) No "Universal2D" pass 628 | } 629 | 630 | FallBack "Hidden/Universal Render Pipeline/FallbackError" 631 | 632 | // Custom editor is possible! We recommend checking out LWGUI(https://github.com/JasonMa0012/LWGUI) 633 | //CustomEditor "LWGUI.LWGUI" 634 | } 635 | -------------------------------------------------------------------------------- /SimpleURPToonLitOutlineExample_LightingEquation.hlsl: -------------------------------------------------------------------------------- 1 | // For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample 2 | 3 | // This file is intented for you to edit and experiment with different lighting equation. 4 | // Add or edit whatever code you want here 5 | 6 | // #pragma once is a safe guard best practice in almost every .hlsl (need Unity2020 or up), 7 | // doing this can make sure your .hlsl's user can include this .hlsl anywhere anytime without producing any multi include conflict 8 | #pragma once 9 | 10 | half3 ShadeGI(ToonSurfaceData surfaceData, ToonLightingData lightingData) 11 | { 12 | // hide 3D feeling by ignoring all detail SH (leaving only the constant SH term) 13 | // we just want some average envi indirect color only 14 | half3 averageSH = SampleSH(0); 15 | 16 | // can prevent result becomes completely black if lightprobe was not baked 17 | averageSH = max(_IndirectLightMinColor,averageSH); 18 | 19 | // occlusion (maximum 50% darken for indirect to prevent result becomes completely black) 20 | half indirectOcclusion = lerp(1, surfaceData.occlusion, 0.5); 21 | return averageSH * indirectOcclusion; 22 | } 23 | 24 | // Most important part: lighting equation, edit it according to your needs, write whatever you want here, be creative! 25 | // This function will be used by all direct lights (directional/point/spot) 26 | half3 ShadeSingleLight(ToonSurfaceData surfaceData, ToonLightingData lightingData, Light light, bool isAdditionalLight) 27 | { 28 | half3 N = lightingData.normalWS; 29 | half3 L = light.direction; 30 | 31 | half NoL = dot(N,L); 32 | 33 | half lightAttenuation = 1; 34 | 35 | // light's distance & angle fade for point light & spot light (see GetAdditionalPerObjectLight(...) in Lighting.hlsl) 36 | // Lighting.hlsl -> https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl 37 | half distanceAttenuation = min(4,light.distanceAttenuation); //clamp to prevent light over bright if point/spot light too close to vertex 38 | 39 | // N dot L 40 | // simplest 1 line cel shade, you can always replace this line by your own method! 41 | half litOrShadowArea = smoothstep(_CelShadeMidPoint-_CelShadeSoftness,_CelShadeMidPoint+_CelShadeSoftness, NoL); 42 | 43 | // occlusion 44 | litOrShadowArea *= surfaceData.occlusion; 45 | 46 | // face ignore celshade since it is usually very ugly using NoL method 47 | litOrShadowArea = _IsFace? lerp(0.5,1,litOrShadowArea) : litOrShadowArea; 48 | 49 | // light's shadow map 50 | litOrShadowArea *= lerp(1,light.shadowAttenuation,_ReceiveShadowMappingAmount); 51 | 52 | half3 litOrShadowColor = lerp(_ShadowMapColor,1, litOrShadowArea); 53 | 54 | half3 lightAttenuationRGB = litOrShadowColor * distanceAttenuation; 55 | 56 | // saturate() light.color to prevent over bright 57 | // additional light reduce intensity since it is additive 58 | return saturate(light.color) * lightAttenuationRGB * (isAdditionalLight ? 0.25 : 1); 59 | } 60 | 61 | half3 ShadeEmission(ToonSurfaceData surfaceData, ToonLightingData lightingData) 62 | { 63 | half3 emissionResult = lerp(surfaceData.emission, surfaceData.emission * surfaceData.albedo, _EmissionMulByBaseColor); // optional mul albedo 64 | return emissionResult; 65 | } 66 | 67 | half3 CompositeAllLightResults(half3 indirectResult, half3 mainLightResult, half3 additionalLightSumResult, half3 emissionResult, ToonSurfaceData surfaceData, ToonLightingData lightingData) 68 | { 69 | // [remember you can write anything here, this is just a simple tutorial method] 70 | // here we prevent light over bright, 71 | // while still want to preserve light color's hue 72 | half3 rawLightSum = max(indirectResult, mainLightResult + additionalLightSumResult); // pick the highest between indirect and direct light 73 | return surfaceData.albedo * rawLightSum + emissionResult; 74 | } 75 | -------------------------------------------------------------------------------- /SimpleURPToonLitOutlineExample_Shared.hlsl: -------------------------------------------------------------------------------- 1 | // For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample 2 | 3 | // #pragma once is a safe guard best practice in almost every .hlsl (need Unity2020 or up), 4 | // doing this can make sure your .hlsl's user can include this .hlsl anywhere anytime without producing any multi include conflict 5 | #pragma once 6 | 7 | // We don't have "UnityCG.cginc" in SRP/URP's package anymore, so: 8 | // Including the following two hlsl files is enough for shading with Universal Pipeline. Everything is included in them. 9 | // Core.hlsl will include SRP shader library, all constant buffers not related to materials (perobject, percamera, perframe). 10 | // It also includes matrix/space conversion functions and fog. 11 | // Lighting.hlsl will include the light functions/data to abstract light constants. You should use GetMainLight and GetLight functions 12 | // that initialize Light struct. Lighting.hlsl also include GI, Light BDRF functions. It also includes Shadows. 13 | 14 | // Required by all Universal Render Pipeline shaders. 15 | // It will include Unity built-in shader variables (except the lighting variables) 16 | // (https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html 17 | // It will also include many utilitary functions. 18 | #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" 19 | 20 | // Include this if you are doing a lit shader. This includes lighting shader variables, 21 | // lighting and shadow functions 22 | #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" 23 | 24 | // Material shader variables are not defined in SRP or URP shader library. 25 | // This means _BaseColor, _BaseMap, _BaseMap_ST, and all variables in the Properties section of a shader 26 | // must be defined by the shader itself. If you define all those properties in CBUFFER named 27 | // UnityPerMaterial, SRP can cache the material properties between frames and reduce significantly the cost 28 | // of each drawcall. 29 | // In this case, although URP's LitInput.hlsl contains the CBUFFER for the material 30 | // properties defined above. As one can see this is not part of the ShaderLibrary, it specific to the 31 | // URP Lit shader. 32 | // So we are not going to use LitInput.hlsl, we will implement everything by ourself. 33 | //#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" 34 | 35 | // we will include some utility .hlsl files to help us 36 | #include "NiloOutlineUtil.hlsl" 37 | #include "NiloZOffset.hlsl" 38 | #include "NiloInvLerpRemap.hlsl" 39 | 40 | // note: 41 | // subfix OS means object spaces (e.g. positionOS = position object space) 42 | // subfix WS means world space (e.g. positionWS = position world space) 43 | // subfix VS means view space (e.g. positionVS = position view space) 44 | // subfix CS means clip space (e.g. positionCS = position clip space) 45 | 46 | // all pass will share this Attributes struct (define data needed from Unity app to our vertex shader) 47 | struct Attributes 48 | { 49 | float3 positionOS : POSITION; 50 | half3 normalOS : NORMAL; 51 | half4 tangentOS : TANGENT; 52 | float2 uv : TEXCOORD0; 53 | 54 | // to support GPU instancing and Single Pass Stereo rendering(VR), add the following section 55 | UNITY_VERTEX_INPUT_INSTANCE_ID // For non PSSL, equals to -> uint instanceID : SV_InstanceID; 56 | }; 57 | 58 | // all pass will share this Varyings struct (define data needed from our vertex shader to our fragment shader) 59 | struct Varyings 60 | { 61 | float2 uv : TEXCOORD0; 62 | float4 positionWSAndFogFactor : TEXCOORD1; // xyz: positionWS, w: vertex fog factor 63 | half3 normalWS : TEXCOORD2; 64 | float4 positionCS : SV_POSITION; 65 | 66 | // to support GPU instancing and Single Pass Stereo rendering(VR), add the following section 67 | UNITY_VERTEX_INPUT_INSTANCE_ID // For non PSSL, equals to -> uint instanceID : SV_InstanceID; 68 | UNITY_VERTEX_OUTPUT_STEREO // For non OpenGL and non PSSL, equals to -> uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; (when UNITY_STEREO_INSTANCING_ENABLED) 69 | }; 70 | 71 | /////////////////////////////////////////////////////////////////////////////////////// 72 | // CBUFFER and Uniforms 73 | // (you should put all uniforms of all passes inside this single UnityPerMaterial CBUFFER! else SRP batching is not possible!) 74 | /////////////////////////////////////////////////////////////////////////////////////// 75 | 76 | // all sampler2D don't need to put inside CBUFFER 77 | sampler2D _BaseMap; 78 | sampler2D _EmissionMap; 79 | sampler2D _OcclusionMap; 80 | sampler2D _OutlineZOffsetMaskTex; 81 | 82 | // put all your uniforms(usually things inside .shader file's properties{}) inside this CBUFFER, in order to make SRP batcher compatible 83 | // see -> https://blogs.unity3d.com/2019/02/28/srp-batcher-speed-up-your-rendering/ 84 | CBUFFER_START(UnityPerMaterial) 85 | 86 | // high level settings 87 | float _IsFace; 88 | 89 | // base color 90 | float4 _BaseMap_ST; 91 | half4 _BaseColor; 92 | 93 | // alpha 94 | half _Cutoff; 95 | 96 | // emission 97 | float _UseEmission; 98 | half3 _EmissionColor; 99 | half _EmissionMulByBaseColor; 100 | half3 _EmissionMapChannelMask; 101 | 102 | // occlusion 103 | float _UseOcclusion; 104 | half _OcclusionStrength; 105 | half4 _OcclusionMapChannelMask; 106 | half _OcclusionRemapStart; 107 | half _OcclusionRemapEnd; 108 | 109 | // lighting 110 | half3 _IndirectLightMinColor; 111 | half _CelShadeMidPoint; 112 | half _CelShadeSoftness; 113 | 114 | // shadow mapping 115 | half _ReceiveShadowMappingAmount; 116 | float _ReceiveShadowMappingPosOffset; 117 | half3 _ShadowMapColor; 118 | 119 | // outline 120 | float _OutlineWidth; 121 | half3 _OutlineColor; 122 | float _OutlineZOffset; 123 | float _OutlineZOffsetMaskRemapStart; 124 | float _OutlineZOffsetMaskRemapEnd; 125 | 126 | CBUFFER_END 127 | 128 | //a special uniform for applyShadowBiasFixToHClipPos() only, it is not a per material uniform, 129 | //so it is fine to write it outside our UnityPerMaterial CBUFFER 130 | float3 _LightDirection; 131 | 132 | struct ToonSurfaceData 133 | { 134 | half3 albedo; 135 | half alpha; 136 | half3 emission; 137 | half occlusion; 138 | }; 139 | struct ToonLightingData 140 | { 141 | half3 normalWS; 142 | float3 positionWS; 143 | half3 viewDirectionWS; 144 | float4 shadowCoord; 145 | }; 146 | 147 | /////////////////////////////////////////////////////////////////////////////////////// 148 | // vertex shared functions 149 | /////////////////////////////////////////////////////////////////////////////////////// 150 | 151 | float3 TransformPositionWSToOutlinePositionWS(float3 positionWS, float positionVS_Z, float3 normalWS) 152 | { 153 | //you can replace it to your own method! Here we will write a simple world space method for tutorial reason, it is not the best method! 154 | float outlineExpandAmount = _OutlineWidth * GetOutlineCameraFovAndDistanceFixMultiplier(positionVS_Z); 155 | 156 | #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) || defined(UNITY_STEREO_DOUBLE_WIDE_ENABLED) 157 | outlineExpandAmount *= 0.5; 158 | #endif 159 | 160 | return positionWS + normalWS * outlineExpandAmount; 161 | } 162 | 163 | // if "ToonShaderIsOutline" is not defined = do regular MVP transform 164 | // if "ToonShaderIsOutline" is defined = do regular MVP transform + push vertex out a bit according to normal direction 165 | Varyings VertexShaderWork(Attributes input) 166 | { 167 | Varyings output; 168 | 169 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 170 | // after invalid/discard vertex, do this part asap. 171 | // to support GPU instancing and Single Pass Stereo rendering(VR), add the following section 172 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 173 | UNITY_SETUP_INSTANCE_ID(input); // will turn into this in non OpenGL and non PSSL -> UnitySetupInstanceID(input.instanceID); 174 | UNITY_TRANSFER_INSTANCE_ID(input, output); // will turn into this in non OpenGL and non PSSL -> output.instanceID = input.instanceID; 175 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); // will turn into this in non OpenGL and non PSSL -> output.stereoTargetEyeIndexAsRTArrayIdx = unity_StereoEyeIndex; 176 | 177 | // VertexPositionInputs contains position in multiple spaces (world, view, homogeneous clip space, ndc) 178 | // Unity compiler will strip all unused references (say you don't use view space). 179 | // Therefore there is more flexibility at no additional cost with this struct. 180 | VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS); 181 | 182 | // Similar to VertexPositionInputs, VertexNormalInputs will contain normal, tangent and bitangent 183 | // in world space. If not used it will be stripped. 184 | VertexNormalInputs vertexNormalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS); 185 | 186 | float3 positionWS = vertexInput.positionWS; 187 | 188 | #ifdef ToonShaderIsOutline 189 | positionWS = TransformPositionWSToOutlinePositionWS(vertexInput.positionWS, vertexInput.positionVS.z, vertexNormalInput.normalWS); 190 | #endif 191 | 192 | // Computes fog factor per-vertex. 193 | float fogFactor = ComputeFogFactor(vertexInput.positionCS.z); 194 | 195 | // TRANSFORM_TEX is the same as the old shader library. 196 | output.uv = TRANSFORM_TEX(input.uv,_BaseMap); 197 | 198 | // packing positionWS(xyz) & fog(w) into a vector4 199 | output.positionWSAndFogFactor = float4(positionWS, fogFactor); 200 | output.normalWS = vertexNormalInput.normalWS; //normlaized already by GetVertexNormalInputs(...) 201 | 202 | output.positionCS = TransformWorldToHClip(positionWS); 203 | 204 | #ifdef ToonShaderIsOutline 205 | // [Read ZOffset mask texture] 206 | // we can't use tex2D() in vertex shader because ddx & ddy is unknown before rasterization, 207 | // so use tex2Dlod() with an explict mip level 0, put explict mip level 0 inside the 4th component of param uv) 208 | float outlineZOffsetMaskTexExplictMipLevel = 0; 209 | float outlineZOffsetMask = tex2Dlod(_OutlineZOffsetMaskTex, float4(input.uv,0,outlineZOffsetMaskTexExplictMipLevel)).r; //we assume it is a Black/White texture 210 | 211 | // [Remap ZOffset texture value] 212 | // flip texture read value so default black area = apply ZOffset, because usually outline mask texture are using this format(black = hide outline) 213 | outlineZOffsetMask = 1-outlineZOffsetMask; 214 | outlineZOffsetMask = invLerpClamp(_OutlineZOffsetMaskRemapStart,_OutlineZOffsetMaskRemapEnd,outlineZOffsetMask);// allow user to flip value or remap 215 | 216 | // [Apply ZOffset, Use remapped value as ZOffset mask] 217 | output.positionCS = NiloGetNewClipPosWithZOffset(output.positionCS, _OutlineZOffset * outlineZOffsetMask + 0.03 * _IsFace); 218 | #endif 219 | 220 | // ShadowCaster pass needs special process to positionCS, else shadow artifact will appear 221 | //-------------------------------------------------------------------------------------- 222 | #ifdef ToonShaderApplyShadowBiasFix 223 | // see GetShadowPositionHClip() in URP/Shaders/ShadowCasterPass.hlsl 224 | // https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl 225 | float4 positionCS = TransformWorldToHClip(ApplyShadowBias(positionWS, output.normalWS, _LightDirection)); 226 | 227 | #if UNITY_REVERSED_Z 228 | positionCS.z = min(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE); 229 | #else 230 | positionCS.z = max(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE); 231 | #endif 232 | output.positionCS = positionCS; 233 | #endif 234 | //-------------------------------------------------------------------------------------- 235 | 236 | return output; 237 | } 238 | 239 | /////////////////////////////////////////////////////////////////////////////////////// 240 | // fragment shared functions (Step1: prepare data structs for lighting calculation) 241 | /////////////////////////////////////////////////////////////////////////////////////// 242 | half4 GetFinalBaseColor(Varyings input) 243 | { 244 | return tex2D(_BaseMap, input.uv) * _BaseColor; 245 | } 246 | half3 GetFinalEmissionColor(Varyings input) 247 | { 248 | half3 result = 0; 249 | if(_UseEmission) 250 | { 251 | result = tex2D(_EmissionMap, input.uv).rgb * _EmissionMapChannelMask * _EmissionColor.rgb; 252 | } 253 | 254 | return result; 255 | } 256 | half GetFinalOcculsion(Varyings input) 257 | { 258 | half result = 1; 259 | if(_UseOcclusion) 260 | { 261 | half4 texValue = tex2D(_OcclusionMap, input.uv); 262 | half occlusionValue = dot(texValue, _OcclusionMapChannelMask); 263 | occlusionValue = lerp(1, occlusionValue, _OcclusionStrength); 264 | occlusionValue = invLerpClamp(_OcclusionRemapStart, _OcclusionRemapEnd, occlusionValue); 265 | result = occlusionValue; 266 | } 267 | 268 | return result; 269 | } 270 | void DoClipTestToTargetAlphaValue(half alpha) 271 | { 272 | #if _UseAlphaClipping 273 | clip(alpha - _Cutoff); 274 | #endif 275 | } 276 | ToonSurfaceData InitializeSurfaceData(Varyings input) 277 | { 278 | ToonSurfaceData output; 279 | 280 | // albedo & alpha 281 | float4 baseColorFinal = GetFinalBaseColor(input); 282 | output.albedo = baseColorFinal.rgb; 283 | output.alpha = baseColorFinal.a; 284 | DoClipTestToTargetAlphaValue(output.alpha);// early exit if possible 285 | 286 | // emission 287 | output.emission = GetFinalEmissionColor(input); 288 | 289 | // occlusion 290 | output.occlusion = GetFinalOcculsion(input); 291 | 292 | return output; 293 | } 294 | ToonLightingData InitializeLightingData(Varyings input) 295 | { 296 | ToonLightingData lightingData; 297 | lightingData.positionWS = input.positionWSAndFogFactor.xyz; 298 | lightingData.viewDirectionWS = SafeNormalize(GetCameraPositionWS() - lightingData.positionWS); 299 | lightingData.normalWS = normalize(input.normalWS); //interpolated normal is NOT unit vector, we need to normalize it 300 | 301 | return lightingData; 302 | } 303 | 304 | /////////////////////////////////////////////////////////////////////////////////////// 305 | // fragment shared functions (Step2: calculate lighting & final color) 306 | /////////////////////////////////////////////////////////////////////////////////////// 307 | 308 | // all lighting equation written inside this .hlsl, 309 | // just by editing this .hlsl can control most of the visual result. 310 | #include "SimpleURPToonLitOutlineExample_LightingEquation.hlsl" 311 | 312 | // this function contains no lighting logic, it just pass lighting results data around 313 | // the job done in this function is "do shadow mapping depth test positionWS offset" 314 | half3 ShadeAllLights(ToonSurfaceData surfaceData, ToonLightingData lightingData) 315 | { 316 | // Indirect lighting 317 | half3 indirectResult = ShadeGI(surfaceData, lightingData); 318 | 319 | ////////////////////////////////////////////////////////////////////////////////// 320 | // Light struct is provided by URP to abstract light shader variables. 321 | // It contains light's 322 | // - direction 323 | // - color 324 | // - distanceAttenuation 325 | // - shadowAttenuation 326 | // 327 | // URP take different shading approaches depending on light and platform. 328 | // You should never reference light shader variables in your shader, instead use the 329 | // -GetMainLight() 330 | // -GetLight() 331 | // funcitons to fill this Light struct. 332 | ////////////////////////////////////////////////////////////////////////////////// 333 | 334 | //============================================================================================== 335 | // Main light is the brightest directional light. 336 | // It is shaded outside the light loop and it has a specific set of variables and shading path 337 | // so we can be as fast as possible in the case when there's only a single directional light 338 | // You can pass optionally a shadowCoord. If so, shadowAttenuation will be computed. 339 | Light mainLight = GetMainLight(); 340 | 341 | float3 shadowTestPosWS = lightingData.positionWS + mainLight.direction * (_ReceiveShadowMappingPosOffset + _IsFace); 342 | #ifdef _MAIN_LIGHT_SHADOWS 343 | // compute the shadow coords in the fragment shader now due to this change 344 | // https://forum.unity.com/threads/shadow-cascades-weird-since-7-2-0.828453/#post-5516425 345 | 346 | // _ReceiveShadowMappingPosOffset will control the offset the shadow comparsion position, 347 | // doing this is usually for hide ugly self shadow for shadow sensitive area like face 348 | float4 shadowCoord = TransformWorldToShadowCoord(shadowTestPosWS); 349 | mainLight.shadowAttenuation = MainLightRealtimeShadow(shadowCoord); 350 | #endif 351 | 352 | // Main light 353 | half3 mainLightResult = ShadeSingleLight(surfaceData, lightingData, mainLight, false); 354 | 355 | //============================================================================================== 356 | // All additional lights 357 | 358 | half3 additionalLightSumResult = 0; 359 | 360 | #ifdef _ADDITIONAL_LIGHTS 361 | // Returns the amount of lights affecting the object being renderer. 362 | // These lights are culled per-object in the forward renderer of URP. 363 | int additionalLightsCount = GetAdditionalLightsCount(); 364 | for (int i = 0; i < additionalLightsCount; ++i) 365 | { 366 | // Similar to GetMainLight(), but it takes a for-loop index. This figures out the 367 | // per-object light index and samples the light buffer accordingly to initialized the 368 | // Light struct. If ADDITIONAL_LIGHT_CALCULATE_SHADOWS is defined it will also compute shadows. 369 | int perObjectLightIndex = GetPerObjectLightIndex(i); 370 | Light light = GetAdditionalPerObjectLight(perObjectLightIndex, lightingData.positionWS); // use original positionWS for lighting 371 | light.shadowAttenuation = AdditionalLightRealtimeShadow(perObjectLightIndex, shadowTestPosWS); // use offseted positionWS for shadow test 372 | 373 | // Different function used to shade additional lights. 374 | additionalLightSumResult += ShadeSingleLight(surfaceData, lightingData, light, true); 375 | } 376 | #endif 377 | //============================================================================================== 378 | 379 | // emission 380 | half3 emissionResult = ShadeEmission(surfaceData, lightingData); 381 | 382 | return CompositeAllLightResults(indirectResult, mainLightResult, additionalLightSumResult, emissionResult, surfaceData, lightingData); 383 | } 384 | 385 | half3 ConvertSurfaceColorToOutlineColor(half3 originalSurfaceColor) 386 | { 387 | return originalSurfaceColor * _OutlineColor; 388 | } 389 | half3 ApplyFog(half3 color, Varyings input) 390 | { 391 | half fogFactor = input.positionWSAndFogFactor.w; 392 | // Mix the pixel color with fogColor. You can optionaly use MixFogColor to override the fogColor 393 | // with a custom one. 394 | color = MixFog(color, fogFactor); 395 | 396 | return color; 397 | } 398 | 399 | // only the .shader file will call this function by 400 | // #pragma fragment ShadeFinalColor 401 | half4 ShadeFinalColor(Varyings input) : SV_TARGET 402 | { 403 | // to support GPU instancing and Single Pass Stereo rendering(VR), add the following section 404 | //------------------------------------------------------------------------------------------------------------------------------ 405 | UNITY_SETUP_INSTANCE_ID(input); // in non OpenGL and non PSSL, MACRO will turn into -> UnitySetupInstanceID(input.instanceID); 406 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); // in non OpenGL and non PSSL, MACRO will turn into -> unity_StereoEyeIndex = input.stereoTargetEyeIndexAsRTArrayIdx; 407 | //------------------------------------------------------------------------------------------------------------------------------ 408 | 409 | ////////////////////////////////////////////////////////////////////////////////////////// 410 | // first prepare all data for lighting function 411 | ////////////////////////////////////////////////////////////////////////////////////////// 412 | 413 | // fillin ToonSurfaceData struct: 414 | ToonSurfaceData surfaceData = InitializeSurfaceData(input); 415 | 416 | // fillin ToonLightingData struct: 417 | ToonLightingData lightingData = InitializeLightingData(input); 418 | 419 | // apply all lighting calculation 420 | half3 color = ShadeAllLights(surfaceData, lightingData); 421 | 422 | #ifdef ToonShaderIsOutline 423 | color = ConvertSurfaceColorToOutlineColor(color); 424 | #endif 425 | 426 | color = ApplyFog(color, input); 427 | 428 | return half4(color, surfaceData.alpha); 429 | } 430 | 431 | ////////////////////////////////////////////////////////////////////////////////////////// 432 | // fragment shared functions (for ShadowCaster, DepthOnly, DepthNormalsOnly pass to use only) 433 | ////////////////////////////////////////////////////////////////////////////////////////// 434 | 435 | // copy and edit of ShadowCasterPass.hlsl 436 | void AlphaClipAndLODTest(Varyings input) 437 | { 438 | DoClipTestToTargetAlphaValue(GetFinalBaseColor(input).a); 439 | 440 | #ifdef LOD_FADE_CROSSFADE 441 | LODFadeCrossFade(input.positionCS); 442 | #endif 443 | } 444 | 445 | // copy and edit of DepthOnlyPass.hlsl 446 | half DepthOnlyFragment(Varyings input) : SV_TARGET 447 | { 448 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); 449 | 450 | AlphaClipAndLODTest(input); 451 | 452 | return input.positionCS.z; 453 | } 454 | 455 | // copy and edit of LitDepthNormalsPass.hlsl 456 | void DepthNormalsFragment( 457 | Varyings input 458 | , out half4 outNormalWS : SV_Target0 459 | #ifdef _WRITE_RENDERING_LAYERS 460 | , out float4 outRenderingLayers : SV_Target1 461 | #endif 462 | ) 463 | { 464 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); 465 | 466 | AlphaClipAndLODTest(input); 467 | 468 | #if defined(_GBUFFER_NORMALS_OCT) 469 | float3 normalWS = normalize(input.normalWS); 470 | float2 octNormalWS = PackNormalOctQuadEncode(normalWS); // values between [-1, +1], must use fp32 on some platforms 471 | float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); // values between [ 0, 1] 472 | half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); // values between [ 0, 1] 473 | outNormalWS = half4(packedNormalWS, 0.0); 474 | #else 475 | float2 uv = input.uv; 476 | #if defined(_PARALLAXMAP) 477 | #if defined(REQUIRES_TANGENT_SPACE_VIEW_DIR_INTERPOLATOR) 478 | half3 viewDirTS = input.viewDirTS; 479 | #else 480 | half3 viewDirTS = GetViewDirectionTangentSpace(input.tangentWS, input.normalWS, input.viewDirWS); 481 | #endif 482 | ApplyPerPixelDisplacement(viewDirTS, uv); 483 | #endif 484 | 485 | #if defined(_NORMALMAP) || defined(_DETAIL) 486 | float sgn = input.tangentWS.w; // should be either +1 or -1 487 | float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz); 488 | float3 normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale); 489 | 490 | #if defined(_DETAIL) 491 | half detailMask = SAMPLE_TEXTURE2D(_DetailMask, sampler_DetailMask, uv).a; 492 | float2 detailUv = uv * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw; 493 | normalTS = ApplyDetailNormal(detailUv, normalTS, detailMask); 494 | #endif 495 | 496 | float3 normalWS = TransformTangentToWorld(normalTS, half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz)); 497 | #else 498 | float3 normalWS = input.normalWS; 499 | #endif 500 | 501 | outNormalWS = half4(NormalizeNormalPerPixel(normalWS), 0.0); 502 | #endif 503 | 504 | #ifdef _WRITE_RENDERING_LAYERS 505 | uint renderingLayers = GetMeshRenderingLayer(); 506 | outRenderingLayers = float4(EncodeMeshRenderingLayer(renderingLayers), 0, 0, 0); 507 | #endif 508 | } 509 | --------------------------------------------------------------------------------