ページ「コールドスペア」と「マルチプルレンダーターゲット」の間の差分

提供: MonoBook
(ページ間の差分)
ナビゲーションに移動 検索に移動
(ページの作成:「コールドスペア(英語:cold spare)とは、故障の際に使用するために電源を入れずに保管されている予備部品のことである。…」)
 
imported>Administrator
 
1行目: 1行目:
コールドスペア(英語:cold spare)とは、故障の際に使用するために電源を入れずに保管されている予備部品のことである。
+
'''マルチプルレンダーターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数のレンダーターゲットに描画する機能である。
  
主に[[サーバー]][[HDD]][[SSD]]が壊れたときの交換用であり、[[RAID]]が故障を検出したときに予備ディスクに自動でリビルドを行う「[[ホットスペア]]」に対する言葉である。
+
== 対応状況 ==
 +
* [[MonoGame]]ではHiDefに設定すると使える。
 +
* [[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。
  
部品ではなく[[サーバー]]筐体まるごとの予備品は「スペア」ではなく「[[コールドスタンバイ]]」と呼ばれることが多い。
+
== 概要 ==
 +
=== 3DテレビやVR ===
 +
[[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>
  
 
== 関連項目 ==
 
== 関連項目 ==
 +
* [[Rec. 709]]
 +
* [[グレースケール変換定数]]
  
* [[ホットスペア]]
+
[[category: コンピューターグラフィックス]]
* [[コールドスタンバイ]]
 
* [[ホットスワップ]]
 
* [[ホットプラグ]]
 

2019年9月24日 (火) 02:33時点における版

マルチプルレンダーターゲット英語:Multiple Render Target、略称:MRT)とは、一回のシェーダー呼び出しで複数のレンダーターゲットに描画する機能である。

対応状況

概要

3DテレビやVR

3DテレビVR向けに映像を出力する際には、人間の目と目の間隔分だけ微妙にカメラ視点をズラした2つの画像を出力する。つまり1フレームを表示するには「右目用」と「左目用」の2枚の画像を描くことになる。

シェーダーは「実行速度」よりも「起動速度」が段違いに遅いので呼び出す回数を減らせれば劇的に速くなる。つまりカメラの座標がちょっと違うだけなのに2回もシェーダーを回すとかまったくイケてない。

そこで出力先のレンダーターゲットテクスチャ)を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。

遅延レンダリング

遅延レンダリングでは「」や「法線」、「深度」などを複数のレンダーターゲットに出力する。

ならば出力先のレンダーターゲットを複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。

メリット

シェーダーの呼び出し、いわゆる「Drawコール」が減る。

デメリット

当然ながらMRT向けにシェーダーを書き直さなければならない。

COBOLJavaPHPを愛する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;
}

関連項目