2017-09-29 4 views
2

のDirectX 11:私は "Direct3Dの11で実用的なレンダリングと計算" の本を、読み、DirectX 11のサンプルで探していますどのようにバーテックスシェーダとピクセルシェーダ作業

CPP: https://github.com/walbourn/directx-sdk-samples/blob/master/Direct3D11Tutorials/Tutorial02/Tutorial02.cpp

HLSL: https://github.com/walbourn/directx-sdk-samples/blob/master/Direct3D11Tutorials/Tutorial02/Tutorial02.fx

これはなんですか?

D3D11_INPUT_ELEMENT_DESC layout[] = 
{ 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
}; 

さらに重要なシェーダー - プログラムでは、この「POS」を設定していますか?

float4 VS(float4 Pos : POSITION) : SV_POSITION 
{ 
    return Pos; 
} 

私はあなたが経由して頂点データを結合していることがわかります。

// Create vertex buffer 
SimpleVertex vertices[] = 
{ 
    XMFLOAT3(0.0f, 0.5f, 0.5f), 
    XMFLOAT3(0.5f, -0.5f, 0.5f), 
    XMFLOAT3(-0.5f, -0.5f, 0.5f), 
}; 
D3D11_BUFFER_DESC bd; 
ZeroMemory(&bd, sizeof(bd)); 
bd.Usage = D3D11_USAGE_DEFAULT; 
bd.ByteWidth = sizeof(SimpleVertex) * 3; 
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
bd.CPUAccessFlags = 0; 
D3D11_SUBRESOURCE_DATA InitData; 
ZeroMemory(&InitData, sizeof(InitData)); 
InitData.pSysMem = vertices; 
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); 
if(FAILED(hr)) 
    return hr; 

// Set vertex buffer 
UINT stride = sizeof(SimpleVertex); 
UINT offset = 0; 
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); 

// Set primitive topology 
g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

そしてあなたがシェーダを設定してから3 verticies描画されています

// Render a triangle 
g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); 
g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0); 
g_pImmediateContext->Draw(3, 0); 

これをすべて理にかなっています。しかし、私はこのPos入力が何であるか、それがどのように生成されるのか、なぜそれが使われるのか混乱しています。また、同じことをする他の例もあります(サンプル7)。ここでは位置とテクスチャを使用しましたが、この情報がどこから来ているのかわかりません。たとえば...

struct VS_INPUT 
{ 
    float4 Pos : POSITION; 
    float2 Tex : TEXCOORD0; 
}; 

ありがとうございました!

+0

この場合、POSITIONはオブジェクト空間内の頂点の位置です – Asesh

答えて

1

D3D11_INPUT_ELEMENT_DESCの配列は、頂点バッファから読み込まれるデータのレイアウトを決定します。この配列はID3D11Device::CreateInputLayoutコールに渡され、使用できるようになります。それは、ID3D11DeviceContext::IASetInputLayout(図示されていませんが、リンクしたコード内)の呼び出しを介してレンダリングコンテキストに設定されます。

D3D11_INPUT_ELEMENT_DESCのメンバーを見ると、最初のメンバーはSemanticName"POSITION"に設定されています)です。これは、頂点バッファの要素がシェーダーの入力とどのように一致するかを示します。また、データとフォーマットのオフセットに関するデータも含まれています(この場合、オフセットはゼロです。フォーマットDXGI_FORMAT_R32G32B32_FLOATは3x 32ビット浮動小数点に対応します)。シェーダでは、Posの後にコロンが続き、"POSITION"が続きます。これはセマンティクスであり、入力レイアウトと一致しています。その後、シェーダはオフセットゼロからの位置データとそのデータの形式を読み取る必要があることを認識します。

データ自体は、ID3D11DeviceContext::IASetVertexBuffersコールで設定された頂点バッファから読み込まれます。 strideのパラメータは、入力アセンブラに、ある頂点から次の頂点までの頂点バッファ内の距離を知らせるので、次の頂点の読み込みを開始する場所を知っています。 g_pVertexBufferは、verticesデータから初期化されました。このデータは、3x 32ビット浮動小数点数のセットです。

追加の入力を持つシェーダ(たとえば、TEXCOORD0)では、シェーダで使用されるセマンティクスに対応するより多くのエントリがD3D11_INPUT_ELEMENT_DESC配列に存在します。

+0

カスタム変数を使用する場合はどうなりますか?テクスチャや頂点バッファにエンコードする必要がありますか?ありがとう! – Mike5050

+0

入力レイアウトとシェーダが一致する限り、好きなセマンティクスを使用できます。 – MuertoExcobito

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx#VS - セマンティクスを使用する必要がありますので、私は何を言おうとしていますか?あなたはちょうど自分自身を構成できませんか?意味論がHLSLにどのように振る舞うかを伝えると思いますか?たとえば、POSITION(3つの32ビット値)の中にTEXCOORD0(2つの32ビット値)を持ち、zだけ無視することができます。正しい? – Mike5050

関連する問題