金属片段着色器绑定资源在macOS上不规律地运行

时间:2018-04-20 19:31:24

标签: macos fragment-shader metal

这个问题一直困扰着我,我无法弄明白。我有几个不同的着色器使用相同的资源,一个具有一堆照明值的结构。使用它的第一个着色器工作正常 - 第二个着色器没有。好像它可能会变成零。使用它的第三个着色器也可以正常工作。

如果我没有任何使用第一个着色器的对象,那么第二个着色器就可以了。而第三个不起作用。资源永远不会改变,这是我设置过一次的MTLBuffer。而且,如果我使用GPU帧捕获,绘制调用中报告的值始终都是正确的。然而,没有任何东西出现在不起作用的着色器上。

我认为这是一个波动的特定结构的原因是,如果我将值硬编码到着色器而不是读取结构值,那么这也有效。这让我发疯了。

我不确定这里会提供什么样的代码示例。这是结构以及我如何使用它。我没有将任何其他资源绑定到该特定索引,程序中的任何其他位置。

struct Light {
    packed_float3 color;      // 0 - 2
    float ambientIntensity;          // 3
    packed_float3 direction;  // 4 - 6
    float diffuseIntensity;   // 7
    float shininess;          // 8
    float specularIntensity;  // 9
    float dummy1,dummy2;
    /*
     _______________________
     |0 1 2 3|4 5 6 7|8 9    |
     -----------------------
     |       |       |       |
     | chunk0| chunk1| chunk2|
     */
}__attribute__ ((aligned (16)));

...着色器代码....

float4 ambientColor = float4(1,1,1,1)  * color * 0.25;
//Diffuse
float diffuseFactor = max(0.0,dot(interpolated.normal, float3(0.0,0.5,-1.0))); // 1
float4 diffuseColor = float4(light.color,1) * color  * 0.5 * diffuseFactor ; // 2
//Specular
float3 eye = normalize(interpolated.fragmentPosition); //1
float3 reflection = reflect(float3(0.0,0.5,-1.0),interpolated.normal); // 2
float specularFactor = pow(max(0.0, dot(reflection, eye)), 10.0); //3
float4 specularColor = float4(float3(1,1,1)* 2 * specularFactor ,color.w);//4
color = (ambientColor + diffuseColor + specularColor);
color = clamp(color, 0.0, 1.0);

任何人都有任何关于什么可能是麻烦的想法?此外,这只发生在Mac上。在iOS上它工作正常。

编辑:似乎当着色器失败时,根本无法访问资源。例如,我尝试将我的片段返回颜色设置为等于浅色,没有任何修改。

它什么都不产生 - 甚至不是黑色!如果我用这两个中的一个替换该语句,我会变成白色和黑色:

color = float4(1,1,1, 1);  // produces white
color = float4(0,0,0, 1);  //produces black

color = float4(light.color.xyz, 1);  // nothing at all

就像片段着色器在尝试访问光结构时只是中止 - 否则我会得到我的颜色的SOMETHING,强制alpha值为1.我不明白。

0 个答案:

没有答案