问题标签 [vbo]

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

android - 为什么绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

我对 OpenGl 很陌生,在显示基于 VBO 的网格与普通 3D 对象混合时遇到了麻烦。我可以自己绘制带纹理的三角形,但是当我包含 VBO 网格时,三角形停止显示。在它们被网格替换之前,我快速闪现了三角形 - 大概是因为它们首先被渲染,它们在被禁用之前在第一帧中出现。

我试图禁用我启用的所有状态(反之亦然)并弹出我推送的所有矩阵等......

我展开了 OpenGL 调用以简化代码:

所以重新说一下,如果我删除了绘制 VBO 网格代码,三角形就会显示出来,但是一旦包含它,三角形就会消失。

任何想法,尝试的提示,我研究的方向或任何类似的东西都将不胜感激。如果我也在做任何不必要或愚蠢的事情,请随时指出。

干杯。

0 投票
2 回答
6137 浏览

c++ - OpenGL:如何使用深度排序的顶点数组设计高效的渲染系统?

人们经常告诉我至少使用顶点数组。但我认为这不是一个好主意,因为我使用glPushMatrix()withglTranslatef/glRotatef在 3d 世界中定位对象。

那么,我是否应该停止使用glPushMatrix()并“手动”计算世界中旋转/移动的顶点位置,然后将它们的顶点数据推送到顶点数组中,然后一次全部渲染?

但是,当我为屏幕上的所有对象使用不同的纹理表面时,所有这些都会变得更加混乱,这些对象也是深度排序的。

所以:

  1. 我还必须使用纹理表面 ID 存储每个对象。
  2. 我会按 Z 位置对所有可见对象进行排序(游戏只能自上而下查看,所有对象都是平面的)。
  3. 我会通过这个排序数组:
  4. 创建新缓冲区并仅将顶点/纹理坐标/颜色/法线复制到此缓冲区中:
  5. 每次纹理表面 ID 从以前的 ID 发生变化时,我都会绑定到正确的纹理 ID:
  6. 上传我收集的顶点数据。
  7. 释放用于临时顶点数组的缓冲区。
  8. 重复步骤 4-7,直到我完成了我首先排序的所有数据。
  9. 释放我的排序数组数据,然后重复步骤 1-9。

我做对了吗?

另外,我应该如何为要排序的对象设计数据结构?例如,std::vector用于存储每个对象的顶点数据是否很好?还是有更好的选择?我在想std::vector存储所有这些数据的方式如下:

另外,在第 4 步:在这种情况下是否可以使用已经存在std::vector的?我有一个想法,我必须使用原始数组,例如new float[100]将顶点数组发送到我的 GPU,或者我可以以std::vector某种方式(有效地)使用我已经存在的排序在这里,而不在每次纹理 ID 更改时创建新缓冲区?

0 投票
1 回答
1259 浏览

opengl - OpenGL VBO 不显示

我在用 VBO 绘图时遇到问题。使用即时模式,我可以轻松地绘制一个立方网格点,但速度很慢。我想使用 VBO 来尝试加快绘图速度。我正在使用 SDL/glew。我的输出是一个黑点。相同的 sdl / glew 设置代码适用于纹理三角形,但没有使用结构来存储数据 - 我想要一个用于缓存目的的结构,因此顶点颜色接近顶点位置。

设置 sdl / glew:

制作 VBO:

画:

0 投票
1 回答
2165 浏览

android - 在 Android 上使用 OpenGL ES 显示透明纹理的问题

我已经投入了一天多的时间来寻找有关如何在 Android 上使用 OpenGL 渲染透明纹理的解决方案。显然,其他人比我运气好,但在尝试了各种解决方案(例如OpenGL ES for Android 中的透明纹理)后,我仍然无法完成。

这是我的基本设置:

纹理通过...加载

...并且有迹象表明这会导致由于预乘 alpha 而导致的问题。但是 ReplicaIsland 确实也使用了 GLUtils 功能,而且游戏似乎没有透明图像的问题。

现在,如果我使用 Alpha 通道 (PNG) 绘制纹理,它们会显示为纯黑色。没有 alpha 的纹理以各自的颜色正确绘制)。我没有运气就应用了各种 glBlendFunc 调用,即

我也试过这个

结果总是纹理根本不可见(完全透明?)。

用于测试的图像来自 ReplicaIsland 项目,这些是标准 PNG。这也意味着使用的纹理符合 2 的幂规则 - 各种帖子中提供的另一种解决方案。我看到一个区别,即 ReplicaIsland 似乎主要依赖于 draw_texture 扩展,而我必须使用 VBO(以便能够应用旋转)。

帮助将不胜感激!谢谢本

0 投票
1 回答
1247 浏览

opengl-es - OpenGL ES:glBufferSubData 将网格填充到 VBO/IBO,然后 glDrawElements 只渲染第一个网格而不是全部

