问题标签 [vertex-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 回答
1642 浏览

java - 纹理顶点缓冲区对象

我想做的是用OpenGL绘制一个(大)地形。所以我有一组顶点,比如说 256 x 256,我存储在 VRAM 中的顶点缓冲区对象中。我正确地对它们进行了三角测量,所以我有一个用于面部的索引缓冲区。

我还加载了一个方形纹理,它必须应用于每个三角形。所以我对纹理坐标有疑问:

每个顶点包含在 4 个三角形中,这意味着它需要 4 个纹理坐标。但是 glDrawRangeElements() 需要与顶点一样多的纹理坐标。

所以我不知道如何用 VBO 做到这一点。也许有更好的概念来解决我的问题,或者我只是缺乏一个好主意。

提前致谢。

0 投票
5 回答
18759 浏览

performance - VBO 何时比“简单”的 OpenGL 基元 (glBegin()) 更快?

在多年听说顶点缓冲区对象 (VBO) 之后,我终于决定尝试使用它们(我的东西通常不是性能关键,显然......)

我将在下面描述我的实验,但长话短说,我看到“简单”直接模式(glBegin()/glEnd())、顶点数组(CPU 端)和 VBO(GPU 端)之间的性能无法区分渲染模式。我试图理解为什么会这样,以及在什么条件下我可以期望看到 VBO 显着超过它们的原始(双关语)祖先。

实验详情

对于实验,我生成了一个包含大量点的(静态)3D 高斯云。每个点都有与之关联的顶点和颜色信息。然后我在连续的帧中围绕云旋转相机,形成一种“轨道”行为。同样,这些点是静态的,只有眼睛在移动(通过 gluLookAt())。数据在任何渲染之前生成一次并存储在两个数组中以用于渲染循环。

对于直接渲染,整个数据集在单个 glBegin()/glEnd() 块中渲染,循环包含对 glColor3fv() 和 glVertex3fv() 的单个调用。

对于顶点数组和 VBO 渲染,整个数据集通过一个 glDrawArrays() 调用来渲染。

然后,我只是在一个紧凑的循环中运行它一分钟左右,并使用高性能计时器测量平均 FPS。

性能结果##

如上所述,我的台式机(XP x64、8GB RAM、512 MB Quadro 1700)和笔记本电脑(XP32、4GB 内存、256 MB Quadro NVS 110)的性能无法区分。然而,它确实随着点数的增加而按预期缩放。显然,我也禁用了垂直同步。

笔记本电脑运行的具体结果(使用 GL_POINTS 渲染):

glBegin()/glEnd():

  • 1K 点 --> 603 FPS
  • 10K 点 --> 401 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点数组(CPU 端):

  • 1K 点 --> 603 FPS
  • 10K 点 --> 402 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点缓冲区对象(GPU 端):

  • 1K 点 --> 604 FPS
  • 10K 点 --> 399 FPS
  • 100K 点 --> 95 FPS
  • 1M 点 --> 14 FPS

我用 GL_TRIANGLE_STRIP 渲染了相同的数据并且得到了类似的无法区分(尽管由于额外的光栅化而比预期的要慢)。如果有人想要,我也可以发布这些数字。.

问题)

  • 是什么赋予了?
  • 我必须做什么才能实现 VBO 承诺的性能提升?
  • 我错过了什么?
0 投票
2 回答
4907 浏览

c++ - 带有交错缓冲区的openGL glDrawElements

到目前为止,我只使用了 glDrawArrays 并且想转而使用索引缓冲区和索引三角形。我正在用纹理坐标、法线和顶点坐标绘制一个有点复杂的对象。所有这些数据都被收集到一个交错的顶点缓冲区中,并使用类似于(假设所有的 serup 都正确完成)的调用进行绘制:

这是否允许 m_indexData 也与我的法线和纹理坐标的索引以及标准位置索引数组交错?或者它是否假设一个单一的线性索引列表适用于整个顶点格式(POS、NOR、TEX)?如果后者是真的,如何用不同的纹理坐标或法线渲染相同的顶点?

我想这个问题也可以改写为:如果我有 3 个单独的索引列表(POS、NOR、TEX),其中后 2 个不能重新排列以与第一个共享相同的索引列表,那么呈现它的最佳方法是什么。

0 投票
1 回答
589 浏览

opengl - OpenGL顶点布局

问题是这样的:如果我有一个仅使用位置(3 个浮点数)定义的顶点结构,总大小为 12 个字节,那么事情就完美了。但是,如果我尝试对位置组件使用无符号字节或短字节(每个顶点 3 或 6 个字节),它会在 glDrawArrays 处因访问冲突而崩溃。知道为什么吗?

0 投票
2 回答
801 浏览

