我是否需要将着色器制服放入顶点函数签名中?
Do I need to put shader uniforms into the Vertex function signature?
我有一个应该接受宽度、高度、u 偏移和 v 偏移以及颜色的着色器。
签名看起来像这样:
vertex VertexOut texturedVertex(constant packed_float3* pPosition [[ buffer(0) ]],
constant packed_float2* pTexCoords [[ buffer(2) ]],
constant float& pWidth [[buffer(4)]],
constant float& pHeight [[buffer(5)]],
uint vid [[ vertex_id ]],
constant packed_float4& pColor [[buffer(3)]])
这看起来很难看,而且根本无法扩展。
是否可以单独声明这些值,就像在 OpenGL 的制服中一样?
Argument Buffers - 参数缓冲区表示一组资源,这些资源可以作为参数共同分配给图形或计算函数。您使用参数缓冲区来减少 CPU 开销、简化资源管理并实施 GPU 驱动的管道。
以下示例显示了一个名为 My_AB
的参数缓冲区结构,它为名为 my_kernel
的内核函数指定了资源:
struct My_AB {
texture2d<float, access::write> a;
depth2d<float> b;
sampler c;
texture2d<float> d;
device float4* e;
texture2d<float> f;
int g;
};
kernel void my_kernel(constant My_AB & my_AB [[buffer(0)]])
{ ... }
我有一个应该接受宽度、高度、u 偏移和 v 偏移以及颜色的着色器。
签名看起来像这样:
vertex VertexOut texturedVertex(constant packed_float3* pPosition [[ buffer(0) ]],
constant packed_float2* pTexCoords [[ buffer(2) ]],
constant float& pWidth [[buffer(4)]],
constant float& pHeight [[buffer(5)]],
uint vid [[ vertex_id ]],
constant packed_float4& pColor [[buffer(3)]])
这看起来很难看,而且根本无法扩展。 是否可以单独声明这些值,就像在 OpenGL 的制服中一样?
Argument Buffers - 参数缓冲区表示一组资源,这些资源可以作为参数共同分配给图形或计算函数。您使用参数缓冲区来减少 CPU 开销、简化资源管理并实施 GPU 驱动的管道。
以下示例显示了一个名为 My_AB
的参数缓冲区结构,它为名为 my_kernel
的内核函数指定了资源:
struct My_AB {
texture2d<float, access::write> a;
depth2d<float> b;
sampler c;
texture2d<float> d;
device float4* e;
texture2d<float> f;
int g;
};
kernel void my_kernel(constant My_AB & my_AB [[buffer(0)]])
{ ... }