我的问题似乎很简单,但我就是不明白背后的原因:

  • 我有一个用 glBufferSubData 填充的顶点和索引缓冲区。有几个网格被一一填充到这个大 VBO 及其相应的 IBO 中
  • 然后我尝试用 glDrawElements 一个一个地渲染那些小网格

问题是,只有第一个网格被渲染 - 并且多次 - 在每个不同的网格应该存在的地方!

以下信息可能有用:

我以这种方式创建 VBO

然后像这样将每个网格填充到VBO中

并且以这种方式渲染网格

  • 绑定 VBO/IBO 并设置适当的客户端状态
  • 然后设置顶点、法线和 texcoord“指针”——它们指向 VBO 的开头加上它们在顶点“结构”中的偏移量
  • 并打电话gl.glDrawElements(GL10.GL_TRIANGLES, indicesNum, GL10.GL_UNSIGNED_SHORT, startIndexOffsetInBytes);
  • 最后,取消绑定 VBO/IBO 并禁用客户端状态

我调试了代码,我确定sizeInBytes,和是正确的值(以字节为单位:))) 并且是网格中索引/顶点的数量(要渲染)。startOffsetInBytesnumBytesToCopystartIndexOffsetInBytesindicesNum

一个可疑的地方是设置顶点/法线/texcoord 指针——它们只设置一次——并设置到 VBO 的开头。也许我需要在每次调用 glDrawElements 之前设置它们?

0 投票
2 回答
593 浏览

opengl - VBO 中的交错是否有助于或阻碍性能?

使用 OpenGL VBO 时,您可以交错数据

例如,您甚至可以将顶点数据与供 CPU 而不是 GPU 使用的其他数据交错。

交错对主流独立显卡和集成显卡的性能有帮助还是有阻碍?

0 投票
1 回答
2241 浏览

opengl - 在 jogl 中使用顶点缓冲区,当三角形太多时崩溃

我使用 Jogl 用 Ja​​va 编写了一个简单的应用程序,它可以绘制 3d 几何图形。可以通过拖动鼠标来旋转相机。该应用程序工作正常,但使用 glBegin(GL_TRIANGLE) ... 绘制几何图形太慢了。

所以我开始使用顶点缓冲区。这也可以正常工作,直到三角形的数量大于 1000000。如果发生这种情况,显示驱动程序会突然崩溃,我的显示器会变暗。缓冲区中的三角形数量是否有限制?我希望以合理的帧速率渲染 1000000 个三角形。

我不知道如何调试这个问题。令人讨厌的是,每次启动后我都必须重新启动 Windows,因为我没有其他方法可以让我的显示器再次工作。谁能给我一些建议?

顶点、三角形和法线存储在数组 float[][] m_vertices、int[][] m_triangles、float[][] m_triangleNormals 中。我初始化了缓冲区:

然后,场景被渲染:

0 投票
1 回答
301 浏览

opengl - 在空间中复制具有来自 GPU 内核的位置和方向的对象

语境

出于科学目的,我正在使用 GPU 编程(OpenCL 和 CUDA,但当然不是同时)进行群体模拟。我使用 OpenGL 进行显示。

目标

我想以最有效的方式在不同的位置和不同的方向上绘制相同的对象 - 即蜂群粒子,可以是一个简单的 2D 三角形 - N 次:

  • 对象总是完全相同的

  • 位置和方向在 GPU 上计算,因此存储在 GPU 内存中

  • 粒子数 N 可以很大

当前解决方案

到目前为止,为了避免将数据发送回 CPU,我将位置和方向数组存储在 VBO 中并使用:

以颜色编码的速度绘制一组点,而无需将数组复制回 CPU。

我想做的是使用类似的方式绘制一个完整的对象而不是一个简单的点,不将 VBO 复制回 CPU。

基本上,我想在 GPU 上存储对象的模型(显示列表?顶点数组?),并使用 GPU 上的位置和方向来绘制对象 N 次而不将数据发送回 CPU

有可能吗?怎么做?否则,我该怎么做?

PS:我喜欢保持代码干净,所以我宁愿将显示问题与蜂群内核分开。

0 投票
1 回答
822 浏览

opengl - opengl vbo 建议

我有一个在 Blender 中设计的模型,我将在使用 opengl 构建的游戏引擎中渲染它,然后将其导出到 collada。搅拌机中的模型分为几组。这些组包含具有自己索引的顶点法线和纹理。如果我将每个组渲染为单独的 vbo 或者我应该将整个模型渲染为单个 vbo,这是一件好事吗?

0 投票
2 回答
10765 浏览

c++ - OpenGL VBO 更新数据

我必须绘制一个包含几千个顶点的缓冲区。我正在使用 vbo 来存储数据。

我知道我将不得不多次更新 VBO - 但一次只能更新一小部分。

所以我想知道这样做的最佳方法是什么:

  1. 将 VBO 拆分为更小的 VBO(保持 300 个顶点),然后通过 1 个调用更新单个 VBO?
  2. 一个大 VBO 并使用大量电话glBufferSubData()
  3. 使用glMapBuffer()和一个大 VBO?