【ゲーム制作】PNGとHDRの違いとは?|メリットデメリットと使い分けを解説

ゲーム制作

今回は、ゲーム制作でよく出てくる「PNGとHDRの違い」について解説していきます。

「HDR画像って普通の画像と何が違うの?」
「スカイボックスをPNGにしたら、なんか安っぽい…」
「ブルーム(光のにじみ)がうまく出ない…」

こんな疑問はありませんか?

PNGとHDRは用途がまったく違う画像形式です。ここを取り違えると「なぜかライティングが安っぽい」「空の色が汚い」といった、原因の分かりにくい見た目の問題につながります。

この記事を読み終えると、あなたはPNGとHDRの違い・それぞれのメリットデメリット・使い分け・初心者がハマりやすいミスをしっかり理解できると思いますので、ぜひ最後まで読んでいただけると嬉しいです。

一番の違いは「1.0より明るい色を持てるか」

結論から言うと、両者の決定的な違いはここです。

  • PNG(LDR)… 明るさの上限が決まっている。真っ白が限界
  • HDR… 明るさに上限がない。「真っ白の100倍まぶしい太陽」を表現できる

PNGは各色8bit、つまり0〜255の256段階しか持てません。プログラム上では0.0〜1.0に正規化され、1.0(真っ白)を超える値は存在できないのです。

対してHDRは32bitの浮動小数点数で色を持ちます。10.0 でも 1000.0 でも入ります。現実の太陽と紙の白は明るさが桁違いですが、その差をそのまま数値で持てるということです。

PNGとHDRの比較表

PNGHDR(.hdr / .exr)
ビット深度8bit(16bitも可)32bit 浮動小数点
明るさの上限1.0まで上限なし
ファイルサイズ小さい大きい(数倍〜十数倍)
圧縮可逆(劣化なし)形式による
透明度あり(アルファ)基本なし
主な用途UI・アイコン・アルベド環境マップ・ライティング

なぜHDRが必要なのか

「見た目が良くなる」だけではありません。計算の元データとして必要だからです。

①ブルームが正しく出る

ブルーム(強い光がにじむ表現)は、「明るすぎる部分」を抜き出してぼかす処理です。

// 1.0を超える部分だけを抽出してぼかす
float3 bright = max(color - 1.0, 0.0);

ここで元データがPNGだと、1.0を超える値が最初から存在しないので、この式の結果は常に0。つまりブルームが一切出ません。「実装したのに光らない」の正体はこれです。

②環境光(IBL)が自然になる

スカイボックスを光源として使うIBLでは、空の明るさの分布がそのままライティングになります。HDRなら「太陽の方向だけ極端に明るい」という情報が保たれるので、影の出方が自然になります。

PNGだと太陽も空も「ほぼ白」で潰れてしまい、のっぺりした均一な光になります。これが「安っぽく見える」原因です。

③露出調整に耐えられる

HDRは明るさの情報を余分に持っているので、後から露出を下げても白飛びした部分に絵が残っています。PNGは潰れた時点で情報が消えているため、暗くしても灰色になるだけです。

使い分けの基準

迷ったら、「光そのものを表すか、色を表すか」で考えると外しません。

  • PNGでよいもの… UI、アイコン、フォント、アルベド(基本色)、法線マップ
  • HDRを使うもの… スカイボックス、環境マップ、IBL用ライトプローブ

キャラクターのテクスチャを全部HDRにする必要はありません。「光源として使う画像だけHDR」で十分です。容量的にもそれが現実的です。

【重要】私が実際にPNGとHDRで困った体験談

自作エンジンでブルームを実装したとき、コードは合っているはずなのに、光が一切にじまないという状態で半日溶かしました。

シェーダを何度見直しても間違いが見つからない。原因はスカイボックスにPNGを使っていたことでした。1.0を超える画素が存在しないので、抽出処理の結果が毎回まっさら。実装ではなく素材の問題だったわけです。HDRに差し替えた瞬間、狙いどおり太陽がにじみました。

もう一つ。夕焼けのグラデーションをPNGのスカイボックスにしたとき、空に縞模様(バンディング)が出たことがあります。8bitでは滑らかなグラデーションを表現しきれず、色の段差が見えてしまうんです。これもHDRにしたら消えました。

PNG・HDR使用時のよくある失敗例と対処法

①スカイボックスにPNGを使う

体験談のとおり、ブルームが出ない・バンディングが出る原因になります。光源として使う画像はHDRにしましょう。

②トーンマッピングを忘れる

HDRのまま画面に出すと真っ白に飛びます。ディスプレイは0〜1しか表示できないため、最後にトーンマッピングで1.0の範囲へ圧縮する工程が必要です。

③何でもHDRにして容量を圧迫する

HDRはPNGの数倍〜十数倍のサイズです。UIやアイコンまでHDRにすると、ロード時間もVRAMも無駄に食います。必要な場所だけに使いましょう。

注意点

  • HDRは光源として使う画像に限定するのが現実的
  • HDRを使うならトーンマッピングまでセットで実装する
  • PNGは透明度が使えるのが強み。UIはPNG一択

まとめ

  • PNGは1.0(真っ白)が上限、HDRは上限なし
  • ブルームやIBLは1.0超えの情報がないと成立しない
  • UI・アルベドはPNG、スカイボックス・環境マップはHDR
  • HDRは容量が大きいので使いどころを絞る

「光らない」「安っぽい」の原因が実装ではなく素材側だった、というのはよくある話です。ライティング周りで詰まったら、まず使っている画像形式を疑ってみてください。

関連記事