这个问题一直困扰着我,我无法弄明白。我有几个不同的着色器使用相同的资源,一个具有一堆照明值的结构。使用它的第一个着色器工作正常 - 第二个着色器没有。好像它可能会变成零。使用它的第三个着色器也可以正常工作。
如果我没有任何使用第一个着色器的对象,那么第二个着色器就可以了。而第三个不起作用。资源永远不会改变,这是我设置过一次的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.我不明白。