如何在directx 11

时间:2017-10-31 19:12:12

标签: c++ directx

我相信我有正确的代码在DirectX中以三角形着色,但它仍然不会改变颜色 - 相反,它只是一直显示黄色三角形。

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

使用可编程着色管道可以通过多种方式更改绘制颜色,但易于实现的一种解决方案是使用每顶点颜色。

在输入布局中,您需要添加颜色值:

// C++
const D3D11_INPUT_ELEMENT_DESC InputElements[] =
{
    { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT,    0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR",       0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

然后你的顶点就像:

// C++
struct Vertex
{
    XMFLOAT3 position;
    XMFLOAT4 color;
};

然后将所需的颜色传递给每个三角形,通常在每个角上复制相同的值,除非您希望将三角形绘制为渐变。

// C++
static const Vertex s_vertexData[3] =
{
    { { 0.0f,   0.5f,  0.5f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f } },  // Top / Red
    { { 0.5f,  -0.5f,  0.5f, 1.0f },{ 0.0f, 1.0f, 0.0f, 1.0f } },  // Right / Green
    { { -0.5f, -0.5f,  0.5f, 1.0f },{ 0.0f, 0.0f, 1.0f, 1.0f } }   // Left / Blue
};

您还必须确保您的顶点着色器从顶点读取颜色并将其传递到像素着色器:

// HLSL
struct VS_INPUT
{
    float4 Pos : SV_POSITIION;
    float4 Color : COLOR;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};

PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output;
    output.Pos = input.Pos;
    output.Color = input.Color;
    return output;
}

您的Pixel Shader必须以某种方式使用颜色值:

// HLSL
float4 PS( PS_INPUT input) : SV_Target
{
    return input.Color;
}
  

由于您似乎对DirectX不熟悉,我建议您查看DirectX Tool Kit tutorials和{{Xbox-ATG-Samples以及 Introductory Graphics 示例特别是1}}。