将结构与 std140 对齐,CPU 端

2024-02-24

我想这是纯 C++ 问题和 OpenGL 问题之间的一种交叉。我有一个统一的缓冲区,并在其中分配 sizeof(ShaderData) 字节的空间。我在着色器的 GPU 端使用 std140 布局。

根据 std140 规则,我需要在结构中的各个位置添加填充,以确保向量等内容正确对齐。下面的结构是一个示例(针对我的灯光):

struct ShaderData {

    float Light_Intensity;  
    float _pad1[3];    // align following vec3 on 4N boundary
    Math::Vec3f Light_Position;
    float _pad2;       // align following vec4 on 4N boundary
    Math::Colour4f Light_Ambient;
    Math::Colour4f Light_Diffuse;
    Math::Colour4f Light_Specular;    
    float Light_AttenuationMin;
    float Light_AttenuationMax;

} MyShaderData;

这是人们通常在 C++ 中做事的方式,还是有特殊的关键字或编译指示来对齐结构 CPU 端的各个元素,这些元素更整洁?


不,这样你只是浪费空间。你必须根据std140规则找到优化的布局。

  • a float需要 4 个字节并且是 4 个字节对齐的
  • a vec3需要 12 个字节,并且是 16 个字节对齐
  • a vec4需要16字节并且是16字节对齐的

这意味着您可以为您的结构找到更好的布局:

float Light_Intensity;          X
float _pad1[3];                  XXX
Math::Vec3f Light_Position;         XXX
float _pad2;                           X

正如你所看到的,你浪费了 4 个字节,更糟糕的是你可以这样做:

Math::Vec3f Light_Position      XXX
float Light_Intensity;             X

让它对齐并且不需要浪费一个字节。这有效是因为vec3将与 16 字节边界对齐,而float仍将与 4 字节边界对齐。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构与 std140 对齐,CPU 端 的相关文章

  • 如何拦截 .Net 中第三方库对非虚拟方法的调用?

    我认为我需要的是 net 人们称之为 透明动态代理 的东西 但到目前为止我所看到的所有实现 Castle DynamicProxy Spring NET AOP 等 都要求我至少执行以下操作之一 将拦截的方法声明为虚拟方法 包装类并创建包装
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 线程安全的get(访问器方法)

    我目前正在使用以下代码对变量进行线程安全访问 int gnVariable void getVariableValue int pnValue acquireLock Acquires the protection mechanism pn
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • 如何在Asp.Net Core中自定义开发者异常页面?

    这常见于ConfigureStartup cs 文件的方法具有如下所示的代码 if env IsDevelopment app UseDeveloperExceptionPage new DeveloperExceptionPageOpti

