metal - Metal 结构大小的两个示例似乎相互矛盾
问题描述
这个结构的大小是 36 字节:
struct Mat
{
enum Type { Lam, Met, Dia };
int type;
packed_float3 albedo;
packed_float3 emissive;
float roughness;
float ri;
};
float
当s 和int
s 分别为 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 指南中可以找到的任何地方似乎都没有记录这个幻数。
解决方案
我想你只是数错了。这个:
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 个字节。没有矛盾。
推荐阅读
- html - 如何使用空格减少空格:css 属性而不更改文本中的行高
标签
- asp.net-mvc - 如何使用 ASP.Net MVC 将对象值传输到模态类?
- cordova - Cordova Windows 应用程序未使用依赖项文件夹构建 appx
- vuetify.js - 如何自定义 Vuetify?
- c# - 使用 CsvHelper(或类似库)从变量中读取 CSV
- r - 定义因子数据的顺序
- ruby-on-rails - 如何从 Rails 应用程序内部运行 heroku restart?
- python - 用自己的数字替换每个字母
- apache-flink - 如何从 Apache Flink 的命令行传递和覆盖配置属性?
- python - 使用 tkinter 创建 python GUI 并尝试使用 OOP