glDrawArrays 与 glDrawElements

2023-11-25

好吧,我仍然在努力让它发挥作用。我的代码的重要部分是:

def __init__(self, vertices, normals, triangles):
    self.bufferVertices = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB)
    self.vertices = vertices
    self.bufferNormals = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB)
    self.normals = normals
    self.bufferTriangles = glGenBuffersARB(1)

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
    glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)

    self.triangles = triangles
    glDisableClientState(GL_VERTEX_ARRAY) **(Not sure if any of the following influence in any way)** 
    glDisableClientState(GL_NORMAL_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)

从我目前读到的有关 VBO 的内容来看,我认为这里没有任何问题。现在我有了顶点、法线(尚未使用)和三角形索引缓冲区。现在进行实际抽奖:

def draw(self, type):
    glDisableClientState(GL_VERTEX_ARRAY)  
    glDisableClientState(GL_NORMAL_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
    **Again above line not sure if they have any use.**        
    glEnableClientState(GL_VERTEX_ARRAY)         
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glVertexPointer(3, GL_FLOAT, 0, None)

    glEnableClientState(GL_NORMAL_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glNormalPointer(GL_FLOAT, 0, None)

    if type == GL_POINTS:    
        #glDrawArrays( GL_POINTS, 0, len(self.vertices) );    
        glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
    else:
        #glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)**(If I uncomment this doesnt seem to make any difference?!)**
        #glDrawArrays( GL_TRIANGLES, 0, len(self.triangles) );  
        glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)**(What does it draw now since GL_ELEMENT_ARRAY_BUFFER_ARB is binded to 0 ?!)**

现在 glDrawArrays 可以工作了。但在我必须绘制三角形的情况下,它不会绘制我在 bufferTriangles 中定义的三角形(从我读到的内容来看,这是正常的,因为 drawArrays 不使用索引?或者我在这里错了?)。问题是,如果我尝试使用 glDrawElements 一切都会崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000003150ebbc
Crashed Thread:  0

Thread 0 Crashed:
0   com.apple.GeForce8xxxGLDriver   0x1a3e7050 gldGetTextureLevel + 743600
1   com.apple.GeForce8xxxGLDriver   0x1a3e7563 gldGetTextureLevel + 744899
2   GLEngine                        0x1a206eee gleDrawArraysOrElements_VBO_Exec + 1950

现在我在这里缺少什么?据我所知,我可能在某个地方传递了一个错误的指针?请注意,即使我尝试使用 glDrawElements(type, 24, GL_UNSIGNED_INT, 0) 它仍然会崩溃,即使定义的三角形数量要大得多,所以我认为它与大小没有任何关系。

问候, 博格丹

EDIT:好吧,现在我已经做了一些额外的检查,这是我目前的情况:我已将 len(triangles) 更改为 ADT.byteCount,但还没有解决方案。所以我检查了我获得的所有数据,如下所示: 顶点数组包含 ~60000 * 3 = 180000 个 GL_Float 类型的顶点条目,法线数组也是如此。由于只有 GL_UNSIGNED_SHORT, 0) 。我还检查了三角形数组中的所有数据都在 0 到 62534 之间,因为我在想也许某些超出范围的索引滑入了低谷。这里还有什么问题吗? 哦,glDrawElements(GL_POINTS, ...) 是如何工作的?它还需要某种索引吗?

EDIT2我已经更新了上面的代码,正如那里所说,现在绘制元素绘制我的 GL_POINTS,但我不确定他从哪里获得索引?或者在 GL_POINTS 的情况下不需要它们?对于 GL_TRIANGLES,它的工作原理如下,带有 glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles) 注释,但是既然元素缓冲区绑定到 0,那么这里又需要什么样的索引?另一件事是 glDrawElements 不会绘制 glDrawArrays 绘制的所有点。为了更好地解释:

glDrawArrays( GL_POINTS, 0, len(self.vertices) );

这正确地表达了我的所有观点:

glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)

这似乎明显比 glDrawArrays 绘制的点少得多。现在有趣的是,如果我传递像 10 * len(self.vertices) 这样的大小来绘制元素,它将绘制所有点(有些可能两次或更多;我可以检查这个吗?),但它不会崩溃吗?

Regards

EDIT3

有关数组的一些更精确的信息:

vertices - 浮点数组,

len(顶点) = 180000 字节数(顶点)= 720000

三角形 - numpy.uint16 的数组

len(三角形)= 353439 字节计数(三角形)= 706878 分钟(三角形)= 0 max(triangles) = 59999 ,所以它们应该指向有效的顶点

绘图完成:

glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)

