问题标签 [index-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
638 浏览

opengl - 三角网格的索引缓冲区中有什么意义

假设我有三角网格,那么我在三角形之间有很多重复的位置,在这种情况下索引缓冲区可能会变得非常方便。

但是如果我还需要法线,那么就没有增益,因为所有三角形都有不同的法线。所以元组 { position, normal } 是唯一的。如果添加纹理坐标和其他功能,那么我不明白需要索引缓冲区的目的是什么?

0 投票
2 回答
1034 浏览

opengl - OpenGL - glDrawArrays 的索引/步幅参数的自动生成

我正在渲染具有大量数据点(> 1M)的网格结构。我的数据结构在图片中。

数据点的结构

所以我的索引缓冲区的内容看起来像这样0, 100, 1, 101, 2, 102, 3, 103, ...

我对我需要定义我的三角形条的索引缓冲区的巨大尺寸感到有点恼火。是否有可能告诉 OpenGL 以所示方式自动生成这些索引?或者也许我没有想到的 glVertexAttribPointer 的一些技巧?

0 投票
1 回答
313 浏览

opengl - 原始装配性能

我目前正在尝试一些地形/高度图渲染。该地形的每个图块都使用 VBO 和 IBO 进行渲染。为了能够轻松绘制子图块,我使用 Morton 编码对索引进行了排序,此时我想到了一些关于原始组装的问题。

原始组装发生在顶点处理之后,但是

  1. GPU如何知道要处理哪些顶点?也许其中一些没有被索引。他们还得到处理吗?
  2. GPU如何知道必须以哪个顺序处理顶点?也许三角形使用 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 被处理?
0 投票
0 回答
86 浏览

opengl - 是否可以绑定一段索引缓冲区对象(IBO)?

让我们想象一个由 3 个对象(2 个盒子和一个平面)组成的场景。这 3 个网格存储在一个唯一的顶点缓冲区对象 (VBO) 中,如下所示:

我目前使用特定的索引缓冲区对象 (IBO) 来管理场景中每个网格的顶点索引,如下所示:

因此,要渲染我的场景,我需要一个唯一的顶点缓冲区绑定调用和 3 个索引缓冲区绑定调用,如下所示:

所以我想知道是否可以将所有索引(Box_1_index + Box_2_index + Box_3_index)存储在一个唯一的 IBO(如 VBO)中并使用而不是函数 glBindBuffer 但这次函数 glBindBufferRange 专注于我的 IBO 数据?

这样,我将拥有以下代码模式:

但是根据官方 OpenGL 文档,函数“glBindBufferRange”的第一个参数可以是 GL_TRANSFORM_FEEDBACK_BUFFER 或 GL_UNIFORM_BUFFER 但不是 GL_ELEMENT_ARRAY_BUFFER(我目前使用这个来绑定 IBO)。

那么,是否可以使用函数“glBindBufferRange”绑定包含在特定 IBO 中的特定数据段?

0 投票
2 回答
876 浏览

opengl - 使用 glDrawElements、Index Buffer 和启用的 GL_CULL_FACE 横向绘制圆柱体

我需要这个: 我需要什么气缸

我必须使用glDrawElements这个:glEnable(GL_CULL_FACE)

我尝试了什么:

糟糕的结果: 坏缸

但它可以用 delete 修复glEnable(GL_CULL_FACE);,但我必须使用它。

0 投票
1 回答
724 浏览

javascript - 在 WebGL 中的地图上(循环通过索引缓冲区)绘制单个多边形 - 建筑物、国家边界等

我正在使用 WebGL 在我的地图顶部的画布层上为 OSM 数据绘制线条和多边形。我编写了一个查询,它从planet_osm_polygon表中返回一个多边形列表。它将列表作为 JSON 对象返回。我在用

绘制多边形。

我的索引缓冲区如下所示:

在这里,对于多边形的索引,我使用了 0,1 1,2 和 2,3 作为对,它绘制了三个连续的线(作为围绕多边形的边界)我想绘制几个像这样的其他多边形。不使用 drawElements() 和索引缓冲区,只使用 drawArrays() 和 gl.LINE_STRIP 如下:

绘制多边形,但将每个多边形的一端与下一个连接(因为它是 LINE_STRIP)。

如何在我的地图上绘制单独的多边形?如何在这里为每个多边形使用我的索引缓冲区?

我不想使用任何外部库;只是普通的 JavaScript。我已经将 OSM 数据库中的经纬度坐标转换为 JavaScript 代码中的像素坐标。

使用 gl.LINE_STRIP

在此处输入图像描述

使用 gl.LINES 和索引缓冲区

在此处输入图像描述

0 投票
1 回答
1010 浏览

java - 如何设置索引缓冲区对象

我正在尝试使用 lwjgl(java OpenGL 绑定)渲染基本模型。我试图用我记得的东西尽可能多地用我自己的知识来做到这一点。我创建了一个像这样的vbo:

我对索引缓冲区对象已经了解了这么多:

我遇到的问题是我不知道将索引缓冲区绑定到 vao 的方法。对于包含我知道要使用的顶点数据的 vbo,GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);但我记得索引缓冲区的行为不同。这是一个学习过程,所以请以建设性的态度提出您的批评。

