浮動小数点テクスチャについて
浮動小数点テクスチャを扱う際に初心者がつまずくこと
(初心者が浮動小数点テクスチャを使うとは言っていない)
@kyasbal_1994 (石井 翔)
浮動小数点テクスチャの利用手法1
• CPU書き込み+GPU読み込み
• シェーダーリソースとして浮動小数点テクスチャを用いるとき
• CPU側でテクスチャに書き込んでGPU側で用いる際
• 用途: スキニング用の行列配列を渡す場合など
• gl.getExtension(”OES_texture_float”)がnull以外を返せば使用可能
浮動小数点テクスチャの利用手法2
• GPU書き込みを伴う場合
• フレームバッファーに浮動小数点テクスチャをアタッチするとき
• GPU側でテクスチャに書き込む。(CPU側でさらに読み込みが必要なケースも
含む)
• 用途: G-Buffer、数値的なシミュレーション等
• gl.getExtension(“OES_texture_float”)でnull以外を返せばOK….ではない。
WEBGL_color_buffer_float
• 実は浮動小数点テクスチャの書き込みに関しては別のGL拡張
• これで晴れてgl.getExtension(“WEBGL_color_buffer_float”)がnullじゃな
かったら使える
• この拡張をサポートしてても、これがnullを返す場合がある。
(と言うかこれがnull以外を返すケースを見たことがない)
….わけではない。
WEBGL_color_buffer_float
• 一度テクスチャ作って、FBOとバインドして、ステータスを見てみるし
かない。
WEBGL_color_buffer_float
• 一度テクスチャ作って、FBOとバインドして、ステータスを見てみるし
かない。
こんな仕様おかしいよ!
こんな仕様おかしいよ!
浮動小数点テクスチャが描画対象として、
利用できない時は…?
• UBYTEのRGBAテクスチャに落とし込むしかない。
• どうパッキングするか?
• 格納する小数を以下の2パターンに分類する
• その小数のとりうる最大値、最小値がわかっている時(今日はここだけ)
• どうしても浮動小数がいい時(IEEE 754に無理やり丸める)
最大値、最小値がわかっている時
• 事実上の256進数として各ベクトルの要素を用いて表現して格納する。
最大値、最小値がわかっている時
• 普通に各要素から復元する。
最大値、最小値がわかっている時
• 32bit分必要ない時は、ベクトルの長さを変えて16,24bit分でも格納する
のは容易
• パッキングとアンパッキングが比較的高速
• N bit用いる時の最大数値誤差は最小値から最大値まで均等に分布し、
以下のように表される。
𝜖 𝑁 =
1
2 𝑁 − 1
(𝑀𝑎𝑥 − 𝑀𝑖𝑛)
最大値最小値を理論的に求める
(時間が余った時用)
• 例えば、ある法線の圧縮の計算式(|𝕟 𝑥𝑦𝑧| = 1を仮定)は以下のように表
せる
𝕖 𝑥𝑦 =
𝕟 𝑥𝑦
8𝕟 𝑧 + 8
+
1
2
,
1
2
(CryEngineが採用している法線圧縮方式)
• ただし、(0,0,-1)は除外点
(ビュー空間の時、(0,0,-1)は映らない位置にあるため)
• これの最大値、最小値は高校数学ぐらいの知識で求まる。
最大値最小値を理論的に求める
(時間が余った時用)
𝕟 𝑧 = 𝑘とおく
𝑘2 + 𝕟 𝑥
2
+ 𝕟 𝑦
2
= 1
∴ 𝕟 𝑥
2 + 𝕟 𝑦
2 = 1 − 𝑘2
− 1 − 𝑘2 < 𝕟 𝑥, 𝕟 𝑦 < 1 − 𝑘2
𝕖 𝑥𝑦 =
𝕟 𝑥𝑦
8𝑘+8
+
1
2
,
1
2
𝕖 𝑥 =
𝕟 𝑥
8𝑘+8
+
1
2
∵ 𝕟 𝑥と𝕟 𝑦は独立
𝕟 𝑥 = 2𝕖 𝑥 + 1 2 𝑘 + 1
𝕖 𝑥𝑦 =
𝕟 𝑥𝑦
8𝕟 𝑧 + 8
+
1
2
,
1
2
最大値最小値を理論的に求める
(時間が余った時用)
− 1 − 𝑘2 < 2𝕖 𝑥 − 1 2 1 + 𝑘 < 1 − 𝑘2
−2 2 1 + 𝑘 2 1 − 𝑘 +
1
2
< 𝕖 𝑥 < 2 2 1 + 𝑘 2 1 − 𝑘 +
1
2
𝛿
𝛿𝑘
2 1 + 𝑘 2 1 − 𝑘 =
2
− 𝑘−1 𝑘+1 2 3𝑘2
+ 2𝑘 − 1
𝕖 𝑥𝑦 =
𝕟 𝑥𝑦
8𝕟 𝑧 + 8
+
1
2
,
1
2
k=1/3の時、最大、最小となり、求めたい値の最大値、最
小値はkに1/3を入れて計算したもの。 → UBYTEテクス
チャに先ほどの式でパッキングできる。

