
低レベルAPIでのテクスチャビューサポート
今回のEvergineリリースでは、低レベルグラフィックスAPIにTexture Viewを第一級の概念として導入しました。Texture Viewを使用すると、テクスチャ内のサブ範囲を参照したり、ピクセルフォーマットを再解釈したり、ビュータイプを変更したりすることが、コピーを作成したり追加のGPUメモリを割り当てたりすることなく可能になります。この機能により、Evergineは最新のグラフィックスAPIと整合し、これまでパフォーマンスに影響を与えていた不要なテクスチャコピーが排除されます。
Texture Viewとは?
GPU上のテクスチャは、1D、2D、3D、キューブマップ、配列、そしてこれらの組み合わせなど、多様な形式を取ることができます。DirectX 12、Vulkan、Metal、WebGPUといった最新のグラフィックスAPIでは、テクスチャをレンダリングパイプラインに直接バインドすることはできません。代わりに、GPUがテクスチャデータをどのように解釈すべきかを記述するオブジェクトであるTexture Viewが必要となります。
Texture Viewはそれ自体のデータを持ちません。既存のテクスチャを参照し、GPUがそのデータを読み書きするためのレンズを提供します。テクスチャへの窓と考えることができます。テクスチャ全体を表示することも、その一部だけを表示することもでき、元のデータとは異なるフォーマットや構造で提示することさえ可能です。

主な機能
EvergineのTexture Viewは、主に4つの機能を提供します。
サブ範囲の選択
テクスチャからミップレベルと配列レイヤーのサブセットを選択できます。これは、baseMip、mipCount、baseLayer、layerCountの4つのパラメータによって制御されます。
例えば、3つのポイントライト(それぞれ6つのキューブ面)のシャドウマップを表す18レイヤーのTexture2DArrayがあるとします。レイヤー0~5、6~11、12~17を参照する個別のTexture Viewを作成することで、データを複製することなく、各ライトに独自のキューブマップビューを提供できます。
フォーマットの再解釈
Texture Viewは、互換性のあるフォーマットであれば、同じデータを異なるピクセルフォーマットで提示できます。例えば、R8G8B8A8_UNormとして保存されたテクスチャをR8G8B8A8_UNorm_SRgbとして表示し、ガンマ補正を適用できます。同様に、D32_Floatとして保存された深度バッファをR32_Floatとして表示し、コンピュートシェーダーが通常のfloat値として読み取れるようにできます。
ビュータイプの変更
Texture Viewは、GPUがテクスチャの構造を解釈する方法を変更できます。正確に6つのレイヤーを持つTexture2DArrayはTextureCubeとして表示でき、シェーダーはキューブマップ座標を使用してサンプリングできます。これは、ポイントライトシャドウマップや環境プローブなどのキューブベースのレンダリング技術に特に役立ちます。
デュアルバインディング
Texture Viewを使用すると、同じテクスチャからShader Resource View(読み取り用)とUnordered Access View(書き込み用)の両方を作成できます。つまり、コンピュートシェーダーがテクスチャに書き込み、ピクセルシェーダーがそれを読み取るということが、中間コピーを作成せずに可能になります。
Texture View導入前の問題点
Texture Viewが導入される前、Evergineは各テクスチャを固定のビュータイプで作成していました。例えばDirectX 11では、テクスチャは作成時にShader Resource ViewまたはUnordered Access Viewのいずれかとしてバインドされ、その選択は後から変更できませんでした。
この制限により、同じテクスチャを入力と出力の両方に使用することは不可能でした。コンピュートシェーダーがテクスチャに書き込み、その後ピクセルシェーダーがそれを読み取る必要がある場合、エンジンは2つの別々のテクスチャを維持し、それらの間でGPUコピーを実行する必要がありました。これにより、メモリ使用量が倍増し、コピー操作ごとにGPU帯域幅が消費されていました。
ポストプロセッシングパイプラインは特に影響を受け、チェーン内の各エフェクトは独自の中間テクスチャとコピー操作を必要とし、複雑なシーンでは大きなオーバーヘッドが加算されていました。

