问题标签 [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 投票
2 回答
326 浏览

c++ - 索引究竟是如何工作的?

据我了解,OpenGL 中的 indexing 或IBOs 主要用于减少为给定几何图形绘制所需的顶​​点数。我知道使用索引缓冲区,OpenGL 只绘制具有给定索引的顶点并跳过任何其他顶点。但这不是消除了使用纹理的可能性吗?据我所知,如果您跳过带有索引缓冲区的顶点,它也会跳过它们的顶点属性吗?如果我的顶点属性设置如下:

然后使用索引缓冲区glDrawElements(...),这不会消除纹理的使用,还是v_Position会“重用”?如果他们不这样做,我如何在使用索引缓冲区时纹理?

0 投票
1 回答
651 浏览

android - 在x或y轴上反射顶点后如何恢复CCW缠绕顺序?

我在 OpenGL 中渲染一个多边形,其中一个顶点数组被调用vertices,一个final索引缓冲区被称为DRAW_ORDERCCW 绕组。我启用了背面剔除,并使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER).

当我vertices通过矩阵变换在 x 或 y 轴上反射时,多边形被剔除,因为反射反转了顶点的方向,因此它们不再匹配DRAW_ORDER.

我可以通过禁用剔除来防止该问题,但为了性能起见,我宁愿找到一种方法来恢复vertices通过排列的方向。例如,如果多边形是三角形,我可以简单地在反射后交换第二个和第三个顶点以恢复 CCW 方向。如何将此方法扩展到具有任意数量的顶点和索引的多边形?

编辑:这是一个似乎适用于凸多边形但不适用于凹多边形的解决方案。

您可以在下图中看到该解决方案如何适用于椭圆(凸形)而不是星形(凹形)。

在此处输入图像描述

0 投票
2 回答
1636 浏览

c++ - 在 DirectX 11 中使用索引缓冲区;它怎么知道?

假设我为两个不同的网格创建了两个顶点缓冲区。

现在,假设我想使用索引缓冲区绘制其中一个网格。看这本书Practical Rendering and Computation with Direct3D 11它似乎并不像索引缓冲区的创建以任何方式引用顶点缓冲区,那么索引缓冲区如何知道(在输入组装期间)要作用的顶点缓冲区?

我做了一些没有答案的谷歌搜索,这让我假设我缺少一些明显的东西。

0 投票
0 回答
367 浏览

directx-11 - DX11:索引绘图不产生任何视觉输出

对于我们的学生项目,我一直在修改一个 OBJ 加载器,以便将模型导入我们的应用程序。它加载没有问题,并且在没有索引的情况下绘制它模型显然没有正确表示,因为我没有使用索引缓冲区)但是,DeviceContext->DrawIndexed在屏幕上绘制什么都没有。

无索引绘图

带索引的绘图

缓冲区创建方法:

绘制方法:

我到底在想什么?我看过几本关于索引绘图的书,看起来很简单。起初我认为缠绕顺序是相反的,但我通过简单地反转索引数组来检查这一点;同样的结果。

如果您需要更多代码,请告诉我,但我觉得这应该足够了。

提前致谢!

编辑:OT:我从来没有想过如何让我的代码正确格式化,所以我为此道歉,请随时分享这是如何完成的。

0 投票
1 回答
523 浏览

c++ - 一个一个地加载对象时,OpenGL索引缓冲区不起作用

我正在学习 OpenGL 并遇到了“障碍”。我使用索引缓冲区画了一些房子(块和金字塔)。当将所有顶点(来自所有房屋)加载到顶点缓冲区并使用 1 个大索引缓冲区时,这可以正常工作。现在我想为对象设置动画并将它们一个一个加载到顶点缓冲区中,这样我就可以一个一个地对对象执行转换。代码与一个大缓冲区没有太大区别,但是当我这样做时,我只是看到一些随机形状在屏幕上四处飞舞。我的代码如下:

我有一个包含 3D 对象列表的世界类,有一个所有顶点的大列表(用于试验目的),一个大的索引列表(也是试验)和一种将 Object3D 对象添加到世界的方法。

};

Object3D 类:

World AddObject 方法,简单地将对象添加到“objects”列表中,并将顶点和索引添加到“Vertices”和“Indices”列表中以创建一个大缓冲区:

当我使用所有顶点和索引(如下所示)渲染大缓冲区时,它工作正常。

}

当我循环遍历对象并将对象的顶点加载到缓冲区中时,一次一个对象(如下所示)它会显示一些随机的“形状”,这些形状会保持“四处射击”或快速变化。我在这里做错了什么?提前感谢您的任何建议。

更新缓冲区方法:

对于第一个 Render 方法(没有循环),缓冲区在 init 方法中创建一次,如下所示:

0 投票
0 回答
66 浏览

c# - C# Assimp lib 无法获取索引信息

我正在为 C# 使用 Assimp。我导入 fbx 文件。我正在尝试使用索引缓冲区渲染包含文件的多边形。我试着让他们喜欢:

我得到了指数的结果:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14....

如果我手动做:Indices = new short[] { 0,1,2 2,3,0 }我看到一张脸。

如何正确获取索引数据?或者 fbx(?) 中没有索引数据