More Related Content

KEY
Cocos2dx tips
PDF
まだCPUで消耗してるの?Jubatusによる近傍探索のGPUを利用した高速化
PDF
Jubatus 新機能ハイライト
PPTX
"アレ"からJubatusを使う
PPTX
Summer camp2018 group2
PPTX
Summercamp2020 group3
PDF
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
PPT
2007 03 17_osc2007spring_02
Cocos2dx tips
まだCPUで消耗してるの?Jubatusによる近傍探索のGPUを利用した高速化
Jubatus 新機能ハイライト
"アレ"からJubatusを使う
Summer camp2018 group2
Summercamp2020 group3
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
2007 03 17_osc2007spring_02

What's hot (20)

PDF
Summer camp2019 group2
PDF
mrubyのfiberを試してみた
PPT
Wm勉強会@関西#1
PPTX
EC2クラスタインスタンス使ってみました!
PDF
Hyperlapse for Azure Media Servicesを本気で使ってみた
PDF
ここから始めましょう、イチからーーいいえ、Cosmosから!
PDF
Uguisudani
PDF
ML Studio / CNTK ハンズオン資料の紹介と開発環境の構築手順
PPTX
PasQポスター
PDF
地球地図を利用した地図タイルの作成 - FOSS4G TOKYO 2014 全体セッション2
PDF
「Windows Azureで HPC 」 for JAZUG 2013年9月
PDF
20180801 ガチラボ vol.7
PDF
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
PDF
Debianでタイルマップサービスを作ってみた
PDF
3dsMaxとAway3Dによるキャラクターアニメーション作成
PDF
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
PDF
Omochi-Renderer2@レイトレ合宿3!!! - お餅
PDF
Fabric + Amazon EC2で快適サポート生活 #PyFes
PDF
20130316 JAWS DAYS 美人CDP+
PPTX
AWSではじめるお手軽オンラインゲーム開発
Summer camp2019 group2
mrubyのfiberを試してみた
Wm勉強会@関西#1
EC2クラスタインスタンス使ってみました!
Hyperlapse for Azure Media Servicesを本気で使ってみた
ここから始めましょう、イチからーーいいえ、Cosmosから!
Uguisudani
ML Studio / CNTK ハンズオン資料の紹介と開発環境の構築手順
PasQポスター
地球地図を利用した地図タイルの作成 - FOSS4G TOKYO 2014 全体セッション2
「Windows Azureで HPC 」 for JAZUG 2013年9月
20180801 ガチラボ vol.7
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
Debianでタイルマップサービスを作ってみた
3dsMaxとAway3Dによるキャラクターアニメーション作成
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
Omochi-Renderer2@レイトレ合宿3!!! - お餅
Fabric + Amazon EC2で快適サポート生活 #PyFes
20130316 JAWS DAYS 美人CDP+
AWSではじめるお手軽オンラインゲーム開発
Ad

More from 翔 石井 (10)

PDF
WebでのARには ハードル(闇)がいっぱいある話
PDF
Emscripten night "WebGL + WASM"
PDF
DotsLT AA Overview
PDF
Grimoire.js Community announcement June 20 2016
PPTX
jThree community kickoff
PPTX
jThree announcment 4-24
PPTX
jThree 0.10 alpha release
PPTX
チョコ溶かす奴
PPTX
Dynamic lighting and dropping shadow in WebGL
PPTX
Efficacy of deferred rendering in WebGL
WebでのARには ハードル(闇)がいっぱいある話
Emscripten night "WebGL + WASM"
DotsLT AA Overview
Grimoire.js Community announcement June 20 2016
jThree community kickoff
jThree announcment 4-24
jThree 0.10 alpha release
チョコ溶かす奴
Dynamic lighting and dropping shadow in WebGL
Efficacy of deferred rendering in WebGL
Ad

WebGLで浮動小数点テクスチャを扱う話