OpenGL 统一缓冲区 std140 布局

2024-04-02

我正在尝试通过 GeForce 8600 GT 上的统一块将整数数组传递给片段着色器(一切均根据 GLSL“#version 330”)。

在应用程序方面我有:

int MyArray[7102];
…
//filling, binding, etc
…
glBufferData(GL_UNIFORM_BUFFER, sizeof(MyArray), MyArray, GL_DYNAMIC_DRAW);

在我的片段着色器中,我声明相应的块,如下所示:

layout (std140) uniform myblock
{
int myarray[7102];
};

问题是,在 glCompileShader 成功后,glLinkProgram 返回一个错误,指出它无法绑定适当的存储资源。

一些额外的事实:

1) GL_MAX_UNIFORM_BLOCK_SIZE 返回值 65536

2)如果我将元素数量减少到 4096,它可以正常工作,并且无论我使用“int”还是“ivec4”作为数组类型都没有区别。任何高于 4096 的值都会给我同样的“存储错误”

3)如果我使用“共享”或“打包”,一切都会按预期工作

在咨询了 std140 的 GLSL 3.3 规范后,我假设对齐/填充存在问题:

“1)如果成员是消耗N个基本机器单元的标量,则基本对齐 是 N。

...

4) 如果成员是标量或向量数组,则基本对齐和数组 stride 设置为匹配单个数组元素的基本对齐方式,根据 符合规则 (1)、(2) 和 (3),并向上舍入到 vec4 的基本对齐方式。这 数组末尾可能有填充;以下成员的基本偏移量 该数组向上舍入到基本对齐的下一个倍数。”

我的问题:

1) “myblock”占用的空间是 7102*4=28408 字节的 4 倍吗? IE。 std140 将 myarray 的每个成员扩展为 vec4 ,实际内存使用量为 7102*4*4=113632 字节,这是问题的原因?

2)它与“共享”或“打包”一起工作的原因是由于优化消除了这些差距?

3)也许这是一个驱动程序错误?所有事实都表明“......并四舍五入到 vec4 的基本对齐”是原因,但很难接受像整数数组这样简单的东西最终在内存限制方面效率降低了 4 倍。

4)如果这不是一个错误,那么在 std140 的情况下我应该如何组织和访问数组?我可以使用“ivec4”来实现最佳数据分布,但我必须牺牲性能,而不是简单的 x=myarray[i] 来执行 x=myarray[i/4][i%4] 之类的操作来引用每个 ivec4 的各个元素?或者我错过了什么并且有明显的解决方案?


1) (...) 四舍五入到 vec4 的基本对齐方式? (……)

Yes.

2)它与“共享”或“打包”一起工作的原因是由于优化消除了这些差距?

是的;只是这不是优化性能的明智选择。

3)也许这是一个驱动程序错误?

EDIT No. GPUs natually work with vectorized typed. Packing the types require to add further instructions to de-/multiplex the vectors. In the time being since writing this answer significant changes to GPU architectures happend. GPUs made these days are all single scalar architectures with the design emphased on strong superscalar vectorization.

4)如果这不是一个错误,那么在 std140 的情况下我应该如何组织和访问数组?

不要对如此大的数据使用统一的缓冲区对象。将数据放入一维纹理并使用texelFetch对其进行索引。

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

