2017-09-29 176 views
2

我讀的書, 「實用渲染和計算用的Direct3D 11」 來看,在DirectX 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 }, 
}; 

更重要的是着色器 - 凡在節目它設置這個「正」?

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

相關問題