OpenGL 统一缓冲区 std140 布局、驱动程序错误还是我误解了规范?

2023-11-22

OpenGL 规范是谎言(或者这是一个错误?)...参考 std140 的布局,具有共享的统一缓冲区,它指出:

“GLSL 编译器使用表 L-1 中显示的规则集来 std140 合格的统一块中的布局成员。的偏移量 块中的成员根据块的大小进行累积 块中的先前成员(在变量之前声明的成员) 问题)和起始偏移量。第一个的起始偏移量 成员始终为零。

标量变量类型(bool、int、uint、float) - 标量的大小 基本机器类型"

(http://www.opengl-redbook.com/appendices/AppL.pdf)

因此,有了这些信息,我在着色器中设置了一个统一块,如下所示:

// Spotlight.

layout (std140) uniform Spotlight
{
    float Light_Intensity;
    vec4  Light_Ambient;
    vec3  Light_Position;   
};

...只是发现它不适用于我在 CPU 端设置的后续 std140 布局。也就是说,前 4 个字节是 float(GLfloat 的机器标量类型的大小),接下来的 16 个字节是 vec4,接下来的 12 个字节是 vec3(最后剩下 4 个字节以考虑规则) vec3 实际上是 vec4)。

当我更改 CPU 端以将浮点指定为与 vec4 大小相同(即 16 字节)并执行此假设的偏移量和缓冲区大小时,着色器将按预期工作。

因此,要么是规范错误,要么是我误解了“标量”在这种情况下的含义,或者 ATI 有驱动程序错误。谁能解开这个谜团?


您链接到的 PDF 是not the OpenGL规范。我不知道你从哪里得到的,但这肯定不是full规则列表。经常检查你的消息来源;该规范并不像许多人声称的那样难以阅读。

是的size基本类型变量的大小与基本机器类型相同(即:4 个字节)。但大小本身并不能决定position变量的。

每种类型都有一个基本对齐方式,无论该类型在统一块中的何处找到,它都是整体字节偏移量must适合该对齐方式。 a 的基本对齐方式vec4是 4 * 其基本类型(即:float)的对齐方式。所以 a 的碱基对齐vec4 is 16.

Because Light_Intensity在 4 个字节后结束,编译器必须插入 12 个字节的填充,因为Light_Ambient cannot位于 4 字节边界上。它必须位于 16 字节边界上,因此编译器使用 12 字节的空白空间。

ATI 确实在 std140 布局方面存在一些驱动程序错误,但这不是其中之一。

作为一般规则,我喜欢明确地将填充放入我的结构中,并且我避免vec3(因为它有 16 字节对齐)。这样做通常会减少编译器错误以及对事物的去向和实际占用的空间的意外误解。

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