OpenGL 统一缓冲区 std140 布局 的相关文章

  • QGLWidget 比 QWidget 慢

    问题主要是在标题中确定的 我尝试了 Qt 的示例 二维绘画 http harmattan dev nokia com docs library html qt4 opengl 2dpainting html 并注意到 如果我尝试在 QGLW
  • cmake 在 OS X 上找不到 gl.h

    我在 OS X 10 10 上并尝试使用 GLUT 和 OpenGL 构建一个 C 项目 我将其简化为展示我的问题的最小示例 我有以下内容CMakeLists txt cmake minimum required VERSION 2 8 F
  • 如何读取 Windows 特定扩展名

    在 OpenGL superible 中 示例说我可以通过以下方式读取 Windows 特定扩展 Type defined in the book as char but that is not what glGetString retur
  • 在 OpenGL 着色器中检测 NaN 的最佳方法

    今天早上我遇到了一个似乎神秘的错误 我很幸运能够很快找到解决方案 我除以计数器以生成片段着色器内部的平均值 当然 当计数器为零时 所得的颜色值变为 NaN 在混合过程中 NVidia 优雅地将 NaN 视为 0 值 但 Intel 没有这样
  • 无法将简单的无符号字节 RGB 纹理映射到四边形:

    我有一个非常简单的程序 将虚拟红色纹理映射到四边形 下面是 C 中的纹理定义 struct DummyRGB8Texture2d uint8 t data 3 4 int width int height DummyRGB8Texture2
  • glBitmap 问题

    我正在使用一些遗留代码来工作 它使用 glBitmap 调用来绘制位图图标 我的问题是 一旦你一次绘制大约 1000 个图标 它就会变得相当慢 它会减慢到大约 1 到 2 秒的刷新率 我想看看是否可以让它更快 首先我应该描述当前代码是如何工
  • OpenGL:仅使用一个帧缓冲区并切换目标纹理

    我是否可以只创建一个帧缓冲区对象并通过在需要时切换其目标纹理来实现相同的结果 而不是使用多个帧缓冲区对象 在所有情况下这都是一个坏主意吗 如果是 为什么 我一直在实现一个功能render SetTargetTexture 在我的程序的 AP
  • 着色器/矩阵问题 - 看不到对象

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

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

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 交错顶点提交如何提高性能?

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

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • DirectX 世界视图矩阵乘法 - GPU 或 CPU 的地方

    我是 directx 的新手 但令我惊讶的是 我看到的大多数示例中 世界矩阵和视图矩阵都是作为顶点着色器的一部分相乘 而不是与 CPU 相乘并将结果传递给着色器 对于刚性对象 这意味着您为对象的每个顶点将相同的两个矩阵相乘一次 我知道 GP
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex

