😺

Unity URP 炎シェーダの作り方|HLSLで揺らぎと発光を表現する完全ガイド【WebGL対応】

に公開

Unity URP 炎シェーダの作り方|HLSLで揺らぎと発光を表現する完全ガイド【WebGL対応】

Unity URP環境で「リアルな炎」をHLSLシェーダで表現する方法を詳しく解説します。
ゆらぎ表現、Radial Shear、Emission制御に加え、WebGLでの表示エラー「ピンク表示」の原因と対策まで紹介。
個人開発者による実体験をもとに、初めてでも再現できる内容にまとめました。


第1章:Unity URPでHLSLによる炎シェーダの基礎設計

Unity URPでリアルな炎シェーダを作るために取り入れた技術要素を紹介します。

ノイズを用いたゆらぎの実装(Gradient Noise)

炎の自然な揺らぎを再現するため、Gradient Noiseを使ってノイズパターンを生成。
frac(sin(dot(...)))を用いたハッシュ関数ベースで実装しています。

UVのRadial Shearによる歪み表現

炎が上昇するような錯覚を与えるために、UVを時間軸に沿ってラジアル方向に変形させています。

EmissionとColor制御による発光表現

中心部の発光は、EmissionMap・EmissionColor・強度の3要素で制御し、Bloom効果も狙っています。

アルファカットとレイヤー合成

炎の外縁を自然に見せるために、アルファマスクとStep関数を活用してグラデーション状に合成。


第2章:HLSL実装コードと構成解説

ここでは実際のShaderコードの構成と処理の流れを紹介します。

主要処理コード

float Hash_LegacyMod(float2 uv)
{
    return frac(sin(dot(uv, float2(12.9898, 78.233))) * 43758.5453);
}

処理の流れ

  • UVにRadial Shearを適用
  • ノイズ2種を掛け合わせて炎の揺らぎを演出
  • 発光・アルファ値を計算し最終合成
  • EmissionMapを元に発光処理

図1: Shader処理フロー図


第3章:Unity上での実演と成果

実際にUnityで再生した様子をGIFでキャプチャしました。

[図2: 炎シェーダの実演]@gist

  • 中央が明るく、周囲がゆらいでいる炎の表現
  • 揺らぎと歪みの連動
  • Alpha Clipによる自然な透明表現

第4章:WebGLビルドでのピンクエラー原因と対策

WebGLで「ピンクの正方形」しか表示されない問題に直面しました。

エラー内容

WebGL: INVALID_ENUM: getInternalformatParameter: invalid internalformat

原因と仮説

  • URPのHDR設定で RGBAHalf を使っていた → WebGL未対応
  • Renderer FeatureでBloomが有効だった → WebGLと非互換
  • カスタムShaderに不正な型 or 命令が含まれていた

![図3: ピンクエラー表示例]


第5章:今後の対応と改善方針

Shader Graph版への移植

より柔軟に調整しやすく、WebGL対応もしやすいためShader Graph化を検討中。

軽量版の別バリアント追加

Shader Model 2.0 / GLES2.0対応を考慮し、次回はより互換性の高いバージョンも制作予定。

#pragma target 2.0
#pragma only_renderers gles gles3

第6章:おわりに|炎シェーダ制作のまとめ

本記事では、Unity URPでHLSLを使った炎シェーダの設計と実装、さらにWebGLへの展開と課題までを紹介しました。

  • ノイズ・歪み・発光の3要素でリアルな炎表現を再現
  • 実演GIF付きでシェーダの動きを視覚的に確認
  • WebGLの落とし穴と対策を開発者目線で共有

関連リンク


著者について

Unity・Blender・Shader技術を用いた開発と自動化に興味のあるフリーランスエンジニア。
未経験から炎シェーダを開発し、公開まで行った過程を記事化しました。

Discussion