我正在为macOS和iOS编写一个多平台应用程序来使用Metal渲染矢量图形。在我的着色器中,顶点ID用作结构数组的偏移量(程序范围内的const,位于常量地址空间中):
//Simplified!
constant const WrapperStruct directionVectors[] =
{
//Vertex data (const):
{ float2(-1, -1) },
{ float2(1, -1) },
{ float2(-1, 1) },
{ float2(1, 1) }
};
//...
vertex Vertex vertexShader(const InstanceAttributes attr [[ stage_in ]], const ushort vid [[ vertex_id ]])
{
Vertex vert;
vert.position = float4(attr.position + (attr.size * directionVectors[vid].value), 0, 1);
vert.color = attr.color;
return vert;
}
//...
这很好用:
但是在特定的MacBook Pro(13英寸,2017年,High Sierra,集成的Intel GPU)上,存在一个大问题:没有绘制图形,我只能在后台获得清晰的颜色。没有记录错误,我也没有遇到任何崩溃。
如果我"打开"包装器结构并直接使用float2数组,一切都很好用。问题似乎集中在使用顶点ID索引到struct的程序范围数组(在英特尔GPU上?)。
我已将所有内容剥离到最小的macOS示例项目中以进行测试:Download sample project。
使用实例化在随机位置绘制一些矩形。在有问题的Intel-GPU系统上,只绘制红色背景。
任何人都可以确认问题吗?它是否与英特尔驱动程序中的Metal实现相关联?或者我的代码中出现了错误/未定义的内容?
提前致谢!
更新
通过gfxCardStatus,我试图缩小问题的范围。实际上,它似乎与集成的英特尔GPU相关联:
MacBook Pro(Retina,15',2015):
MacBook Pro(15英寸,2017年):
MacBook Pro(13英寸,2017年)