「マルチプルレンダーターゲット」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (ページの作成:「マルチレンダーターゲット(Multiple Render Target - MRT)とは、一回のシェーダー呼び出しで複数のレンダーターゲットに描画する…」) |
imported>Administrator 細 (Administrator がページ「マルチレンダーターゲット」を「マルチプルレンダーターゲット」に移動しました) |
||
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | + | '''マルチプルレンダーターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数のレンダーターゲットに描画する機能である。 | |
− | + | == 対応状況 == | |
− | OpenGL ES 3. | + | * [[MonoGame]]ではHiDefに設定すると使える。 |
+ | * [[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。 | ||
− | + | == 概要 == | |
+ | === 3D === | ||
+ | [[3Dテレビ]]や[[VR]]向けに映像を出力する際には、人間の目と目の間隔分だけ微妙にカメラ視点をズラした2つの画像を出力する。つまり1フレームを表示するには「右目用」と「左目用」の2枚の画像を描くことになる。 | ||
+ | |||
+ | [[シェーダー]]は「実行速度」よりも「起動速度」が段違いに遅いので呼び出す回数を減らせれば劇的に速くなる。つまりカメラの座標がちょっと違うだけなのに2回もシェーダーを回すとかまったくイケてない。 | ||
+ | |||
+ | そこで出力先の[[レンダーターゲット]]([[テクスチャ]])を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。 | ||
+ | |||
+ | === 遅延レンダリング === | ||
+ | [[遅延レンダリング]]では「[[色]]」や「[[法線]]」、「[[深度]]」などを複数の[[レンダーターゲット]]に出力する。 | ||
+ | |||
+ | ならば出力先の[[レンダーターゲット]]を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。 | ||
+ | |||
+ | == メリット == | ||
+ | シェーダーの呼び出し、いわゆる「Drawコール」が減る。 | ||
+ | |||
+ | == デメリット == | ||
+ | 当然ながらMRT向けに[[シェーダー]]を書き直さなければならない。 | ||
+ | |||
+ | [[COBOL]]や[[Java]]や[[PHP]]を愛する[[IT土方]]的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。 | ||
+ | |||
+ | 一方、ゲーム業界はそこへ突撃して「このゲームのここがすごい!」と宣伝材料にしようとする。 | ||
+ | |||
+ | 彼らは相見えない。「[[プログラマー]]」と一括にはできないほど根本的な思想に違いがある。 | ||
+ | |||
+ | == 記述例 == | ||
+ | [[ピクセルシェーダー]]の戻り値を構造体にして一度に複数の色を返す感じになる。 | ||
+ | HLSLの記述例。 | ||
+ | <source> | ||
+ | // Rec. 709グレースケール変換定数 | ||
+ | const float3 luma = float3(0.2126, 0.7152, 0.0722); | ||
+ | |||
+ | // ピクセルシェーダー出力 | ||
+ | struct PS_OUTPUT | ||
+ | { | ||
+ | float4 rgba:COLOR0; //RendarTargetの0番目に出力 | ||
+ | float4 gray:COLOR1; //RendarTargetの1番目に出力 | ||
+ | }; | ||
+ | |||
+ | // ピクセルシェーダー本体 | ||
+ | // 一般的なピクセルシェーダーの戻り値はRGBAを表す「float4」だが、 | ||
+ | // マルチプルレンダーターゲットでは構造体で複数の色を返す。 | ||
+ | PS_OUTPUT psMain( float2 texCoord:TEXCOORD ) | ||
+ | { | ||
+ | PS_OUTPUT psout; | ||
+ | |||
+ | // そのまま出力 | ||
+ | float4 color = tex2D(ScreenTexSampler,texCoord); | ||
+ | psout.rgba = color; | ||
+ | |||
+ | // グレースケールに変換して出力 | ||
+ | float gray = dot(color.rgb, luma); | ||
+ | psout.gray = float4(gray,gray,gray,1); | ||
+ | |||
+ | return psout; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == 関連項目 == | ||
+ | |||
+ | [[category: コンピューターグラフィックス]] |
2019年9月24日 (火) 01:45時点における版
マルチプルレンダーターゲット(英語:Multiple Render Target、略称:MRT)とは、一回のシェーダー呼び出しで複数のレンダーターゲットに描画する機能である。
対応状況
- MonoGameではHiDefに設定すると使える。
- OpenGL ESではOpenGL ES 3.0以降で使える。
概要
3D
3DテレビやVR向けに映像を出力する際には、人間の目と目の間隔分だけ微妙にカメラ視点をズラした2つの画像を出力する。つまり1フレームを表示するには「右目用」と「左目用」の2枚の画像を描くことになる。
シェーダーは「実行速度」よりも「起動速度」が段違いに遅いので呼び出す回数を減らせれば劇的に速くなる。つまりカメラの座標がちょっと違うだけなのに2回もシェーダーを回すとかまったくイケてない。
そこで出力先のレンダーターゲット(テクスチャ)を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
遅延レンダリング
遅延レンダリングでは「色」や「法線」、「深度」などを複数のレンダーターゲットに出力する。
ならば出力先のレンダーターゲットを複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
メリット
シェーダーの呼び出し、いわゆる「Drawコール」が減る。
デメリット
当然ながらMRT向けにシェーダーを書き直さなければならない。
COBOLやJavaやPHPを愛するIT土方的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。
一方、ゲーム業界はそこへ突撃して「このゲームのここがすごい!」と宣伝材料にしようとする。
彼らは相見えない。「プログラマー」と一括にはできないほど根本的な思想に違いがある。
記述例
ピクセルシェーダーの戻り値を構造体にして一度に複数の色を返す感じになる。 HLSLの記述例。
// Rec. 709グレースケール変換定数
const float3 luma = float3(0.2126, 0.7152, 0.0722);
// ピクセルシェーダー出力
struct PS_OUTPUT
{
float4 rgba:COLOR0; //RendarTargetの0番目に出力
float4 gray:COLOR1; //RendarTargetの1番目に出力
};
// ピクセルシェーダー本体
// 一般的なピクセルシェーダーの戻り値はRGBAを表す「float4」だが、
// マルチプルレンダーターゲットでは構造体で複数の色を返す。
PS_OUTPUT psMain( float2 texCoord:TEXCOORD )
{
PS_OUTPUT psout;
// そのまま出力
float4 color = tex2D(ScreenTexSampler,texCoord);
psout.rgba = color;
// グレースケールに変換して出力
float gray = dot(color.rgb, luma);
psout.gray = float4(gray,gray,gray,1);
return psout;
}