0 投票
1 回答
57 浏览

opengl - IBO 中的三倍序列如何工作?

我正在分析一个混淆的 OpenGL 应用程序。我想生成一个.obj描述应用程序中显示的多面模型的文件。

所以我冻结了应用程序并挖掘出在 VBO 和 IBO 中设置的值。但 IBO 设定的价值观比我预想的要神秘得多。价值是

0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 5, 8, 3, 3, 9, 9, 10, 11, 12, 12, 10, 13, 14, 14, 10, 15, 16, 16, 17, 17, 7, 8, 8, 18, 18, 19, 20, 21, 21, 22, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 36, 37, 38, 38, 36, 39, 34, 34, 40, 40, 40, 41, 42, 43, 44, 44, 45, 45, 46, 47, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 61, 62, 62, 63, 63, 63, 64, 65, 66, 67, 64, 68, 68, 69, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 77, 78, 79, 80, 81, 82, 82, 80, 83, 83, 84, 84, 85, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 92, 93, 94, 95, 96, 96, 97, 97, 97, 98, 99, 100, 101, 102, 102, 100, 103, 103, 104, 104, 105, 106, 107, 107, 108, 108, 108, 109, 110, 111, 112, 112, 100, 100, 101, 113, 114, 114, ... (长度=10495)

如您所见,像 , 和 之类的索引增加40了三倍,因此既不设置, , , ,也不设置为将无法正常工作。6392108GL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUADSGL_QUAD_STRIPGL_POLYGONglDrawElements

是否有某种先进的技术可以在 IBO 中使用三重排序索引?这是什么意思?它的用途是什么?

0 投票
3 回答
2007 浏览

opengl - glDrawElementsBaseVertex 是如何工作的?

我有一个平面和一个索引缓冲区,或带有图像上标记的索引的 EBO:

在此处输入图像描述

现在,如果我打电话:

我明白了:

在此处输入图像描述

这个我明白。此外,如果我这样做:

在此处输入图像描述

这也是有道理的。但是当我更改其他参数之一时,我的理解完全崩溃了。如果我这样做:

它看起来像这样:

在此处输入图像描述

因此,通过将参数 3 传递给 basevertex 参数(最后一个),它开始使用索引,而不是从索引的 3 个位置开始,甚至不是从索引的 3 个三角形开始,而是从大约 6 个三角形开始,或更准确地说索引号 18。我无法理解这种行为。

此外,我已经阅读了这些函数中“索引”参数的矛盾含义:

我读过索引指针使您可以通过提供指针直接引用索引缓冲区,如果它为空,则索引缓冲区取自当前绑定的 GL_ELEMENT_ARRAY_BUFFER。然而,从一个版本的文档中它说:

indices 将字节偏移量(转换为指针类型)指定到绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区中以开始读取索引。

在另一个版本中它说:

indices 指定一个指向索引存储位置的指针。

如果我用倒数第二个参数(索引)作为 (void*)3 调用 glDrawElementsBaseVertex,我将第一个三角形绘制为红色。如果我指定 (void*)6 我没有突出显示三角形。如果我指定 (void*)9 我会突出显示第二个三角形。

我无法理解这一切。那么这个参数,indices,是不是一个可选的指针,指向你希望使用的索引,而不是使用当前绑定的元素数组缓冲区?

0 投票
0 回答
354 浏览

javascript - WebGL 使用索引缓冲区使用偏移量绘制球体网格时遇到问题

我正在尝试绘制一个球体网格,稍后我可以将其修改为看起来像一棵树的叶子。但是,我的 pointsArray 中也有一些顶点位于从我的球体网格生成的顶点之前。我有一个索引缓冲区,其中包含用于按顺序绘制每个三角形的索引,但我需要访问顶点的最后一部分,即我的球体网格,而不需要索引缓冲区从其他顶点绘制三角形。在这里,我为顶点、颜色和纹理坐标创建缓冲区,以将它们传输到我的着色器代码。我还为球体网格创建了一个索引缓冲区。

这是我的球体生成代码:

这是我在绘制其余顶点后尝试绘制球体的地方。

当此代码运行时,索引缓冲区从 pointsArray 的开头开始绘制,绘制整个建筑物。如何从 pointsArray 的偏移量开始仅使用球体网格的索引缓冲区

这是我尝试绘制网格之前的样子这是我尝试绘制球体网格时得到的结果

0 投票
0 回答
95 浏览

java - 使用索引缓冲区对象在 Android/Openegl 中创建 3d 环

在此处输入图像描述

现在我正在为 android/OpenGL 创建一个 3D 游戏,感觉是飞过用索引缓冲区对象制作的这种 3D 环,如图所示。

我的问题:实际上我的扭曲循环正在生成它应该的坐标,但是如果我翻译它就会被挤压,因为在这种情况下这会导致 Y 坐标与 z 坐标不匹配。
我尝试了几天来寻找一种方法来弥补这个问题但没有成功,你们中的任何人都可以说我在 OpenGL/android 中创建一个可翻译的 3D 环的方法,无论有没有我的基础知识都会很好地帮助我。

翻译 = 1

翻译 = 1

翻译 = 0

翻译 = 0