This is the documentation for Enlighten.

10.4. GLES2 のイラディアンス出力

このページでは、OpenGL ES デバイスでイラディアンス出力形式が決定される方法を説明します。アプリケーションで使用されるイラディアンス出力形式は、ターゲット デバイスがサポートする OpenGL ES 2.0 テクスチャ形式により決まります。つまり、実装されている OpenGL ES 2.0 拡張機能に依存しています。

非圧縮イラディアンス出力

Enlighten の非圧縮イラディアンス出力形式は、GL_OES_texture_half_float の実装により半精度浮動小数点テクスチャをサポートするデバイスで使用できます。ただし、イラディアンス テクスチャをシェーダーでサンプリングする際、バイリニア フィルタリングを適用する必要があります。これは、デバイスが GL_OES_texture_half_float_linear 拡張機能を実装している場合に、テクスチャの縮小および拡大フィルターを GL_LINEAR に設定し、頂点シェーダーから渡される補間されたイラディアンス マップ テクスチャの座標を使用して、フラグメント シェーダーでサンプリングすることにより実現できます。

デバイスが半精度浮動小数点テクスチャをサポートしていても、GL_OES_texture_half_float_linear を実装していない場合、イラディアンス出力テクスチャの縮小と拡大フィルターを GL_NEAREST に設定し、シェーダーで「手動の」バイリニア フィルタリングを行う必要があります。これは主に、3 つの依存テクスチャの読み取りが追加で必要になるために、レンダリング パフォーマンスに明らかな影響を及ぼします。

圧縮イラディアンス出力

半精度浮動小数点テクスチャをサポートしていないデバイスの場合、Enlighten の圧縮 LRB イラディアンス出力形式を使用できます。この出力形式は、タイプ GL_UNSIGNED_BYTE の GL_RGBA 形式テクスチャを使用して、イラディアンスを 16 ビットの輝度値と 8 ビットの正規化された赤および青の値として格納します。この形式は、半精度浮動小数点テクスチャの場合よりもテクスチャ帯域幅の消費が低く、OpenGL ES 2.0 拡張機能なしでバイリニア フィルタリングが可能です。ただし、イラディアンス値をデコードする必要があり、追加のシェーダーの指示が必要です。一部のモバイル GPU はエンコードされたイラディアンスを正しい精度で補間しないため、バンディング アーティファクト発生の可能性があることに注意が必要です (以下のスクリーンショットを参照)。アプリケーションにこれらのアーティファクトが見られる場合、GL_NEAREST を使用してテクスチャの縮小と拡大を行い、シェーダーで「手動の」バイリニア フィルタリングを行うこともできます。

GeoMobileDemo には、既定のデバイスの能力に応じて、圧縮および非圧縮イラディアンス出力形式を使用するためのアプリケーションおよびシェーダー コードの例があります。

このページでは、OpenGL ES デバイスでイラディアンス出力形式が決定される方法を説明します。アプリケーションで使用されるイラディアンス出力形式は、ターゲット デバイスがサポートする OpenGL ES 2.0 テクスチャ形式により決まります。つまり、実装されている OpenGL ES 2.0 拡張機能に依存しています。

非圧縮イラディアンス出力

Enlighten の非圧縮イラディアンス出力形式は、GL_OES_texture_half_float の実装により半精度浮動小数点テクスチャをサポートするデバイスで使用できます。ただし、イラディアンス テクスチャをシェーダーでサンプリングする際、バイリニア フィルタリングを適用する必要があります。これは、デバイスが GL_OES_texture_half_float_linear 拡張機能を実装している場合に、テクスチャの縮小および拡大フィルターを GL_LINEAR に設定し、頂点シェーダーから渡される補間されたイラディアンス マップ テクスチャの座標を使用して、フラグメント シェーダーでサンプリングすることにより実現できます。

デバイスが半精度浮動小数点テクスチャをサポートしていても、GL_OES_texture_half_float_linear を実装していない場合、イラディアンス出力テクスチャの縮小と拡大フィルターを GL_NEAREST に設定し、シェーダーで「手動の」バイリニア フィルタリングを行う必要があります。これは主に、3 つの依存テクスチャの読み取りが追加で必要になるために、レンダリング パフォーマンスに明らかな影響を及ぼします。

圧縮イラディアンス出力

半精度浮動小数点テクスチャをサポートしていないデバイスの場合、Enlighten の圧縮 LRB イラディアンス出力形式を使用できます。この出力形式は、タイプ GL_UNSIGNED_BYTE の GL_RGBA 形式テクスチャを使用して、イラディアンスを 16 ビットの輝度値と 8 ビットの正規化された赤および青の値として格納します。この形式は、半精度浮動小数点テクスチャの場合よりもテクスチャ帯域幅の消費が低く、OpenGL ES 2.0 拡張機能なしでバイリニア フィルタリングが可能です。ただし、イラディアンス値をデコードする必要があり、追加のシェーダーの指示が必要です。一部のモバイル GPU はエンコードされたイラディアンスを正しい精度で補間しないため、バンディング アーティファクト発生の可能性があることに注意が必要です (以下のスクリーンショットを参照)。アプリケーションにこれらのアーティファクトが見られる場合、GL_NEAREST を使用してテクスチャの縮小と拡大を行い、シェーダーで「手動の」バイリニア フィルタリングを行うこともできます。

GeoMobileDemo には、既定のデバイスの能力に応じて、圧縮および非圧縮イラディアンス出力形式を使用するためのアプリケーションおよびシェーダー コードの例があります。