EvergineにおけるTexture Viewの活用方法
このリリースでは、エンジン内部の3つの主要領域で既にTexture Viewを適用しています。
ポストプロセッシングパイプライン
各ポストプロセッシングエフェクトは、入力テクスチャに対して適切なフォーマットのTexture Viewを作成するようになりました。フォーマットの再解釈(ToColorFormat()経由)を使用することで、パイプラインは処理ノード間で以前必要とされていた中間コピーを排除します。
トーンマッピング
トーンマッピングパスは、以前はHDR入力を読み取る前にテクスチャ全体のコピーを必要としていました。Texture Viewにより、同じテクスチャが互換性のあるフォーマットで直接参照されるようになり、コピーが完全に排除されました。
深度境界の計算
このコンピュートシェーダーは、フレーム内の最小深度値と最大深度値を計算し、カメラのニアプレーンとファープレーンを動的に調整して深度精度を維持します。深度バッファの読み取りが必要ですが、深度フォーマットはカラーデータとして直接サンプリングできません。テクスチャビューがフォーマットを再解釈し、コンピュートシェーダーが読み取れるようにします。
低レベルAPIでのテクスチャビューの使用
Evergineでのテクスチャビューの作成は簡単です。Factory.CreateTextureViewメソッドは、ソーステクスチャとビューをカスタマイズするためのオプションのパラメータを受け取ります。
TextureView CreateTextureView(
Texture texture,
PixelFormat pixelFormat = PixelFormat.Unknown,
uint baseMip = 0,
uint mipCount = uint.MaxValue,
uint baseLayer = 0,
uint layerCount = uint.MaxValue,
TextureType? viewType = null);以下に3つの実用的な例を示します。
6レイヤーの2D配列からCubeMapビューを作成
// facesTexture is a Texture2DArray with ArraySize = 6
var cubeView = gfxFactory.CreateTextureView(facesTexture, viewType: TextureType.TextureCube);コンピュートシェーダー書き込み用にガンマなしのストレージビューを作成
UAVはsRGBフォーマットをサポートしていません。
var facesTextureDesc = new TextureDescription
{
Type = TextureType.Texture2DArray,
Format = PixelFormat.R8G8B8A8_UNorm_SRgb,
Width = 1024,
Height = 1024,
ArraySize = 6,
Flags = TextureFlags.ShaderResource | TextureFlags.UnorderedAccess,
};
var facesTexture = graphicsContext.Factory.CreateTexture(ref facesTextureDesc, "Faces");
// Remove gamma for UAV compatibility
var storeView = graphicsContext.Factory.CreateTextureView(
facesTexture, pixelFormat: facesTextureDesc.Format.WithoutGamma());コンピュートシェーダー読み取り用に深度バッファを再解釈
var depthView = graphicsContext.Factory.CreateTextureView(
depthTexture, pixelFormat: PixelFormat.R32_Float);テクスチャビューは、DirectX 11、DirectX 12、Vulkan、Metal、WebGPU、OpenGLのすべてのレンダリングバックエンドにわたって実装されています。
今後の展望
このリリースは、Evergineにおけるテクスチャビューの基盤を築くものです。今後のリリースでは、エンジンのより多くの部分でその使用を拡大する予定です。
追加のレンダリングパイプラインステージでテクスチャビューを採用し、可能な限り中間コピーを排除します。
また、高レベルAPIでテクスチャビューをより広範に公開し、開発者が低レベルレイヤーを直接操作することなく、自身のプロジェクトでこの機能を簡単に活用できるようにする計画です。
まとめ
テクスチャビューは最新のグラフィックスAPIにおける基本的な概念であり、Evergineはこれを完全にサポートするようになりました。不要なテクスチャコピーを排除し、GPUメモリ使用量を削減し、追加リソースを割り当てることなく柔軟なデータ再解釈を可能にします。ポストプロセスパイプライン、トーンマッピング、深度境界計算はすでにこの機能の恩恵を受けており、今後のリリースでさらに多くのエンジンシステムが続く予定です。
Daniel Cáceres Maña – シニアリサーチャー
