glVertexAttribDivisor 和 glVertexBindingDivisor 有什么区别?

2024-05-26

我一直在寻找将属性与任意顶点分组关联起来的方法,起初似乎是我实现这一目标的唯一方法,但后来我偶然发现了这个问题 https://stackoverflow.com/questions/14169228/opengl-single-vertex-attribute-for-multiple-vertices and 这个答案 https://stackoverflow.com/a/14171762/2036035状态 :

然而,较新版本的 OpenGL 可以设置某个顶点属性的缓冲区偏移量前进的速率。实际上,这意味着给定顶点数组的数据得到复制到 n 个顶点在属性的缓冲区偏移量前进之前。设置该除数的函数是glVertexBindingDivisor.

(强调我的)

在我看来,答案似乎是声称我可以除以顶点数量而不是实例数量。然而,当我看到glVertexBindingDivisor https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexBindingDivisor.xhtml的文档并将其与glVertexAttribDivisor https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribDivisor.xhtml它们似乎都指的是发生在实例并不是vertices。例如在glVertexBindingDivisor的文档指出:

glVertexBindingDivisor 和 glVertexArrayBindingDivisor 修改渲染多个时通用顶点属性前进的速率实例单个绘制命令中的图元。如果除数为零,则使用绑定到绑定索引的缓冲区的属性每个顶点前进一次。如果除数非零,则每个除数属性前进一次实例正在渲染的顶点集的数量。属性被称为实例化的如果相应的除数值非零。

(强调我的)

那么这两个函数的实际区别是什么呢?


好的,首先讲一点背景故事。

从 OpenGL 4.3/ARB_vertex_attrib_binding 开始(又名:其中glVertexBindingDivisor来自,所以这是相关的),VAO在概念上分为两部分:描述单个属性数据价值的顶点格式数组,以及描述如何获取数据数组(缓冲区对象)的缓冲区绑定点数组、偏移量、步幅和除数)。顶点格式指定其数据来自哪个缓冲区绑定点,以便多个属性可以从同一个数组中获取数据(即:交错)。

当VAO被分成这两个部分时,旧的API被根据新系统重新定义。所以如果你打电话glVertexAttribPointer使用属性索引,此函数将为给定的格式设置顶点格式数据index,并且它将设置相同的缓冲区绑定状态(缓冲区对象、字节偏移量等)index。现在,这是两个独立的 VAO 状态数据数组(顶点格式和缓冲区绑定);该函数只是在两个数组中使用相同的索引。

但由于顶点格式和缓冲区绑定是separate now, glVertexAttribPointer也相当于说索引处的顶点格式index从索引处的缓冲区绑定获取其数据index。这很重要,因为这不是自动的; vertex_attrib_binding 的全部要点是一个索引处的顶点格式可以使用来自不同索引的缓冲区绑定。因此,当您使用旧的 API 时,它会通过链接格式将自身重置为旧的行为index绑定index.

现在,这一切与除数有什么关系?嗯,因为我刚才说的那件事确实是它们之间唯一的区别。

glVertexAttribDivisor是用于设置除数的旧式 API。它需要一个属性索引,但它作用于作为缓冲区绑定点一部分的状态(实例化是每个数组的构造,而不是现在的每个属性的构造)。这意味着该函数假设(在新系统中)属性位于index从缓冲区绑定点获取数据index.

而且我刚才说的话有点谎言。它enforces这个“假设”直接setting使用该缓冲区绑定点的顶点格式。也就是说,它执行与最后一步相同的操作glVertexAttribPointer did.

glVertexBindingDivisor是现代函数。它没有传递属性索引;它被传递一个缓冲区绑定索引。因此,它不会更改属性的缓冲区绑定索引。

So glVertexAttribDivisor与此完全等效:

void glVertexAttribDivisor(GLuint index, GLuint divisor)
{
  glVertexBindingDivisor(index, divisor);
  glVertexAttribBinding(index, index);
}

明显地,glVertexBindingDivisor不做最后一部分。

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

glVertexAttribDivisor 和 glVertexBindingDivisor 有什么区别? 的相关文章

  • 纹理映射 C++ OpenGL

    我已经阅读了相关内容 包括 Nehe 和此处的解决方案 但我找不到具体的答案 我正在尝试加载一张名为stars jpg 的照片 我想通过使用 uv 坐标映射它来使其成为场景的背景 方法是 glBegin GL QUADS glTexCoor
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • LibGDX纹理混合与OpenGL混合功能

    在 libGdx 中 我试图创建一个成形纹理 采用完全可见的矩形纹理并将其遮罩以获得成形纹理 如下所示 在这里我在矩形上测试它 但我想在任何形状上使用它 我调查过本教程 http www learnopengles com tag addi
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • Opengl 视频纹理

    我正在使用 Visual Studio 10 在 Windows 上用 C 开发 opengl 应用程序 目前我在立方体上使用静态纹理 但我想集成视频纹理 你知道我可以使用哪个库来打开和解密视频吗 查看 ffmpeg libavformat
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错
  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • 使用顶点缓冲区对象 (VBO) 渲染 Kinect 点云

    我正在尝试制作一个动态点云可视化工具 使用 Kinect 传感器每帧更新这些点 为了抓取帧 我使用 OpenCV 和 GLUT 来显示 OpenCV API 对于点 xyz 位置返回 640 x 480 float 对于 rgb 颜色数据返
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 3D 图形批处理

    很多网站 文章都说 批量 批 批 有人可以解释一下着色器中的 批处理 代表什么吗 即 是否 改变纹理 更改任意着色器变量 意味着某些东西不能 批处理 最简单的总结方法就是尝试尽可能少地调用 API 来绘制您需要绘制的内容 使用顶点数组或 V

