问题标签 [vertex-array]

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 回答
821 浏览

opengl - 关于 GL_VERTEX_ARRAY 的问题

这只是出于兴趣,但是 GL_VERTEX_ARRAY 将“保持”并通过 drawArrays() 之类的东西渲染的顶点数量是否有限制?或者我理论上可以通过几百万个顶点并且仍然能够调用drawArrays()?

0 投票
1 回答
3266 浏览

optimization - 渲染优化

我听说更少的绘图调用 = 更快 隐含的教训是将尽可能多的顶点数据打包到尽可能少的数组中,以最大限度地减少绘图调用的数量。

我正在考虑在 OpenGL 之上编写一个渲染框架,将所有顶点数据打包到少量数组中,并在几个绘图调用中绘制整个场景。

我的问题是,如果在一次调用中进行大量绘图(例如 glDrawElements),这是否真的会更快结束?

我还听说,如果您尝试通过一次调用绘制太大的顶点数组,它将溢出缓存并且最终不会变得更快。

0 投票
1 回答
1887 浏览

c++ - 使用 OpenGL 在 C++ 中绘制具有大量数据点的散点图的最佳方法

我正在用 C++ 编写一个程序,它通过 UDP 套接字获取 4 维点数据,然后在 6 个单独的 2D 散点图中绘制数据。例如,如果我们将维度命名为:A、B、C、D,则六个二维图将是 AxB、AxC、AxD、BxC、BxD 和 CxD。在几个小时的过程中,该程序累积了约 50K 点。

目前我使用立即模式绘制每个点一次。我不会在绘制调用之间清除缓冲区,因此之前绘制的点会一直存在,直到缓冲区被清除。我对这种方法不满意,因为即时模式很慢且已弃用。当我必须清除缓冲区时,例如当窗口重新调整大小时,我会丢失所有以前绘制的数据。我想提出一个解决方案,在缓冲区被清除后允许数据持久化。此外,如果绘图也可以通过窗口重新大小轻松缩放,那就太好了。

我曾考虑为每个坐标系维护一个顶点数组(具有 2 个维度),但这需要 6 个单独的数组,并且需要 3 倍于维护具有所有 4 个维度的数组的内存。

我是否以正确的方式考虑这个问题?这个问题的正确解决方案是什么?

最终目标是拥有一个尽可能接近实时地显示数据的应用程序。

编辑是否有可能在它们进入时继续一个一个地绘制点,当我需要调整屏幕大小时,抓取屏幕的图像,然后显示该图像的调整大小版本?

0 投票
2 回答
1596 浏览

c++ - 纹理顶点数组中的每个多边形 - OpenGL

我正在尝试让我的渲染功能正常工作。我正在使用顶点数组。这是我的顶点结构。

这是我的渲染代码:

参数之一,GLuint* 纹理包含所有加载的纹理。所以行 int tex = region[i].meshptr->poly[j].tex; 返回的值 是这个特定多边形的纹理索引。渲染时如何将其绑定到每个多边形?如果您有任何问题,请告诉我。

我知道我需要使用 glClientActiveTexture() 但是一,它说它是未定义的,我找不到正确的标题,二,我不知道它是如何使用的。我找不到任何好的例子。那么,如果说多边形引用纹理索引 4,我该如何在使用 glClientActiveTexture 渲染时将其绑定到多边形。

0 投票
1 回答
3308 浏览

opengl - OpenGL实例化数组绘图

我有一个简单的 OpenGL 程序并试图绘制一个存储在顶点着色器中的实例化数组。我正在使用两个跟随着色器进行渲染:

顶点着色器:

片段着色器:

在我编译并验证了这些着色器之后,我创建了一个顶点数组对象并将其绘制成三角形条带:

绘图的视口设置为像 glViewport(0, 0, 800, 600) 这样的窗口大小。我将一个带有休闲代码的简单正交矩阵传递给 MVP:

初始化矩阵的位置:

问题是我的屏幕上没有三角条。我试图在没有 MVP 矩阵的情况下绘制顶点 (gl_Position = vec4(Position[gl_VertexID], 0.0, 1.0)) 但也一无所获。如何检测问题出在哪里?

0 投票
1 回答
1416 浏览

c++ - C++结构内存布局和OpenGL glVertexPointer?

我有以下结构来存储我的顶点数据。

我将顶点列表存储在 STL 向量中,如下所示:

当我尝试将其用作 OPEGL 中的顶点数组时,in 不会正确渲染。

因此,我尝试使用指针算法(假设这就是 OPENGL 处理数据的方式)来确认这些值,如下所示:

如果我直接从结构访问值,则值不相等。

这是否意味着 struct 不会连续保存值?

