Metal着色器中的不同顶点格式

时间:2016-02-11 19:52:29

标签: ios macos graphics 3d metal

我的渲染器支持2种顶点格式:

typedef struct
{
    packed_float3 position;
    packed_float2 texcoord;
    packed_float3 normal;
    packed_float4 tangent;
    packed_float4 color;
} vertex_ptntc;

typedef struct
{
    packed_float3 position;
    packed_float2 texcoord;
    packed_float4 color;
} vertex_ptc;

我的着色器库的一个顶点着色器签名如下:

vertex ColorInOut unlit_vertex(device vertex_ptc* vertex_array [[ buffer(0) ]],
                                constant uniforms_t& uniforms [[ buffer(1) ]],
                                unsigned int vid [[ vertex_id ]])

此着色器呈现的某些网格将使用一种格式,而某些将使用另一种格式。我如何支持这两种格式?此着色器仅使用vertex_ptc中的属性。我是否必须编写另一个顶点着色器?

1 个答案:

答案 0 :(得分:1)

将着色器函数参数定义为结构数组时(正如您所做),着色器顶点函数中的结构定义必须与缓冲区中实际结构的确切形状和大小相匹配(包括填充)

您是否考虑过根据[[stage_in]]限定符和顶点描述符定义输入?这将允许您通过在为每个着色器函数声明的结构的每个元素上使用[[attribute(n)]]限定符,逐个着色器按下顶点输入。您可以为每个结构定义顶点描述符。