Glsl 金属API:动态更改纹理索引

Glsl 金属API:动态更改纹理索引,glsl,metal,Glsl,Metal,我做了一个glsl->metal解析器,如果glsl代码没有使用非常旧的特性,那么这个解析器可以很好地工作 我面临的最大问题是glsl代码没有显式定义纹理绑定位置,如: uniform layout(binding = 0) sampler2D myTexture; // this is fine uniform sampler2D myTexture2; // this is the problem 在metal中,必须在编译时定义纹理索引。在glsl中,您可以在运行时指定(并更改)它 我

我做了一个glsl->metal解析器,如果glsl代码没有使用非常旧的特性,那么这个解析器可以很好地工作

我面临的最大问题是glsl代码没有显式定义纹理绑定位置,如:

uniform layout(binding = 0) sampler2D myTexture; // this is fine
uniform sampler2D myTexture2;  // this is the problem
在metal中,必须在编译时定义纹理索引。在glsl中,您可以在运行时指定(并更改)它

我认为这是不可能的,特别是因为我在规范中找不到它,但有人知道是否可以在CPU端动态指定(或更改)金属着色器的纹理索引吗

texture2d < half > myTexture[[ texture(IDX) ]]  // where IDX is not constexpr?
texture2dmyTexture[[texture(IDX)]//其中IDX不是constexpr?

大多数选项都需要重新编译着色器:函数常量和文本替换是两种可能性,但您似乎希望避免这些。在这种情况下,您可以尝试使用,这将删除为每个纹理显式分配纹理参数槽的要求,当然它们有自己的一套警告。感谢您的帮助Warren!但是如果我理解正确,我仍然需要为参数缓冲区编码器指定一个纹理绑定槽(在金属中,我相信它被称为索引),这意味着如果我想在着色器上访问它,我需要使用[[id(IDX)];并使用[encoder setTexture:myTex atIndex:IDX]发送IDX;。如果我可以在运行时更改IDX,或者不使用索引,而使用其他可以在运行时更改的内容,这将是很好的;您仍然需要为参数缓冲区本身分配缓冲区绑定槽,并且参数缓冲区布局是静态的,您可以在CPU端按索引将资源编码到参数缓冲区中,但不必在着色器中指定索引;您只需作为参数缓冲区结构的成员访问纹理。我知道我需要为参数缓冲区指定绑定槽,但如果没有纹理索引,API如何知道要绑定到参数缓冲区的纹理(例如,当我在同一个参数缓冲区中有多个纹理时)?绑定纹理(使用setTexture)时,我必须提供纹理索引(绑定槽),并且afaik此索引必须使用[[id()]与着色器中提供的索引对齐。您能给我一个未在着色器中指定索引的代码示例吗?参数缓冲区结构成员的着色器中的
id
属性是可选的。如果不提供它们,可以使用
newArgumentEncoderWithBufferIndex:…
reflection
参数来获取自动分配的绑定索引列表。