[编辑] 我刚刚注意到使用 sizeof() 而不是 12 可以解决以下问题:

但是我仍然很困惑为什么我的 hack 没有在内存中正确遍历?(为什么 qDebug 不打印相同的值?)

0 投票
1 回答
733 浏览

c++ - 使用 glVertexPointer 步幅变量绘制数组的奇怪结果

我有一个 Nx4 顶点数组,我想使用glVertexArray和绘制glDrawArray。作为二维散点图。我目前像这样初始化数组:

然后我绘制二维散点图:

正确显示如下:

在此处输入图像描述

注意:背景中的彩色方块是这样我可以轻松判断点是否落在正确的位置

但是,由于我只想要一个 2d 图,我想跳过 2 个未使用的维度。我试着告诉glVertexPointer我的顶点只有 2 个点,然后将顶点之间的步幅也设置为 2,但这似乎并没有像我认为的那样工作。

然而,当我绘制这个时,我得到了一个非常不同的结果,点显示在 XxY、YxZ、ZxW:

在此处输入图像描述

我是否误解了 stride 变量的正确功能?如果不是,我如何正确设置步幅,使底部图类似于顶部图?

0 投票
1 回答
1543 浏览

opengl - OpenGL缩放顶点数组

我有一个顶点数组,我绘制如下(我正在努力将其转换为单个 glDrawArrays 调用,所以这不是这里的问题):

这可行,但我想缩放正在绘制的线循环。我在调用 glDrawArrays 之前尝试调用glScaled,但是这些点没有显示出来。我会认为缩放只是将线循环缩放到位,但事实并非如此。

请注意缓冲区中的顶点何时未缩放,因为我希望能够以不同的比例重用相同的缓冲区。这个想法是我可以在不重新创建每个通道的数组的情况下以恒定的像素大小重新绘制形状。

谁能解释我做错了什么,或者这是否可能?

0 投票
5 回答
20751 浏览

opengl - VAO 和元素数组缓冲区状态

我最近使用顶点数组对象 (VAO) 编写了一些 OpenGL 3.3 代码,后来在英特尔图形适配器上对其进行了测试,令我失望的是,元素数组缓冲区绑定显然不是 VAO 状态的一部分,因为调用:

没有效果,而:

渲染几何。我认为这只是英特尔实现 OpenGL 中的一个错误(因为它在 GL_ARB_vertex_array_object(甚至在 GL_OES_vertex_array_object)中明确指出元素数组保存状态的一部分),但后来它发生在移动 NVIDIA Quadro 4200 上。这不好玩.

它是驱动程序错误、规格错误还是我的代码中某处的错误?该代码在 GeForce 260 和 480 上完美运行。

有人有类似的经历吗?

同样奇怪的是 GL_EXT_direct_state_access 没有将元素数组缓冲区绑定到 VAO 的函数(但它确实具有指定顶点属性数组和数组缓冲区的函数)。GPU制造商是在搞砸规格并欺骗我们,还是什么?

编辑

我原本不打算展示任何源代码,因为我认为这里没有必要。但根据要求,这是重现问题的最小测试用例:

上面的代码创建了一个包含三个四边形的顶点缓冲区,红色一个,蓝色一个和黑色一个。然后它创建三个指向各个四边形的索引缓冲区。然后创建并设置两个 VAO,一个应包含红色四边形索引,另一个应包含蓝色四边形索引。根本不应该渲染黑色四边形(假设定义了 BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER

这会将视口清除为灰色,并以重复的方式渲染蓝色或红色四边形(它还会打印哪一个)。虽然这适用于桌面 GPU,但它不适用于笔记本 GPU(除非定义了 VAO_DOESNT_STORE_ELEMENT_ARRAY_BUFFER 宏,否则会呈现黑色四边形。取消定义 BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER 宏会使四边形变为蓝色,因为蓝色索引缓冲区最后绑定。但它没有无论如何渲染红色四边形。

所以在我看来,这要么是我对 VAO 应该如何工作的理解上的致命误解,要么是我的代码中的错误,要么是驱动程序错误。

完整源
二进制文件(windows,32 位)

0 投票
2 回答
2664 浏览

java - 我应该使用几个 glDrawArrays() 还是将所有顶点收集到一个大 glDrawArrays 调用?

我正在开发一个个人 Java OpenGL (JOGL) 项目,并且正在使用一些具有单独绘制函数和顶点的自定义对象。

然后我遍历一大堆这些立方体,调用它们的绘制函数。我的问题如下:我是否应该将所有顶点收集到一个大 glDrawArrays 调用,即将所有顶点收集到一个大数组并绘制它?它对性能和fps有很大帮助吗?