0 投票
1 回答
1941 浏览

opengl - 计算多维数据集的索引缓冲区大小

几周来我一直在学习计算机图形学课程,考试即将到来,但是我一直停留在索引缓冲区的话题上。

我知道顶点缓冲区存储网格的所有顶点。现在假设我们想要制作一个立方体。这意味着构建它需要 8 个顶点。每个顶点由 3 个坐标 (x,y,z) 组成,因此顶点缓冲区将占用 3 x 8 = 24 个单位的空间。

我读过索引缓冲区存储顶点的索引。所以我们的立方体顶点的索引将是 1 到 8。这意味着 1 个三角形占用 3 个单位的空间。

困扰我的一个问题是:我们的索引缓冲区需要多少空间单位?

我推断一个立方体有 6 个面。每个面由 2 个三角形组成。这意味着有 12 个三角形,因此索引缓冲区将占用 3 x 12 = 36 个单位的空间。(我使用这个网站得出这个结论:https ://msdn.microsoft.com/en-us/library/windows/desktop/bb147325(v=vs.85).aspx )。但是,我的答卷声称它是 32。

通常我不会费心在 StackOverflow 上发帖,只是问我的老师,但是他目前正在度假,直到考试结束后才会回来。因此,谁能向我解释索引缓冲区的大小是如何调节的?(假设它是 OpenGL 中使用的索引缓冲区,如果这很重要的话)。

0 投票
1 回答
522 浏览

algorithm - 将多个 .OBJ-index-buffers 映射/折叠到 OpenGL 的 1 个索引缓冲区

我正在尝试加载 .obj 文件并在 .obj 文件的帮助下绘制它glDrawElements

现在,glDrawArrays一切都完美无缺,但它 - 当然 - 效率低下。

我现在遇到的问题是,一个 .obj 文件使用多个索引缓冲区(对于每个属性),而 OpenGL 可能只使用一个。所以我需要相应地映射它们。

那里有很多伪算法,我什至找到了一个 C++ 实现。我确实知道很多 C++,但奇怪的是,我在 Scala 中的实现都没有帮助我。

让我们来看看:

val indices: List[Int]是我第一个天真的方法,当然是错误的。但让我们从顶部开始:

我加载文件并通过它。(我假设您知道 .obj 文件是如何组成的)

我阅读了顶点、纹理坐标和法线。然后我来面对。

现在,我的示例中的每个面都有 3 个值v_x, t_y, n_z来定义vertexAtIndexX, textureCoordAtIndexY, normalAtIndexZ. 因此,它们中的每一个都定义了一个顶点,而其中的三个(或文件中的一行)定义了一个面/多边形/三角形。

val vertices: List[Vertex] = for(face <- faces) yield(new Vertex(positions(face._1-1), textureCoordinates(face._2-1)))我实际上尝试创建顶点(一个目前只保存位置和纹理坐标而忽略法线的案例类)

真正的问题是这一行:

val indices: List[Int] = faces.map(f => f._1-1) // Wrong!

为了获得真正的指数,我基本上需要这样做不是

val vertices: List[Vertex] = for(face <- faces) yield(new Vertex(positions(face._1-1), textureCoordinates(face._2-1)))val indices: List[Int] = faces.map(f => f._1-1) // Wrong!

伪代码:

然而我完全被困住了。我尝试了不同的方法,但无法想出一个真正有效的干净整洁的解决方案。

像:

并且尝试f.distinct不起作用,因为没有什么可区分的,所有条目都是唯一的,如果我查看文件,这完全有道理,但这就是伪代码告诉我检查的内容。

当然,然后我需要相应地填写索引(最好是单线并具有很多功能美感)

但我应该试着找到重复的,所以......我有点困惑。我想我把不同的“顶点”和“位置”和所有的引用混在一起了。

那么,我是不是想错了,或者算法/思维是否正确,我只需要用漂亮、干净(并且实际工作)的 Scala 代码来实现它?

请赐教!

根据评论,我做了一些更新:

面孔仍然是:

有趣的事实我仍然不明白,因为那样我永远不会得到重复!

这意味着combinedIndices最后只保留自然数,例如:

0 投票
1 回答
342 浏览

java - 使用 LWJGL 在 glDrawElements 中偏移

我试图只渲染存储在 VAO 的索引缓冲区中的一些索引。

我知道第二个参数是要绘制的顶点数,在这种情况下是一个三角形,最后一个参数是作为指针的偏移量。但是如何使用 LWJGL/Java 指定这个指针呢?