【发布时间】:2020-02-28 02:38:24
【问题描述】:
我有这个金属着色器:
struct InVertex {
packed_float3 pos;
packed_uchar4 color;
};
vertex ProjectedVertex vertexShader(const device InVertex *vertexArray [[buffer(0)]],
const unsigned int vertexId [[vertex_id]]){
InVertex in = vertexArray[vertexId];
....
}
但是,我想将 缓冲区声明设为“动态”。 IE 我希望我的着色器能够处理缓冲区类型,例如
struct InVertex1 {
packed_float3 pos;
packed_uchar4 color;
};
struct InVertex2 {
float4 pos;
flat4 color;
};
struct InVertex3 {
float4 pos;
float4 tangent;
float4 color;
};
etc..
所以我想要类似的东西:
vertex ProjectedVertex vertexShader(const device ???? *vertexArray [[buffer(0)]],
const unsigned int vertexId [[vertex_id]]
const device int vertexType [[buffer(1)]] ){
if vertexType = InVertex1Type {
... handle InVertex1 type ...
}
else if vertexType = InVertex2Type {
... handle InVertex2 type ...
}
else if vertexType = InVertex3Type {
... handle InVertex3 type ...
}
}
【问题讨论】:
-
您究竟为什么需要这个?将
if-else条件放入着色器可能会影响应用的性能。 -
@0xBFE1A8 是的,我了解性能 :( 但我无法触及框架(基于 openGL)给我一个动态缓冲区声明。所以我必须让我的着色器能够处理所有情况跨度>
标签: ios xcode shader metal metalkit