问题标签 [gldrawarrays]

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

opengl-es - 使用每个四边形的一次绘制调用或对所有四边形使用一次调用来渲染独立的四边形?

在 WebGL 应用程序中,我必须绘制一堆四边形(越多越好,但 1000 应该是一个合理的上限)。每个四边形都有一些属性,例如颜色、位置、大小,也许还有一些材料属性。每个四边形大约有 10 个浮点数。着色器会用这些来做一些花哨的事情,但这在这里无关紧要。每个顶点可以描述为(位置+大小×(±1,±1,0))。现在我想知道如何最好地渲染所有这些四边形。我看到基本上有三个选项:

  1. 对所有参数使用uniforms,然后gl.drawArrays为每个四边形调用一次,使用一个数组缓冲区,其中仅包含角的相对坐标,即形式为(±1,±1) 的向量。这意味着一个由四个顶点组成的三角形带形成两个三角形。

  2. 对所有四边形一起使用一次gl.drawArrays调用。由于属性是每个顶点,而不是每个三角形,这意味着复制所有顶点的所有参数。此外,由于我不能让单个三角形条穿过所有顶点,因此我必须复制顶点,所以我基本上每个四边形有 6 个顶点,并且还不如使用不同的三角形而不是三角形条。这意味着每个四边形大约有 6×(10+2)=72 个浮点数,其中有很多冗余。

  3. 与 2 类似,但用于gl.drawElements避免重复形成每个四边形的两个三角形的顶点。所以我最终会得到 4×(10+2)=48 个浮点数作为属性,6 个整数作为索引。

我不确定采取哪种方法。他们中没有一个人感觉完全足够。1. 我的印象是每次调用仅绘制四个顶点的数组可能会浪费性能。我不确定是否可以并行渲染使用这种方法绘制的几个四边形。对于 2. 和 3. 我担心大量的数据冗余,以及保存数组所需的缓冲区大小。3. 稍微减少数据量,但可能由于间接而涉及额外开销。

我知道,就性能而言,最终答案是执行基准测试。但我想知道这里是否有一些既定的最佳实践,它不仅考虑我的一台开发机器上的性能,还考虑各种硬件、驱动程序、浏览器,还考​​虑其他方面,比如内存的可扩展性要求。这就是我在仍在努力实现适合现实生活比较的实现时提出这个问题的原因。

0 投票
0 回答
1015 浏览

c++ - glDrawArrays 与 glBegin - glEnd 渲染

我开始学习OpenGL;我试图显示几个顶点以渲染多边形。如果我使用以下代码,我的显示功能会成功:

但我无法使用glDrawArrays. 以下是完整的程序(在 OS X 上开发)。

我想知道我做错了什么。

0 投票
1 回答
860 浏览

java - 仅在 NVIDIA 上 glDrawArrays 上的 Java OpenGL EXCEPTION_ACCESS_VIOLATION

我正在使用 lwjgl 开发 Java 游戏,它是 OpenGL 实现。在我与使用 NVIDIA 而不是 AMD 的同事交换之前,从来没有任何问题,突然它在一条适用于 AMD 的线路上崩溃,但它只在代码中的那个点崩溃。这是最糟糕的部分,因为我使用相同的方法从 .obj 文件创建 VBO。我什至用相同的文件尝试过它,但在那一点上它仍然在所有其他场合都没有崩溃。可能是设置错误的标志或其他什么?我希望这里有人可以提供帮助。

结果错误:

0 投票
1 回答
1892 浏览

android - Android 5.1 崩溃 -- glDrawArrays GL_POINTS -- 致命信号 7 (SIGBUS),代码 2

几个月前,在我将我的 Nexus 4 更新到 Android 5.1(现在是 5.1.1 - 两个来自 Google 的库存工厂图像)之后,我的一个游戏在使用带有 GL_POINTS 的 glDrawArrays 绘制粒子时开始崩溃。我已经简化、重新实现了 Java 中的代码,并复制了崩溃。

崩溃始终是致命信号 7 (SIGBUS),代码 2 似乎是 OpenGL 驱动程序代码。

在这个测试中,对我来说,在 for 循环中有 118 个 drawPoint() 调用,一切似乎运行正常,但如果我尝试 119 个 drawPoint() 调用,则会崩溃(下一帧)。对 drawPoint() 的任何调用(超过 119 次)也会崩溃。

此 Java 代码在 Nexus 4 虚拟设备上运行良好。原始的 C 代码在 PC、iOS 和其他 Android 设备上运行没有任何问题。

这似乎可能是 Nexus 4 驱动程序问题。有任何想法吗?

日志猫:

MainActivity.java 的代码:

0 投票
2 回答
1110 浏览

python - 如何在没有着色器的情况下将 glDrawArrays 与纹理数组一起使用