随机推荐

  • OpenCV 使用 k 均值对图像进行色调分离

    我想在 C 接口 cv 命名空间 中使用 k means 和 OpenCV 对图像进行色调分离 但得到了奇怪的结果 我需要它来减少一些噪音 这是我的代码 include cv h include highgui h using namesp
  • 在 AngularJS 中下载 zip 文件

    尝试在 AngularJS 中下载 zip 文件 我查看了AngularJS 从服务器下载pdf文件 https stackoverflow com questions 25490007 angularjs download pdf fil
  • 按时间间隔分组

    我需要将我的表分组为 15 分钟的间隔 我可以这样做 select dateadd minute datediff minute 0 ts 15 15 0 sum goodpieces from StationCount Group by
  • 在mongodb中查找按距离排序的LineString附近的点

    我有一组代表街道 黑线 的点和代表地图上某个地点的点 红点 我想找到指定街道附近的所有点 按距离排序 我还需要能够指定最大距离 蓝色和绿色区域 这是一个简单的例子 我想用 near运算符 但它只接受Point作为输入 而不是LineStri
  • 如何确定您是否使用不带 $_SERVER['HTTPS'] 的 HTTPS

    我在网上看到很多教程说你需要检查 SERVER HTTPS 如果服务器连接受 HTTPS 保护 我的问题是在我使用的一些服务器上 SERVER HTTPS 是一个未定义的变量 会导致错误 我可以检查是否还有另一个应该始终定义的变量 需要明确
  • NSExtensionRequestHandling 不处理本机消息

    我正在尝试为我的本机应用程序创建 Safari Web 扩展 我想要一个带有按钮的弹出窗口 单击该按钮将与我的本机应用程序进行通信 在开始这部分之前 我在发送本机消息并在其中处理它时遇到了问题beginRequest类中的函数符合NSExt
  • 如何确定 UIWebView 的内容大小?

    我有一个UIWebView具有不同的 单页 内容 我想了解一下CGSize内容以适当调整我的父母视图的大小 显而易见的 sizeThatFits 不幸的是只返回 webView 的当前帧大小 事实证明 我的第一个猜测是使用 sizeThat
  • 使用继承时出现重复的外键

    我创建了这些类 以便通过 EntityFramework 6 代码优先方法生成数据库模型 public class Vehicle public long Id get set public long ResponsiblePersonId
  • 卡兹马兹动画

    我正在寻求帮助 我想在 Matlab 上为 Kaczmarz 方法制作动画 它的方法允许通过在超平面上的串行投影解向量来找到方程组的解 该解向量由系统方程组给出 我想制作该矢量移动的动画 就像该点在投影矢量上一样 System of equ
  • Joomla 3.2.3 精选文章排序

    在 Joomla 3 2 3 中 我无法像 J 1 5 x 那样进行文章排序 我想让首页文章排序像我在管理员区域中定义的那样 我尝试了几种方法 但仍然没有任何成功 已经 1 周了 我最后一次尝试的是这样的 a Content gt Feat
  • 如何以编程方式获取类依赖项及其各自的文件位置?

    我需要获得给定项目的类之间的某种依赖关系图 即该特定类使用的所有类 我想知道给定的类正在使用哪些类 以便以后可以在项目中找到它们的文件路径 考虑以下简单示例 public class Dog Animal IBark public void
  • OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等

    我正在重写大部分纹理代码 我希望能够指定某些内部格式 GL RGB8I GL RGB8UI GL RGB16I GL RGB16UI GL RGB32I 和 GL RGB32UI 这些标记在 OpenGL 2 中不存在 当将这些内部格式指定
  • 无法使用 pip 安装 Openvino

    我正在尝试安装 Openvino 将 Keras 模型转换为推理引擎的表示形式 我正在运行命令 python3 openvino tools mo mo tf py model 13 h5 input shape 180 180 这会返回错
  • 我如何知道 viewScope 变量是否已初始化

    在应用程序中 我需要知道 viewScope 变量是否已初始化 创建 viewScope 变量时 该值可能为 null 所以 viewScope isEmpty SomeName 并没有告诉我它已经被初始化并且答案为 null 或者它还没有
  • 标签周围的填充在 Internet Explorer 中不起作用

    我无法让 IE 填充 标签正常工作 这仅适用于 Firefox Safari Chrome 但不适用于 IE 请帮忙 我的简化 HTML 代码如下所示 div table tr td a style padding 20px backgro
  • 在 R 中,如何将两个 XML 文档合并为一个文档?

    我正在从基于 XML 的 API 查询数据 API 响应是分页的 因此我必须进行大量查询才能获取完整的数据集 Using read xml来自xml2包中 我可以轻松地发出每个请求并将其保存为 XML 文档 但我一直无法弄清楚如何使用该库将
  • 类型错误:(0,_schemaUtils.default)不是函数

    我有一个简单的 React 应用程序创建create react app在本地主机上运行良好 我现在正在尝试 Dockerify 该应用程序 这是我的 package json name yeet version 0 1 0 engines
  • SSIS 2008 中 ADO NET 源和 OLE DB 源之间的区别?

    谁能说出 SSIS 2008 中 ADO NET 源和 OLE DB 源之间的区别 它们在任何上下文中都相同吗 对于小型数据集 SSIS 2008 中的 ADO NET 源和 OLE DB 源之间几乎没有什么区别 它们之间的区别在于它们与其
  • 作为承诺的结果表示重新发送

    我不明白发生了什么事 Using q承诺 这有效 const deferred q defer deferred resolve Hellow const myPromise deferred promise router get item
  • OpenGL 统一缓冲区 std140 布局

    我正在尝试通过 GeForce 8600 GT 上的统一块将整数数组传递给片段着色器 一切均根据 GLSL version 330 在应用程序方面我有 int MyArray 7102 filling binding etc glBuffe