首页 > 解决方案 > Metal 结构大小的两个示例似乎相互矛盾

问题描述

这个结构的大小是 36 字节:

struct Mat
{
    enum Type { Lam, Met, Dia };
    int type;
    packed_float3 albedo;
    packed_float3 emissive;
    float roughness;
    float ri;
};

float当s 和ints 分别为 4 个字节而 apacked_float3为 12 个字节时,这是有道理的。

它的大小是 88 字节:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u, v, w;
    float lensRadius;
};

float当s 是 8 个字节而 thepacked_float3是 16 个字节时,这是有道理的。

这些在同一个金属着色器中。这里的对齐发生了什么会导致这是真的?

如果 a 必须适合连续的 16 字节空间,我只能使匹配工作packed_float3,因此在第一个示例中,它适合在第一个之后int,但在第二个示例中,每个示例都必须开始自己的。是这样吗?16如果是这样,我在 Metal Shading 指南中可以找到的任何地方似乎都没有记录这个幻数。

标签: metalmetal-performance-shaders

解决方案


我想你只是数错了。这个:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u, v, w;
    float lensRadius;
};

相当于:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u;
    packed_float3 v;
    packed_float3 w;
    float lensRadius;
};

那是 7packed_float3秒,21float秒,加上一个单独float的,总共 22float秒。什么时候float是 4 个字节,即 88 个字节。没有矛盾。


推荐阅读