随机推荐

  • 表单认证滑动过期不起作用

    我有下面的代码 int intTimeout FormsAuthentication Timeout Hours 60 FormsAuthentication Timeout Minutes var authTicket new Forms
  • Terraform 错误:锁定状态时出错:获取状态锁时出错:发生 2 个错误:

    我尝试了 terraform 版本 v0 12 26 和 v0 13 3 两者都失败了 地形计划 获取状态锁 这可能需要一些时间 错误 锁定状态时出错 获取状态锁时出错 发生 2 个错误 ResourceNotFoundException
  • 初始化期间无法成功更新网络信息

    当我当天第一次启动该应用程序时 我总是遇到上述问题 当我第一次启动应用程序时 我会调用服务器来获取一些数据 然后播放动画视频 服务器调用位于与主 UI 线程不同的线程中 这与网络可达性或动画视频有关吗 我认为第一部分是主要问题 但不能一直重
  • 串口通讯显示

    我正在尝试通过串行端口通信进行聊天 这个聊天必须在 WPF 项目中有一个界面 我已经制作了界面和所有内容 我陷入了通过串口接收响应的困境 我已经尝试从串行端口添加 DataReceived 事件 但我担心我使用错误 因为我以前从未用 C 编
  • 已安装 Scipy 但 Tflearn 表示不支持 Scipy (win7)

    我正在使用 Windows 7 和 tflearn 版本 0 2 2 tensorflow 版本 0 12 1 python 3 5 并且我手动安装了 scipyhttp www lfd uci edu gohlke pythonlibs
  • 使用奏鸣曲管理包时已弃用的警告

    我正在使用 symfony2 7 和 sonata admin 学说 orm 捆绑包 我遵循了官方安装说明 除了一件事之外工作正常 每次请求时 我都会收到以下已废弃的警告 但我不知道如何消除它 Date 2016 10 18 08 58 2
  • 有人可以解释一下 Objective-C 方法声明语法吗

    我正在阅读一本 iPhone 开发书 但并不真正了解 Objective C 在大多数情况下 我能够理解正在发生的事情 但有一些方法声明 如下所示 让我遇到了一些麻烦解析 例如 NSInteger tableView UITableView
  • 相当于 Java 中的 C++ 移位运算符 << 吗?

    C 移位运算符 lt lt 不循环 例如 如果您这样做 C int a 1 cout lt lt a lt lt 38 你得到 0 但是 在 Java 中 你实际上循环并得到有效值 64 我需要将一些 C 代码转换为 Java 那么我应该使
  • 从32位程序文件夹编译到64位1时,更改IntelliJ 13中的jdk路径

    我在尝试制作我的 java 项目时遇到了这个问题 我刚刚因为各种原因卸载了64位jdk并安装了32位jdk 我收到错误 无法运行程序 C Program Files Java jdk1 7 0 51 bin java 在 目录 C User
  • Kotlin 类初始化语义是什么?

    我在语言定义中找不到任何解释 Kotlin 类初始化的内容 import java util Properties fun main args Array
  • 在 Mac OS X 上,如何获得 System/LibC 的调试版本以进行源代码级调试?

    我从 opensource apple com 下载了 LibC 源代码 但由于它是一个整体库 usr lib libSystem B dylib 的一部分 我是否必须以某种方式重建整个库 我有一个从 Linux 移植的 BSD 命令行程序
  • 向 parcoord 添加刻度(平行坐标图)

    这 MASS 包中的 parcoord 函数看起来不错 但是我如何添加刻度 四个y轴 代码在这里 ir lt rbind iris3 1 iris3 2 iris3 3 parcoord log ir c 3 4 2 1 col 1 0 1
  • 将 ImageView 对齐到布局 android 的右侧

    我有一个布局
  • 如何在 Rust 中彻底打破 tokio-core 事件循环和 futures::Stream

    我正在涉足 tokio core 并且可以弄清楚如何生成事件循环 然而 有两件事我不确定 如何优雅地退出事件循环以及如何退出事件循环内运行的流 例如 考虑这段简单的代码 它在事件循环中生成两个侦听器 并等待另一个线程指示退出条件 exter
  • Windows Powershell 有时不输出任何值(温度传感器)

    有时会出现没有显示温度传感器的情况 我使用 Powershell 来读取这些值 这经常有效 我想知道为什么 Windows 有时不返回任何内容 是在我的笔记本电脑 软件还是其他什么上吗 powershell Get WmiObject Cl
  • React 远程控制台日志记录

    我使用 Mongo 设置了 Express 服务器 以便在使用 React 对 Electron 应用程序进行调试测试期间记录控制台日志 我只是使用 ajax 发送通常使用 console log 打印的内容 这对于我想要记录的单个事件效果
  • 我应该调用什么 API 来获取系统正常运行时间?

    我想从基于 Linux 的系统上运行的 C 应用程序中获取系统正常运行时间 我不想调用 uptime 1 并解析输出 我想调用我怀疑存在的底层 C API 有人知道是否有这样的调用 或者 uptime 1 是否只是处理从 wtmp 获取的记
  • 为什么删除时会引发 Core Data NSManagedObject 错误?

    我正在尝试有效地批量删除很多NSManagedObjects 不使用NSBatchDeleteRequest 我一直在遵循一般程序这个答案 https stackoverflow com a 12116402 5513562 适用于 Swi
  • 垂直 div 间距

    如何用最少的代码水平分布3个div 我有 3 个具有相同类的 div 我需要水平分布它们 每个 div 之间有 19 像素的空间 目前我的解决方案是为前 2 个 div 提供 19 像素的右边距 并为第三个 div 分配一个单独的类 使其左
  • 将结构与 std140 对齐,CPU 端

    我想这是纯 C 问题和 OpenGL 问题之间的一种交叉 我有一个统一的缓冲区 并在其中分配 sizeof ShaderData 字节的空间 我在着色器的 GPU 端使用 std140 布局 根据 std140 规则 我需要在结构中的各个位