了解如何设置简单的 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);
};
我正在尝试了解如何使用 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);
};