えちょ記

語らないブログ

メモ・星空HDR

とりあえず実装があるわけでもないのでメモ。何とかできるかなと思ってとりあえず挫折感を味わったところでメモ。

星の光の差

星の等級表現は、5級の差で絶対光度が100倍の差が付くような指数表現になってます。一方、sRGB表現では、8bitの場合、最大光度1.0に対して最少光度は(1/255)^(2.2)=0.0000050770519、等級表現に直したら、んーと、
log( ( 1/ (1/( (2^8)-1 ))^2.2 ) )x2.5 = 13.235971
えーと、約13等級差までは1ドットの点で一応表現できる、と。

星の光の大きさ

計算上、星の視野角は無視できるほど小さく、完全な点光源です。原則としてどんなに明るくても1ドット以上にはなりません。また、大きさのない光源であるため、ディスプレイ上の1ドット内に2つの星が入るような場合、そのドットにおける光度は事実上単純加算で計算して差し支えありません。

天の川を真面目に計算する

天の川は実際には弱光度の点光源の集まりです。個々の星は視認限界以下(6等星)のため見えませんが、何せ数があるため、光度加算の結果ぼやけた川として視認されます。
通常は実際にぼやけた画像を張り付けて表現しますが、ティコ第二星表当たりの星のカタログ(約250万個)データを利用すれば、点集合として天の川を表現することが理論的には可能です。

8bitでは足りないのよ

単純加算計算をする場合、誤差を避けるためにはガンマ補正なし(1.0)の固定小数点値として加算処理を行うのが最も妥当です。この場合、8bitでは等級差で6.01であり、最少光度を1にしても最も明るい星で余裕で桁あふれしちゃう。16bitでも厳しく、32bitならたぶん余裕。メモなので適当だけどきっと余裕。

点で絶対光度を求めてから光を溢れさせたい

極論では、太陽まで含めて全部点光源として各ドットの絶対光度を求め、その値をブラー効果などを使って光溢れ処理を突っ込んだうえで最終映像にするのが理想。そうすればある程度以上の光度の星は勝手にドットが大きくなるし、暗い星でも250万個の力技があれば加算効果で天の川が勝手に表現される。太陽込みでHDRに落とせばきっとダイヤモンドリングが見れる。そしてCelestiaにはHDR拡張が入ってるとのことなので調査してみた。

露出補正はいらないのよー

そして挫折に戻る。欲しいのは光あふれ効果であって露出補正ではないのよー。そして露出補正が入っても星が消えちゃうのはだめなのよー。ギラギラとカスミが同居した画像が欲しいのよ、ギラギラふわふわ。というところで今日は投了。ぬううううん。

補足

ん、32bitの時の最大等級差を真面目に計算してみる
log( 1/( (1/( (2^32)-1))^1.0 ) )x2.5 = 24.0823997
‥‥えーと、太陽が-26.7等級。‥‥はっ、さすがに太陽は特別扱いじゃないとだめだだだだ!太陽以外だと金星が-4.7だから、んー、19等星で1になる位の計算なら何とか‥‥。暗い順に加算すればfloatでも誤差は消えるけどね。