OpenGL 统一缓冲区 std140 布局、驱动程序错误还是我误解了规范? 的相关文章

  • 设置 GLEW 窗口?

    我有 Visual Studio 2010 我想在其上设置 glew h 我执行了这一步 但仍然出现链接器错误 1 下载glew包 2 将 h文件复制到C Program Files x86 Microsoft SDKs Windows v
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 如何通过着色器管道传递顶点颜色?

    我试图通过顶点 几何和片段着色器传递顶点颜色 glBegin GL POINTS glVertex3f 2 0f 0 0f 0 0 glColor3f 0 0 1 0 0 0 glVertex3f 2 0f 0 0f 0 0 glColor
  • 从活动顶点数组生成平滑法线

    我正在尝试通过挂钩 OpenGl 调用来破解和修改旧版 opengl 固定管道游戏的多个渲染功能 而我当前的任务是实现着色器照明 我已经创建了一个适当的着色器程序 可以正确照亮大部分对象 但该游戏的地形是在没有提供正常数据的情况下绘制的 游
  • OpenGL:仅使用一个帧缓冲区并切换目标纹理

    我是否可以只创建一个帧缓冲区对象并通过在需要时切换其目标纹理来实现相同的结果 而不是使用多个帧缓冲区对象 在所有情况下这都是一个坏主意吗 如果是 为什么 我一直在实现一个功能render SetTargetTexture 在我的程序的 AP
  • OpenGL 超级采样抗锯齿?

    在办公室 我们正在使用旧的 GLX Motif 软件 该软件使用 OpenGL 的 AccumulationBuffer 来实现保存图像的抗锯齿功能 我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer 从OS
  • 着色器/矩阵问题 - 看不到对象

    我试图在屏幕上放置一个立方体并点亮它 我想要在立方体上添加 phong 阴影 当我运行代码时 我可以看到背景图像 但看不到立方体 我相当确定立方体本身是正确的 因为我已经设法用纯色着色器显示它 我已经设法编译着色器程序 但我根本看不到立方体
  • libgdx 中帧缓冲区的结果不明确

    我得到以下奇怪的结果帧缓冲区 http libgdx badlogicgames com nightlies docs api com badlogic gdx graphics glutils FrameBuffer htmllibgdx
  • 如何以编程方式在 qml 中渲染 vtk 项目?

    到目前为止 我了解到我们在 QML 中有两个线程 我们的主应用程序线程和我们的 场景图 线程 http doc qt io qt 5 qtquick visualcanvas scenegraph html http doc qt io q
  • OpenGL 将着色器附加到程序

    有没有办法访问附加到程序的着色器 也就是说 给定一个程序 我可以做类似的事情 vertexShader getVertexShaderFromProgram program 我想在验证我的程序的函数中记录着色器编译状态 但我只保留对程序的引
  • 从文件中读取 GLSL 着色器

    我正在尝试从如下所示的文件中读取顶点和片段着色器 version 330 core in vec3 ourColor out vec4 color void main color vec4 ourColor 1 0f but when i
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 交错顶点提交如何提高性能?

    我已经阅读并看到了其他问题 这些问题通常都指向将顶点位置和颜色等交错到一个数组中的建议 因为这可以最大限度地减少从 cpu 发送到 gpu 的数据 我不清楚的是 即使使用交错数组 您仍然必须对位置和颜色指针进行单独的 GL 调用 OpenG
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还