UPDATE

好吧,当我以为我知道它应该如何工作时,我尝试跳过元素的视频并直接:

glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

现在,这不仅可以完美地绘制我所有的三角形,而且 FPS 也更好了。 VBO不是应该更快吗?什么可能导致上述方法有效,但以下方法崩溃:

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)

我没有使用 Python GL 的经验,但我想我发现了一些东西。你用len(self.triangles)在通话中glDrawElements,所以我想这给出了三角形数组中的索引数。但为什么然后使用len(triangles)尺寸为glBufferData并不是ADT.arrayByteCount就像其他电话一样。所以你的缓冲区太小了,因为它包含len(triangles)字节,尽管三角形包含无符号整数。如果三角形确实包含字节(我怀疑)你将不得不使用GL_UNSIGNED_BYTE in glDrawElements.

EDIT:根据您的编辑,我得到了更多答案。当然glDrawElements(GL_POINTS, ...)也需要指数。它只是使用每个索引来绘制一个点,而不是每三个索引绘制一个三角形。只是对于您通常不需要的积分glDrawElements,因为无论如何你都不会重用顶点,但你仍然需要它的索引。它不会神奇地变成glDrawArrays在幕后打电话。

请记住,vertices数组包含浮点数和glDrawArrays绘制顶点,所以你必须绘制len(vertices)/3顶点。请记住,元素是(单个顶点的)索引,而不是三角形,并且顶点是 3 个浮点数(或者您在glVertexPointer),不只是一个。

但如果你的triangles数组实际上包含 3 个索引的元组(因此len(triangles)是三角形计数而不是索引计数)你必须绘制3*len(triangles)元素(索引)。如果你的vertices数组包含向量而不仅仅是浮点数,然后绘图len(vertices)glDrawArrays 调用中的顶点是正确的。因此,很高兴看到他们的声明是确定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

glDrawArrays 与 glDrawElements 的相关文章

  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • 退出 glutFullScreen()

    我不明白为什么当我按 f 时它进入全屏但不退出全屏 在这个方法的开头我已经设置了bool fullscreen false 这是我的切换代码 case f toggle screenmode if fullscreen glutFullSc
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • CPU 到 GPU 法线映射

    我正在创建一个地形网格 然后这个答案 https stackoverflow com a 5284527 1356106我正在尝试将 CPU 计算法线迁移到基于着色器的版本 以便通过降低网格分辨率并使用在片段着色器中计算的法线贴图来提高性能
  • 法线在 openGL 中表现得很奇怪

    我一直在为 openGl 编写一个 obj 加载器 几何体加载得很好 但法线总是混乱的 我尝试在两个不同的程序中导出模型 但似乎没有任何效果 据我所知 这就是将法线放入 GL TRIANGLES 的方法 glNormal3fv norm1
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • WebKit 是否使用 OpenGL 来渲染 CSS 过渡?

    WebKit 是使用 OpenGL 来渲染 CSS 过渡 还是使用软件渲染 WebKit 只是一个前端 这取决于后端和硬件支持 谷歌浏览器使用skia http code google com p skia 作为后端 它可以使用软件或硬件
  • glBlitFramebuffer 渲染缓冲区和渲染全屏纹理哪个更快?

    哪个更快更高效 使用 OpenGL 纹理作为 CUDA 表面并在四边形上渲染 新样式 使用渲染缓冲区作为 CUDA 表面并使用 glBlitFramebuffer 进行渲染 None
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 三角形纹理映射OpenGL

    我正在开发一个使用 Marching Cubes 算法并将数据更改为 3D 模型的项目 现在我想在 OpenGL 中为我的 3D 模型使用纹理映射 我首先尝试了一个简单的示例 它将图片映射到三角形上 这是我的代码 int DrawGLSce