我试图通过将我的纹理组合成数组纹理来优化我的代码(我意识到我不能使用纹理图集,因为大多数纹理都是重复的(在地面等))。我在 PyGame 和 PyOpenGL 工作,我以前从未使用过着色器。是否可以将单个阵列纹理与glBindTexture(GL_TEXTURE_2D_ARRAY, texname)并使用 3d 纹理坐标或其他东西来访问不同的图层?没有着色器甚至可能吗?

目前,我使用此函数为每个纹理调用 glDrawArrays:

0 投票
2 回答
15335 浏览

c++ - 来自矢量的带有 glDrawArrays 和 GL_LINE_STRIP 的折线图

如何使用 GL_LINE_STRIP 绘制多条线,但不能在这些线之间画一条额外的线,因为它会跳转到下一个值?看图片

在此处输入图像描述

现在红线是图中线的实际值,但黄色线是因为它完成了 line1 的值并继续下一个但仍然在这些值之间画一条线。

我正在使用的代码是这样的:vector1 包含所有行值。

所以我的问题是如何解决这个问题?所以它遍历向量并且只绘制线的值,而不是在完成绘制第一行后跳转时。

0 投票
1 回答
358 浏览

opengl - 为什么 glDrawArrays 在 Intel Mesa 10.3 上失败,同时使用 OpenGL 3.3 与 nVidia 一起工作

我正在尝试在 Intel GPU 上运行Piccante图像处理库。该库使用 OpenGL 着色器在图像上应用过滤器。该库根据其文档使用 OpenGL 4.0,因此我必须进行一些小修改才能使其在 Intel Mesa 10.3 驱动程序支持的 OpenGL 3.3 上下文中运行。

创建着色器时,我更改了以下行(在 buffer_op.hpp 中):

在此修改之后,我的程序在 nVidia GPU 上仍然可以正常工作,即使将 OpenGL 上下文初始化为 OpenGL 3.3(核心配置文件)。

在英特尔 GPU 上,该程序部分工作。只要图像是单通道的,它似乎就可以正常工作。当图像是 RGB 时,绘图现在更有效,我的图像最终变成黑色。

我已将错误追溯到(quad.hpp)中的以下行:

这是 Vertex Array Object 和 Vertex Buffer Object 的初始化:

这是我正在尝试运行的生成片段着色器:

我检查了顶点着色器和片段着色器是否成功编译和链接。这是否意味着着色器应该与 GLSL 3.3 兼容并且问题不在着色器内,而是在其他地方?

什么可能导致程序在 RGB 图像上失败,而它在单通道图像上运行良好?

当上下文在两者上都被初始化为 OpenGL 3.3 时,什么可能导致程序在 Intel Mesa 10.3 驱动程序上失败,而在 nVidia 驱动程序上正常工作?

渲染时似乎有很多原因可能导致GL_INVALID_OPERATION 。为了追查错误,我还可以检查哪些其他内容?

非常感谢您的帮助!

0 投票
1 回答
1445 浏览

c++ - 为什么使用 glDrawElements() 会导致分段错误?

我正在学习 OpenGL,我使用本指南本视频在 C++ 中编写了以下代码。我也使用 GLFW 来创建上下文,使用 GLEW 来创建 GL 函数 大多数 Shader 类都是从视频上复制的,

问题是使用 glDrawElements() 在主循环内渲染会导致分段错误:

而使用 glDrawArrays() 我可以毫无问题地绘制。

有谁知道这可能是由什么引起的?我认为该错误可能取决于 Shader 类的实现,因为我在其他未使用此类并且关心主函数中的着色器的程序中使用了 glDrawArrays()。

程序.cpp

着色器.h

着色器.cpp

0 投票
1 回答
374 浏览

windows - OpenGL:VBO 中的 glDrawArrays 和 glReadPixels

我正在尝试实现一个 VBO,其中我使用 glDrawArrays 来绘制三角形列表和 glReadPixels 来读取输出。glReadPixels 函数引发分段错误。

这是初始化和使用 VBO 的代码:

}

这是调用该函数并尝试读取结果的代码:

关于为什么它不起作用的任何想法?

编辑 像素缓冲区声明为:

并以大小 4*resolution*resolution 初始化

0 投票
2 回答
468 浏览

opengl-es - glDrawArraysInstanced 无法正常工作

我是opengl的新手

我正在创建两个立方体

当我使用 glDrawArraysInstanced 时。根据我的矩阵变换,我没有得到预期的结果

这是我使用不同数据的代码

这是我的结果

http://i.stack.imgur.com/RWAWQ.png

如果我使用统一变量并使用 gldrawarray 两次,那么我会得到完美的结果。这是我的代码和结果

http://i.stack.imgur.com/XnB9W.png

这是我的 glsl 代码

#版本 300 es

我也想知道这两种方法中的哪一种在 fps 的情况下表现更好

所有帮助将不胜感激。