标签: index-buffer

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

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

现在,glDrawArrays一切都运作完美,但它 - 当然 - 效率低下.

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

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

让我们来看看:

private def parseObj(path: String): Model =
{
    val objSource: List[String] = Source.fromFile(path).getLines.toList

    val positions: List[Vector3] = objSource.filter(_.startsWith("v ")).map(_.split(" ")).map(v => new Vector3(v(1).toFloat,v(2).toFloat,v(3).toFloat))//, 1.0f))
    val normals: List[Vector4] = objSource.filter(_.startsWith("vn ")).map(_.split(" ")).map(v => new Vector4(v(1)toFloat,v(2).toFloat, v(3).toFloat, 0.0f))
    val textureCoordinates: List[Vector2] = objSource.filter(_.startsWith("vt ")).map(_.split(" ")).map(v => new Vector2(v(1).toFloat, 1-v(2).toFloat)) // TODO 1-y because of blender
    val faces: List[(Int, Int, Int)] = objSource.filter(_.startsWith("f ")).map(_.split(" ")).flatten.filterNot(_ == "f").map(_.split("/")).map(a => ((a(0).toInt, a(1).toInt, a(2).toInt))) …
Run Code Online (Sandbox Code Playgroud)

opengl algorithm scala .obj index-buffer

9
推荐指数
1
解决办法
311
查看次数

OpenGL:如何在一次调用中绘制多条线?

我想绘制多个不同长度的线条。所有顶点都在一个公共缓冲区中。

订单如下所示:

v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..对于每个顶点v_i_j,其中i是条带j的索引和条带中顶点的索引。

是否可以使用索引缓冲区来指定该缓冲区中每个条带的开始和结束索引?

或者有什么其他方法可以解决这个问题?

opengl vertex-buffer index-buffer

5
推荐指数
1
解决办法
1659
查看次数

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,103,103,104,104,105,106,107,107,108,108, 108,109,110,111,112,112,100,100,101,113,114,114,......(长度= 10495)

正如你可以看到指数喜欢40,63,92108是三倍,所以没有设置GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN, GL_QUADS,GL_QUAD_STRIP也没有GL_POLYGONglDrawElements将无法正常工作.

是否有某种先进技术在IBO中使用三重序列指数?这是什么意思?它用于什么原因?

opengl index-buffer

3
推荐指数
1
解决办法
40
查看次数

绑定到 VAO 后我可以 glDeleteBuffer VBO 和 IBO 吗?

我读过,VBO(顶点缓冲区对象)本质上保留了一个引用计数,因此,如果将 VBO 的名称指定给 ,那么glDeleteBuffers()如果活动的 VAO(顶点数组对象)仍然引用它,它就不会真正被忽略。这种行为类似于越来越多的新语言采用的“智能指针”。但在多大程度上这是正确的并且可以围绕它进行设计,以及它是否也适用于 IBO(索引缓冲区对象),我还没有找到任何相关信息。

如果一个 VBO 被引用它的 VAO 保持存活,并且我不打算在 VAO 死亡后更新它或使用它,我认为最好的做法是销毁我对它的引用。这样做合适吗?我可以对 IBO 做同样的事情吗?

c++ opengl vertex-buffer vertex-array-object index-buffer

3
推荐指数
1
解决办法
121
查看次数

索引到底是如何工作的?

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

attribute vec4 v_Position;
attribute vec2 v_TexCoord;
Run Code Online (Sandbox Code Playgroud)

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

c c++ opengl indexing index-buffer

1
推荐指数
1
解决办法
511
查看次数

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

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

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

opengl directx render index-buffer

0
推荐指数
1
解决办法
382
查看次数