随机推荐

  • 如何在 Pygame 中根据角度移动精灵

    我在移动精灵时遇到问题 我可以毫无问题地在 x 轴和 y 轴上移动它们 我不知道如何才能按照某个角度移动它们 我的意思是 我正在尝试创建一个函数 其中包括我尝试移动的对象 其速度和方向 应以度为单位测量 就像是 MovingObject o
  • 在使用 Ant 编译的文件中找不到主类

    我在 Eclipse 中编译并运行我的程序 一切正常 但是当我用 Ant 打包它并运行它时 出现以下错误 Exception in thread main java lang NoClassDefFoundError org supercs
  • VS 2010 鼠标处理器扩展 - 不工作

    我正在尝试 Visual Studio 2010 扩展 其中我需要处理 IMouseProcessor 公开的事件 据我从文档中可以看出 我应该创建一个 IMouseProcessorProvider 并使用 MEF 导出 以便 Visua
  • 在 .NET 中比较 2 个 XML 文档的最佳方法[重复]

    这个问题在这里已经有答案了 我有一堆单元测试需要检查 XML 输出 我已经开始比较字符串 但是由于格式和表面差异的阻碍 这不会扩展 NET 中评估生成的 XML 在语义上是否与测试期望的相同的最简单方法是什么 Closed作为重复您将如何比
  • SQL“IN”语句的 Linq 版本

    我有以下 3 个表作为简单 项目标记 模式的一部分 物品 项目 ID 整数 品牌varchar 名称 varchar 价格钱 条件varchar 说明 varchar 有效位 Tags 标签 ID 整数 名称 varchar 有效位 标签映
  • 根据数据设置 Dojox 网格行的样式

    我正在尝试根据网格中的值在 DojoX 1 2 3 网格内设置行的样式 网格布局 var view1 noscroll true rows field TASK ID name ID width 80px get this getColor
  • SQL Server 性能 结果集 vs 输出参数 vs 返回值

    我正在权衡使用三种不同方法之一将单个标量值从存储过程返回到我的 C 例程的潜在性能影响 谁能告诉我其中哪个 更快 最重要的是 为什么 方法一 CREATE PROCEDURE GetClientId DealerCode varchar 1
  • 一次运行多个 exec 命令(但要等待最后一个命令完成)

    我环顾四周 似乎找不到任何人正在尝试做我想做的事情 我有通过 POST 请求传递到我的函数的信息 根据该数据 我运行 exec 命令来运行 TCL 脚本一定次数 使用不同的参数 基于 post 变量 现在 我在 foreach 中有 exe
  • 4 点变换图像

    我需要转换位图图像 并将其 4 个角点从一个位置移动到另一个位置 任何可以在 Windows 上运行的代码 最好是 C VB NET 甚至可以帮助如何使用可编写脚本的程序 例如画图网 or Photoshop会被接受 Java 高级成像 A
  • SFINAE 有符号和无符号的区别

    我有将不同算术类型转换为半精度浮点类型的函数 只是一个uint16 t在最低级别 我对整数和浮点源类型有不同的函数 使用 SFINAE 和std enable if template
  • Xcode 卡在“您的应用程序正在上传”

    我在将应用程序从 Xcode 提交到 App Store 时遇到问题 我已经完成了与我的项目相关的所有工作 并且它在我的 iPhone 和 iPad 上运行良好 但当我提交项目时 我面临着一个巨大的问题 存档后首先我完成了验证 现在 我在管
  • 无密码取消工作簿保护

    我有一个流行的 VBA 代码来取消对工作表的保护 但我仍然遇到工作簿受到保护的问题 Sub PasswordBreaker Breaks worksheet password protection Dim i As Integer j As
  • Blazor 清理 MarkupString

    我正在尝试清理 MarkupString 的内容 实际上我创建了这个 基于https github com dotnet aspnetcore blob 574be0d22c1678ed5f6db990aec78b4db587b267 sr
  • GCC 4.4.1 是否因不接受构造函数初始化程序中的注入类名而出现错误?

    GCC 4 4 1 拒绝找到我的注入类名在一个构造函数初始化器 template
  • 如何在等待服务器进程时使用 jQuery 和 PHP 制作进度条?

    当 Google 提供许多指向 Stackoverflow 的准确结果时 过去很容易找到我的问题的解决方案 但是 我没有找到解决这个问题的方法 如果你们中的任何人有建议我应该去哪里解决这个问题 请给我答案的链接 情况是我想从数据库中搜索索引
  • 授权属性生命周期

    有人可以解释为什么授权属性生命周期似乎是相对于它所应用的类或方法进行管理的吗 这与相对于请求生命周期进行管理相反 如果我在类级别装饰控制器 则授权属性构造函数只会在对同一控制器的多个请求中被调用一次 如果我装饰每个控制器方法 那么我会为每个
  • Git 无法比较或合并 utf-16 编码的 .cs 文件

    我和一个朋友同时处理同一个 cs 文件 当存在合并冲突时 git 指出存在冲突 但该文件没有加载通常的 HEAD gt gt gt 内容 因为 cs 文件是二进制文件 因此 我们在 gitattributes 文件中添加了许多内容 cs 文
  • Ramda 建议从稍微嵌套的数组中删除重复项

    我们正在尝试利用 Ramda 来避免一些暴力编程 我们有一个对象数组 如下所示 id 001 failedReason 1000 id 001 failedReason 1001 id 001 failedReason 1002 id 00
  • 空闲计时器时间到期后应用程序不休眠

    据我了解 idleTimerDisabled 设置默认设置为 否 虽然 当我运行我的应用程序并等待它超时并睡眠时 它没有超时 也没有睡眠 我已经进入我的 AppDelegate 并将其手动设置为 否 以尝试强制其睡眠 但仍然没有成功 我正在
  • OpenGL 统一缓冲区 std140 布局、驱动程序错误还是我误解了规范?

    OpenGL 规范是谎言 或者这是一个错误 参考 std140 的布局 具有共享的统一缓冲区 它指出 GLSL 编译器使用表 L 1 中显示的规则集来 std140 合格的统一块中的布局成员 的偏移量 块中的成员根据块的大小进行累积 块中的