directx - XNA/DirectX:你应该总是使用索引吗?

我正在为植被实现广告牌,其中广告牌当然是由两个三角形组成的单个四边形。顶点数据存储在顶点缓冲区中,但我应该为索引烦恼吗?我知道,当您使用索引时,就发送到显卡的顶点而言,地形之类的节省可能会很大,但是在广告牌上使用索引意味着我每个四边形将有 4 个顶点而不是 6 个,因为每个四边形完全与其他人分开。

是否有可能使用索引实际上会降低性能,因为存在额外的间接级别?还是根本没有任何意义?

我问这个是因为使用索引会使事情稍微复杂化,我很想知道我是否没有做额外的工作,只会让事情变慢(无论是在理论上还是在实践中实际上很明显)。

这是使用 XNA,但应该适用于 DirectX。

0 投票
4 回答
4689 浏览

c++ - 一个顶点缓冲区中有多个网格?

我需要为每个网格使用一个顶点缓冲区,还是可以在一个顶点缓冲区中存储多个网格?如果是这样,我应该这样做,我该怎么做?

0 投票
1 回答
2166 浏览

c++ - 使用顶点缓冲区对象渲染不同的三角形类型和三角形扇形?(OpenGL)

大约一半的网格使用三角形,另一半使用三角形风扇。我想将这些卸载到顶点缓冲区对象中,但我不太确定如何执行此操作。三角扇都有不同数量的顶点......例如,一个可能有 5 个,另一个可能有 7 个。

VBO 使用普通三角形相当直接,但是我不确定如何将它们与三角形风扇或不同的三角形类型一起使用。我很确定我需要一个索引缓冲区,但我不太确定我需要做什么。

我知道在运行时每个风扇有多少个顶点......我想我可以用它来调用类似的东西glArrayElement

在这里的任何帮助将不胜感激!

0 投票
1 回答
1254 浏览

opengl-es - 具有法线渲染的 OpenGL ES 多边形(注意“ES!”)

好的......想象我有一个相对简单的实体,它有六个不同的法线,但实际上有接近 48 个面(每个方向 8 个面),并且面之间有很多共享顶点。在 OpenGL 中渲染它的最有效方法是什么?

我知道我可以将顶点放在一个数组中,然后使用索引数组来渲染它们,但是我必须不断打破我的渲染步骤来改变法线(即设置法线 1...渲染 8 个面...设置法线2...渲染8个面等)因此,我必须维护一个索引数组数组...每个法线一个!不好!

我可以做到的另一种方法是使用单独的法线和顶点数组(甚至将它们交错)但这意味着我需要法线与顶点的比例为一比一,这意味着法线将被复制 8 倍以上比他们需要的!在具有球形甚至曲面的物体上,每个法线很可能都是不同的,但对于这一点,这似乎真的是在浪费内存。

在一个完美的世界中,我希望我的顶点和法线数组具有不同的长度,然后当我去绘制我的三角形或四边形时,为该顶点指定每个数组的索引。

现在 OBJ 文件格式允许您准确指定...一个顶点数组和一个不同长度的法线数组,然后当您指定要渲染的面时,您指定一个顶点和一个法线索引(以及一个 UV 坐标,如果您也在使用纹理)这似乎是完美的解决方案!48 个顶点但只有 8 个法线,然后是定义形状面的索引对。但我不确定如何在 OpenGL ES 中渲染它(再次注意“ES”。)目前我必须“非规范化”(对不起那里的 SQL 双关语)法线回到 1 对 1顶点数组,然后渲染。只是浪费我的记忆。

有人帮忙吗?我希望我在这里遗漏了一些非常简单的东西。

标记

0 投票
2 回答
396 浏览

c++ - 使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?

我在函数中创建了一个 VBO,我只想返回 VBO id。

我在另一个函数中使用 glDrawArrays,我希望它绘制 VBO 中的所有顶点,而无需同时传递顶点数。VBO 还包含纹理坐标数据。

谢谢你。

0 投票
1 回答
639 浏览

c++ - 在 C++ 中使用 OpenGL 顶点缓冲区

我已经加载了一个 Wavefront .obj 文件并以立即模式绘制它,它工作正常。
我现在正在尝试使用顶点缓冲区绘制相同的模型,但我有一个问题。

我的模型数据按以下结构组织:

就像现在一样,我不认为有任何冗余数据,因为多个面结构可以指向同一个顶点、法线或纹理坐标。

当我为顶点位置、法线和纹理坐标制作 vbo 并使用 glBufferData 为它们分配数据时,我是否必须使用冗余数据制作数组,以便它们都以相同的顺序具有相同数量的元素?我想知道是否有一种更简单的方法可以用我已经组织模型数据的方式填充缓冲区。