我最近发现了一个奇怪的问题。我希望我的所有矩阵都是行主,所以我在着色器中指定layout(row_major) uniform;
一次。只要矩阵直接在统一块中声明,这就可以工作:
layout(row_major) uniform;
uniform Constants
{
mat4 WorldViewProj; // Row-major - OK
}g_Constants;
但如果WorldViewProj
是结构的成员,则它按列主要顺序存储:
layout(row_major) uniform;
strct Struct
{
mat4 WorldViewProj;
};
uniform Constants
{
Struct Str; // Now WorldViewProj is column-major!
}g_Constants;
另一方面,如果我在块声明之前另外指定layout(row_major)
,则矩阵存储正确:
layout(row_major) uniform;
layout(row_major) uniform Constants
{
Struct Str; // WorldViewProj is row-major again
}g_Constants;
我只在NVidia H / W上看到这个问题,在Intel GPU上一切正常(我没试过AMD)。这是一个错误还是我再次错过了一些纠结的OpenGL规范?