私はDirectX 11のHLSLを学んでいますが、Vertex Shaderの出力であるSV_POSITIONとPixel Shaderの入力を正確に知りたいと思っていました。DirectX 11 Pixel Shader SV_POSITIONとは何ですか?
1:画面上のすべてのピクセルまたはオブジェクトのx、y、zですか?
2:なぜそれが4 32bit浮動ですか?
3:頂点出力にこのシステム変数が必要ですか?
ありがとうございました!
私はDirectX 11のHLSLを学んでいますが、Vertex Shaderの出力であるSV_POSITIONとPixel Shaderの入力を正確に知りたいと思っていました。DirectX 11 Pixel Shader SV_POSITIONとは何ですか?
1:画面上のすべてのピクセルまたはオブジェクトのx、y、zですか?
2:なぜそれが4 32bit浮動ですか?
3:頂点出力にこのシステム変数が必要ですか?
ありがとうございました!
頂点シェーダステージには、頂点の位置という1つの必要な出力しかありません。この値は、固定ピクセルラスタライザによってどのピクセルが描画されているかを計算し、ピクセルシェーダを呼び出すために使用されます。システム値意味SV_Position
は、頂点シェーダの出力上でそれを示しています。ピクセルシェーダは、実際には入力としてピクセル位置を取得する必要はありませんが、それが有用な場合は可能です。入力レイアウトは、SV_Position
セマンティックを使用する頂点シェーダの位置も持っていなければなりません。典型的には、設定
Aは:
SV_Position
として示さワールド空間における頂点の位置を記載しています。入力レイアウトは、データの書式を記述します。例えば:必要に応じて同様にインデックスバッファを使用して、頂点バッファから入力されたレイアウトによってデコードされるよう
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
頂点シェーダの入力は、入力アセンブラからの情報を受信します。位置がどのようなフォーマットであっても、通常はシェーダが使用するためにfloat
に変換されます。
頂点シェーダは出力頂点位置を生成する必要があります(SV_Position
)。これは、(-1, -1)
から(1, 1)
の範囲の正規化された座標におけるピクセルの(x, y)
の位置です。 z
は、正規化された範囲0
〜1
の深さ位置(深度バッファに使用される)です。例えば
:
float4 VS(float4 Pos : SV_Position) : SV_Position
{
return Pos;
}
ピクセルシェーダは、任意の位置をとることができるが、それは必要がありません。 (x,y)
はピクセル座標です。頂点出力( 'クリップ空間')は、D3D11_VIEWPORT
で提供されたビューポート状態を使用してピクセルに変換されます。
ピクセルシェーダは、SV_Target
とマークされたfloat4
の結果を生成する必要があります。例えば
:
// We can omit the position
float4 PS() : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
// Or you can take it as input if that's helpful
float4 PS(float4 Pos : SV_Position) : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
技術頂点シェーダは、入力として位置を取る必要はありません。 Shader Model 4.0以上のハードウェアでは、SV_VertexId
を使用して、入力レイアウト、頂点バッファ、またはインデックスバッファをまったく使用しない、次のようなコードで頂点シェーダのクワッドの四隅を自己生成することができます。もちろん、ピクセルシェーダの出力位置を生成する必要があります。あなたは新しいSV_Position
(またはSV_POSITION
)セマンティックを使用することができますほとんどすべての場所で、古いのDirect3D 9 POSITION
セマンティックを使用することができます
VSInputTx VSQuad(uint vI : SV_VertexId)
{
VSInputTx vout;
float2 texcoord = float2(vI & 1, vI >> 1);
vout.TexCoord = texcoord;
vout.Position = float4((texcoord.x - 0.5f) * 2, -(texcoord.y - 0.5f) * 2, 0, 1);
return vout;
}
注意。唯一の要件は、入力レイアウトと頂点シェーダー入力の間で一貫していなければならないことです。それ以外の場合、バインドに失敗します。
DirectXを初めてご使用の方は、DirectX Tool Kit、特にbuilt-in shader sourceをご覧ください。
ありがとうございました!しかし、私はまだ混乱しています...ピクセルシェーダへのfloat4 SV_Position入力は、ジオメトリのピクセル位置、または画面のピクセル位置です!それとも、Vertex Output SV_Positionですか(同じですか)? Pixel Shaderが色を出力しているので、この色は何ですか、2Dの画面の色ですか? – Mike5050
それはあなたが描いているものによって異なります。三角形を描いている場合、頂点シェーダは3つのコーナーのそれぞれに対して1回実行され、ピクセルシェーダは三角形がタッチするすべてのピクセルに対して実行されます。頂点シェーダの出力は、[ラスタライザハードウェア](https://msdn.microsoft.com/en-us/library/windows/desktop/cc627092.aspx)に送信されます。状態。次に、生成したピクセルごとにピクセルシェーダーを呼び出します。 –
AHありがとう!ピクセルシェーダ(三角形の場合)のSV_Positionは、まだ3次元空間ですか? X、Y、Z、Wの値は?申し訳ありません...多くの未回答の質問!編集:私はそれがちょうど画面の位置だと仮定していますか?私はこれを正しく理解しておきたいと思っています。本の読書は...本当に明らかではありませんでした。例:1つの書籍の状態:ラスタライザはフラグメント(フラグメントとは何ですか?)を生成し、ピクセルシェーダはこのフラグメントで動作します。それはフラグメントが何であるかを説明しません...ピクセルシェーダがカラーを出力しなければならないということだけです。 – Mike5050