了解如何设置简单的 HLSL 顶点和片段着色器

Understanding how to setup simple HLSL vertex and fragment shaders

我正在尝试了解如何使用 HLSL 着色语言来输出我的简单 vulkan 三角形。我正在使用 google 的 glslc 编译器编译我的着色器文件,在编译着色器时没有收到任何投诉,但没有生成三角形。我知道我的 HLSL 文件是错误的,因为我能够通过 GLSL 输出一个三角形。我一直在尝试从各种教程中拼凑我的 HLSL 着色器,这里是我当前的 vert.hlsl 和 pixel.hlsl 文件:

vert.hlsl

struct vertex_info
{
    float2 position : POSITION;
    float3 color : COLOR;
};

struct vertex_to_pixel
{
    float4 position : POSITION;
    float3 color : COLOR;
};

void main(in vertex_info IN, out vertex_to_pixel OUT)
{
    OUT.position = float4(IN.position, 0.0, 1.0);
    OUT.color = IN.color;
};

pixel.hlsl

struct vertex_to_pixel
{
    float4 position : POSITION;
    float3 color : COLOR;
};

float4 main(in vertex_to_pixel IN) : COLOR
{
    return float4(IN.color, 1.0);   
};

在我的 vulkan cpp 程序中,我尝试传递一个包含 3 个顶点的单个顶点缓冲区,其中包含 float2 位置和 float3 颜色:

struct vec2 {
    float x{};
    float y{};
};

struct vec3 {
    float r{};
    float g{};
    float b{};
};

struct vertex {
    vec2 pos;
    vec3 color;
};

vertex vertices[3] = {
        {{0.0f, -0.5f},   {1.0f, 0.0f, 0.0f}},
        {{0.5f, 0.5f},    {0.0f, 1.0f, 0.0f}},
        {{-0.5f, 0.5f},   {0.0f, 0.0f, 1.0f}}
    };

我认为主要问题是我没有使用 SV_POSITION 语义。我还稍微更改了着色器代码,一切正常。更改后的着色器代码如下:

vert.hlsl

struct vertex_info
{
    float2 position : POSITION;
    float3 color : COLOR;
};

struct vertex_to_pixel
{
    float4 position : SV_POSITION;
    float3 color : COLOR;
};

vertex_to_pixel main(in vertex_info IN)
{
    vertex_to_pixel OUT;

    OUT.position = float4(IN.position, 0.0, 1.0);
    OUT.color = IN.color;

    return OUT;
};

pixel.hlsl

struct input_from_vertex
{
    float3 color : COLOR;
}

float4 main(in input_from_vertex IN) : COLOR
{
    return float4(IN.color, 1.0);
};