D3D11三角形绘制
2024-11-21
38
0
1.顶点着色器的输出是像素着色器的输入
2.顶点,重要的是通过顶点设置的输入布局,提供参数,可以在像素着色器中重新设置画面。
//像素着色器
//纹理常量
Texture2D txY : register(t0);
Texture2D txU : register(t1);
Texture2D txV : register(t2);
//采样状态
SamplerState samLinear : register(s0);
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD;//纹理坐标
};
float4 PS(PS_INPUT input) : SV_Target
{
//这一行从三个纹理(txY,txU,txV)中分别采样Y、U和V通道的值,并将它们存储在一个4维向量中。
float4 yuva = {
txY.Sample(samLinear, input.Tex).r,
txU.Sample(samLinear, input.Tex).r,
txV.Sample(samLinear, input.Tex).r,
0
};
//return yuva; //For RGB
yuva -= float4(0, .5f, .5f, 0);
float4 f = float4(yuv_to_rgb2(yuva.xyz), yuva.w); // don't lose alpha
return f;
}
顶点缓冲区
1.1创建顶点缓冲区
constexpr VertexPositionColor vertices[] =
{
{DirectX::XMFLOAT3(-1.0f, -1.0f, 0),DirectX::XMFLOAT2(0.0f, 0.0f)},
{DirectX::XMFLOAT3(-1.0f, 1.0f, 0), DirectX::XMFLOAT2(0.0f, 1.0f)},
{DirectX::XMFLOAT3(1.0f, -1.0f, 0), DirectX::XMFLOAT2(1.0f, 0.0f)},
{DirectX::XMFLOAT3(1.0f, -1.0f, 0), DirectX::XMFLOAT2(1.0f, 0.0f)},
{DirectX::XMFLOAT3(-1.0f, 1.0f, 0), DirectX::XMFLOAT2(0.0f, 1.0f)},
{DirectX::XMFLOAT3(1.0f, 1.0f, 0), DirectX::XMFLOAT2(1.0f, 1.0f)},
};
D3D11_BUFFER_DESC BufferDesc;
RtlZeroMemory(&BufferDesc, sizeof(BufferDesc));
//D3D11_USAGE_DEFAULT GPU读写
//D3D11_USAGE_DYNAMIC CPU写GUP读
//D3D11_USAGE_IMMUTABLE 只GPU读
//D3D11_USAGE_STAGING CPU GPU均可读写
BufferDesc.Usage = D3D11_USAGE_DEFAULT;
BufferDesc.ByteWidth = sizeof(VERTEX) * NUMVERTICES;//总字节数
BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
BufferDesc.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
RtlZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = Vertices;
HRESULT hr = m_Device->CreateBuffer(&BufferDesc, &InitData, &VertexBuffer);
if (FAILED(hr))
{
return FALSE;
}
1.2设置顶点缓冲区
UINT Offset = 0;
UINT Stride = sizeof(VERTEX);
m_DeviceContext->IASetVertexBuffers(0, 1, &VertexBuffer, &Stride, &Offset);
1.3设置基无类型
m_DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY::D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
顶点着色器
1创建顶点着色器代码
2编译顶点着色器代码
3创建顶点着色器
4设置顶点着色器
m_DeviceContext->VSSetShader(m_VertexShader, nullptr, 0);
像素着色器
1创建像素着色器代码
2编译像素着色器代码
3创建像素着色器
4设置像素着色器
m_DeviceContext->PSSetShader(m_PixelShader, nullptr, 0);
输入布局
输入布局基本上是给着色器解析我们放在顶点缓冲区中放置顶点的格式。
顶点着色器的输出就是像素着器的输入
1创建输入布局
2设置输入布局
D3D11_INPUT_ELEMENT_DESC Layout[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},//3*sizeof(float)=12
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
UINT NumElements = ARRAYSIZE(Layout);//2
UINT Size = ARRAYSIZE(g_VS);
HRESULT hr = m_Device->CreateInputLayout(
Layout,
NumElements,
vertexShaderBlob->GetBufferPointer(),
vertexShaderBlob->GetBufferSize(),
&m_InputLayout);
if (FAILED(hr))
{
return FALSE;
}
m_DeviceContext->IASetInputLayout(m_InputLayout);