2016-02-11 61 views
1

我的渲​​染器支持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

將着色器函數參數定義爲結構數組(如您所做的那樣)時,着色器頂點函數中的結構定義必須與緩衝區中實際結構(包括填充)的確切形狀和大小相匹配。

您是否考慮根據[[stage_in]]限定符和頂點描述符定義輸入?這將允許您在每個着色器函數聲明的結構的每個元素上使用[[attribute(n)]]限定符,以逐個着色器爲基礎處理頂點輸入。您將爲每個結構定義一個頂點描述符。