「マルチプルレンダーターゲット」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
(ページの作成:「マルチレンダーターゲット(Multiple Render Target - MRT)とは、一回のシェーダー呼び出しで複数のレンダーターゲットに描画する…」)
 
 
(2人の利用者による、間の14版が非表示)
1行目: 1行目:
マルチレンダーターゲット(Multiple Render Target - MRT)とは、一回のシェーダー呼び出しで複数のレンダーターゲットに描画する機能である。
+
'''マルチプル・レンダー・ターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数の[[レンダーターゲット]]に描画する機能である。
  
MonoGameではHiDefにすると使える。
+
==対応状況==
OpenGL ES 3.0以降でも使える。
 
  
ピクセルシェーダーの戻り値を構造体にして一度に複数の色を返す感じになる。
+
*DirectX 9から使えるが、DirectX 9.0cくらいまでは対応・非対応の製品が乱立していた。
 +
**[[ATI]]製品はほとんどいけた。
 +
**[[NVIDIA]]製品はGeForce 6x00シリーズくらいから対応だと思う。
 +
**現行製品はすべて対応している。
 +
*[[MonoGame]]では「HiDef」に設定すると使える([[OpenGL]]系ではまともに動かない)。
 +
*[[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。
 +
 
 +
==概要==
 +
[[遅延レンダリング]]では「[[色]]」や「[[法線]]」、「[[深度]]」などを複数の[[レンダーターゲット]]に出力する。ならば出力先の[[レンダーターゲット]]を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
 +
 
 +
[[遅延レンダリング]]が大流行しだした時期に[[Xbox 360]]と[[PS3]]が発売した。
 +
これらには[[遅延レンダリング]]を高速化する目的でMRTが搭載された。
 +
 
 +
==メリット==
 +
[[シェーダー]]の呼び出し、いわゆる「[[Drawコール]]」が減る。
 +
 
 +
==デメリット==
 +
当然ながらMRT向けに[[シェーダー]]を書き直さなければならない。
 +
 
 +
[[COBOL]]や[[Java]]や[[PHP]]を愛する[[IT土方]]的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。この世界では「[[車輪の再発明]]だ」と批判されることであろう。
 +
 
 +
一方、ゲーム業界はそこへ突撃して「この[[ゲーム]]のここがすごい!」と宣伝材料にしようとする。なお[[ゲーム]]の面白さには一切関係ない。
 +
 
 +
彼らは相見えない。「[[プログラマー]]」と一括にはできないほど根本的な思想に違いがある。
 +
 
 +
==記述例==
 +
[[ピクセルシェーダー]]の戻り値を構造体にして一度に複数の色を返す感じになる。
 +
[[HLSL]]の記述例。
 +
<source lang=c>
 +
// 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>
 +
 
 +
[[OpenGL]]や[[OpenGL ES]]でも似たような感じである。通常はシステム予約の変数「gl_FragColor」に色を設定するが、MRTの場合は「gl_FragData」配列に各種の値を設定する。
 +
<source lang=c>
 +
    vec4 ps_c0 = vec4(0.0, 0.5, 1.0, 0.0);
 +
    gl_FragData[0] = ps_c0.xxxx;
 +
    gl_FragData[1] = ps_c0.yyyx;
 +
    gl_FragData[2] = ps_c0.zzzz;
 +
</source>
 +
 
 +
[[OpenGL ES]] 3.0(GLSL ES 3.0)では「gl_FragColor」も「gl_FragData」も廃止された。
 +
代わりにlayoutを使う。これによりgl_FragDataは問答無用でvec4の配列であり無駄が多かったのが改善された。ただHLSLのstructの方がわかりやすいね。
 +
<source lang=c>
 +
    layout (location = 0) out vec3 position;
 +
    layout (location = 1) out vec3 normal;
 +
    layout (location = 2) out vec4 color;
 +
</source>
 +
 
 +
==関連項目==
 +
* [[Rec. 709]]
 +
* [[グレースケール変換定数]]
 +
* [[MonoGameで遅延レンダリングをする]]
 +
* [[ハードウェアインスタンシング]]
 +
 
 +
[[category: コンピューター・グラフィックス]]
 +
[[category: GPU]]

2023年10月26日 (木) 07:09時点における最新版

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

対応状況[編集 | ソースを編集]

  • DirectX 9から使えるが、DirectX 9.0cくらいまでは対応・非対応の製品が乱立していた。
    • ATI製品はほとんどいけた。
    • NVIDIA製品はGeForce 6x00シリーズくらいから対応だと思う。
    • 現行製品はすべて対応している。
  • MonoGameでは「HiDef」に設定すると使える(OpenGL系ではまともに動かない)。
  • OpenGL ESではOpenGL ES 3.0以降で使える。

概要[編集 | ソースを編集]

遅延レンダリングでは「」や「法線」、「深度」などを複数のレンダーターゲットに出力する。ならば出力先のレンダーターゲットを複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。

遅延レンダリングが大流行しだした時期にXbox 360PS3が発売した。 これらには遅延レンダリングを高速化する目的でMRTが搭載された。

メリット[編集 | ソースを編集]

シェーダーの呼び出し、いわゆる「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;
}

OpenGLOpenGL ESでも似たような感じである。通常はシステム予約の変数「gl_FragColor」に色を設定するが、MRTの場合は「gl_FragData」配列に各種の値を設定する。 <source lang=c>

   vec4 ps_c0 = vec4(0.0, 0.5, 1.0, 0.0);
   gl_FragData[0] = ps_c0.xxxx;
   gl_FragData[1] = ps_c0.yyyx;
   gl_FragData[2] = ps_c0.zzzz;

</source>

OpenGL ES 3.0(GLSL ES 3.0)では「gl_FragColor」も「gl_FragData」も廃止された。 代わりにlayoutを使う。これによりgl_FragDataは問答無用でvec4の配列であり無駄が多かったのが改善された。ただHLSLのstructの方がわかりやすいね。

    layout (location = 0) out vec3 position;
    layout (location = 1) out vec3 normal;
    layout (location = 2) out vec4 color;

関連項目[編集 | ソースを編集]