随机推荐

  • 如何使用 re2 正则表达式否定字符串模式?

    我正在使用谷歌re2 https github com google re2 wiki Syntax用于查询目的的正则表达式普罗米修斯 https prometheus io docs prometheus latest querying
  • data.table 对数字和文本变量分别进行分组

    我正在尝试简化这个data table作用于数字变量和字符变量的两阶段过程 例如 取第一个元素textvar and sum每个数值变量 考虑这个小例子 library data table dt lt data table grpvar
  • 如何从 SQL Server 2008 返回由共享公共父级的多个选择构成的 XML

    我尝试过使用 FOR XML PATH FOR XML EXPLICIT 和 FOR XML AUTO 但数据从未采用正确的层次结构构建 基本上 我有一张父表 客户 和 3 个子表 每个表都有一个 customerid 列 Customer
  • php 日期函数和 Carbon 哪个更快?

    Carbon 是 DateTime 的简单 PHP API 扩展 我想知道我们可以通过 Composer 安装 Carbon 来使用日期时间函数 php 日期时间函数和 Carbon 哪个更快 我对您的评论做了一些测试 比较了 DateTi
  • 在 Java 中,三个 true 输入的 XOR 返回 true。为什么?

    下面的代码 System out println 1 0 0 true false false System out println 1 0 1 true false true System out println 1 1 0 true t
  • 通过javascript从文件夹中的mp3文件读取id3标签

    我想使用 javascript 从文件夹中的 mp3 文件读取 id3 标签并将其保存到文本文件中 这可能吗 谢谢 This man https github com Tim Smart node id3完成了解析 mp3 文件并提取标签的
  • Android 版 OpenGL ES 中的透明纹理

    我试图在 opengl 中设置四边形上纹理的透明度 使用混合函数没有帮助 谷歌上也没有任何帮助 有什么建议么 我遇到了类似的问题 一段代码可以正常工作 而另一段则不能 经过大量的日志记录和调试 我发现差异只是一行代码 在具有工作 Alpha
  • Python - 对象 MagicMock 不能在“await”表达式中使用

    当我尝试使用 MagicMock 在单元测试中模拟异步函数时 出现以下异常 类型错误 对象 MagicMock 不能在 await 表达式中使用 示例代码如下 source code class Service async def comp
  • 为什么 Django on_delete 规则不起作用?

    我有两个模型通过外键连接 如下所示 class Album models Model name models CharField max length 128 class Track models Model name models Cha
  • 提取数据框中值前后的 n 行

    我有一个数据框 其中包含某些值Mark柱子 我想提取n标记出现之前和之后的值 包括带有标记的行 我通过使用找到我需要的值indices lt which df Mark 1 where 1是我正在寻找的价值 现在我需要例如之前 5 行和之后
  • 使用输入按钮处理网站上的分页

    试图使用硒抓取这个网站 我的代码可以工作 但目前它只抓取第一页 该页面使用输入按钮作为浏览页面的一种方式 因此我想逐个单击每个按钮 但它不起作用 有没有人有任何其他方法来处理此类分页的导航 import requests from sele
  • Angular RouteReuseStrategy 后退按钮/跨模块

    有关我的应用程序的信息 Angular 12 由 3 个模块组成 每个模块都有一个带有列表的概述页面和一些详细信息页面 每条路线都有一个区域标签 因此我知道用户正在哪个模块中导航 所以我想实现 Angular 的 RouteReuseStr
  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • WPF DataGrid - 将 TimeSeries 与 MultiBinding 相结合,丢失更改通知。为什么?

    我有一个具有两个 ObservableCollection 的类 其中 TimeValue 是带有更改通知的自定义日期时间 值配对 通过 INotifyPropertyChanged 我将这些称为 目标 和 实际值 当我将它们绑定到图表时
  • 如何为带有未确定的“?”的Java通用Map添加值值类型?

    我在 JDK 8 示例中看到过这种声明 Map
  • 表单未将帖子值绑定到实体

    我有一个学说实体 一个表单和 2 个字段集 当我用值填充实体时 值会按预期合并到表单中 当我尝试从表单数据创建实体时 它保持为空 我一定是忘记了什么 但就是找不到它 我还有其他几种没有字段集的表单 它们按预期工作 有任何想法吗 下面发布了我
  • 如何证明2条sql语句是等价的

    我开始用连接和子语句重写一个复杂的 SQL 语句 并获得一个看起来更简单的语句 我通过在相同的数据集上运行并获得相同的结果集来测试它 一般来说 我如何 概念上 证明这两个陈述在任何给定数据集中都是相同的 我建议学习关系代数 正如 Mchl
  • 连接池

    我有以下代码 如果我在最后使用 conn null 我仍然使用连接池吗 我知道关闭连接是一个很好的做法 但是如何处理整个连接对象呢 public void ExecuteNonQuery SqlCommand Cmd Connection
  • 涉及数学的方法给出与计算器不同的答案

    我是java新手 所以请耐心等待 我试图从比赛总数中获得胜利的百分比 但我正在做的事情还很遥远 我获取百分比的方法如下 public double winPercentage int wins int total return wins t
  • glVertexAttribDivisor 和 glVertexBindingDivisor 有什么区别?

    我一直在寻找将属性与任意顶点分组关联起来的方法 起初似乎是我实现这一目标的唯一方法 但后来我偶然发现了这个问题 https stackoverflow com questions 14169228 opengl single vertex