D3D11
+ -

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);

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!