随机推荐

  • 解压类型列表

    假设我有一个只接受类型模板参数的函数 我无法更改它的定义 实现 template lt typename T gt void do it 现在我有一个以通常的方式定义的类型列表 也无法更改它 template lt typename Ts
  • 如何避免从 URL.getFile() 获取 URL 编码路径?

    我在尝试获取给定资源的路径时遇到以下问题 System out println nf new File getAbsolutePath System out println od new File this getClass getReso
  • 使用公制前缀格式化数字? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的工程符号 无论是公制前缀优于科学计数法可能有争议 但我认为它有其物理单位的用例 我环顾四周 但似乎 NET 没有内置类似的东西 还是我弄错了 任何实现这一目标的方法都可以 澄清一下 目标是将任
  • Linux下virtualenv中安装wxPython

    我正在尝试在 virtualenv 中设置一个 wxpython 正如许多地方所详述的 easy install pip install 不起作用 因为 setup py 不存在 我看到了有关如何在 Mac 上设置它的说明 但没有找到适用于
  • Bootstrap 3 Glyphicons CDN

    注意 Bootstrap 图标又回来了 after 这个拉取请求合并 经过过去几周的反复思考 我决定将 Glyphicons 图标字体恢复到主存储库 考虑到图标在 UI 中的流行程度 如果不将它们 或其他一些图标字体 包含在与 CSS 和
  • Javafx旋转标签问题

    当我尝试将标签旋转 270 度时遇到问题label setRotate 270 但标签文字消失 这就是代码示例 LineChart chart new LineChart new CategoryAxis new NumberAxis ch
  • Visual Studio 自动格式损坏

    我在 Windows 7 Build 7100 32 位上运行 Visual Studio 2008 sp1 我以前从未遇到过这个问题 即使是在不同的 Windows 7 RC 安装上也是如此 当我用 结束一个语句时或 或其他东西 通常VS
  • Visual Basic,如何读取数据网格中的每一行?

    我有一个名为 DataGridView1 的数据网格 A 列包含名称 B 列包含文件路径 如何为每一行运行一些代码 以这种方式遍历数据网格的正确术语是什么 我需要的示例 For each row in DataGridView1 Messa
  • 如何对因素水平进行分组?

    我有一个包含足球位置缩写的因子列 大约有 17 个唯一值和 220 个观察值 我只想拥有包含 17 个唯一值的三个因子级别 levels nfldraft Pos lt list Linemen c C OG OT TE DT DE Sma
  • 如何将 Twitter Bootstrap 工具提示绑定到动态创建的元素?

    我正在使用带有 JavaScript 的 Twitter 引导工具提示 如下所示 a rel tooltip tooltip 我的标记如下所示 a title Not implemented class btn i class icon f
  • 如何使用 Playground 在 Swift 中读取数据并将其写入文本文件? [复制]

    这个问题在这里已经有答案了 我通读了这些SO链接来寻找答案 1 在 Swift 中逐行读取文件 URL 2 从文本文件中读取和写入数据 链接 2 为我提供了解决方案 但问题是目录 默认是当前项目的Document目录 所以如果我想从中读取文
  • XCode 6.3 警告:“myObject”地址不等于空指针的比较始终为 true

    更新到 XCode 6 3 后 编译器开始发出此警告 Comparison of address of myObject not equal to null pointer is always true 这是我的一段代码 挠头 但没有找到任
  • 为什么 quarto 的 pdf 输出中没有显示从属关系?

    In the yaml of a quarto我有的文件 title Hey author name Birdy Bird affiliations University of Birds University of Hummingbird
  • 用于在 iOS 中扫描条形码(代码 39 格式)的免费 SDK [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想使用 iphone ipad 的相机扫描 Code 39 格式的 VIN 条形码 我尝试了 zxing 和 zbar 但它们效果不佳 大多数时候
  • 应用程序未显示在最近使用的应用程序列表中

    每当我将以下代码放入活动的清单条目中时 我的应用程序永远不会显示在 最近使用的应用程序 列表中
  • 在 OS X 上调试 MacPorts GCC 的问题

    对于使用 GCC 4 7 MacPorts 构建编译的程序 我似乎无法获得可读的调试输出 我尝试过 GDB 6 3 和 GDB 7 3 每个都有自己的问题 尝试使用 GDB 7 3 MacPorts 使用 GDB 7 3 我在启动时得到以下
  • Spark - 读取带有引号的 csv 文件

    我有一个 CSV 文件 其中的数据包含在双引号 中 0001 A 001 2017 01 01 12 0001 B 002 2017 01 01 13 我只想读取纯数据 没有 符号 spark read option encoding en
  • Android Room 一对多关系

    我正在尝试建立一对多关系 我在线检查了各种文章和教程 但所有示例都显示一个表与另一个表具有一对多关系 在我的要求中 我有两个表与另一个表具有一对多关系 检查下图 学生表有来自班级和学校表的 FK 大多数示例通过班级 学生或学校 学生解释一对
  • 此表单不安全自动填充仅在 Chrome 中关闭

    I get this error when trying to fill the form from chrome in my website 这是我提交表格后的结果 这种情况在任何其他浏览器中都不会发生 我需要做什么才能确保表单安全 我已
  • glDrawArrays 与 glDrawElements

    好吧 我仍然在努力让它发挥作用 我的代码的重要部分是 def init self vertices normals triangles self bufferVertices glGenBuffersARB 1 glBindBufferAR