OpenGL glDrawElements

     2023-02-22     88

关键词:

【中文标题】OpenGL glDrawElements【英文标题】: 【发布时间】:2016-10-23 16:12:00 【问题描述】:

给定一组面,每个面包含顶点数和指向向量 std::Vector 中顶点的指针,我想遍历所有面并使用 glDrawElements 绘制每个面:

编辑:我刚刚注意到我忘了激活 vertex_array

for(std::vector<Face>::iterator it = faces.begin();it != faces.end();++it) 
    const Face &f = *it;

    std::Vector<GLint> indices;
    std::Vector<GLfloat> positions;

    for(int i=0;i<f.vcount;++i)
        const Vertex &v = vertices[f.vertices[i]];

        positions.push_back(v.x);
        positions.push_back(v.y);
        positions.push_back(v.z);

        indices.push_back(f.vertices[i]);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_FLOAT,3*sizeof(GL_FLOAT),&positions[0]);                     

    glDrawElements(GL_POLYGON,indices.size(),GL_UNSIGNED_INT,&indices[0]);
    glDisableClientState(GL_VERTEX_ARRAY);
    positions.clear();
    indices.clear();

但显然这不能正常工作并且没有显示任何内容。

编辑:启用 GL_VERTEX_ARRAY 会在屏幕上绘制一些东西,但不是我试图创建的模型。所以地址似乎有问题。

【问题讨论】:

glVertexPointer 应该有 GL_FLOAT 而不是 GL_INT 作为第二个参数,3 * sizeof(GLfloat) 作为第三个参数。 另外,GL_POLYGON 不再是有效的绘图模式。从文档中:“符号常量 GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、GL_LINES、GL_LINE_STRIP_ADJACENCY、GL_LINES_ADJACENCY、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_TRIANGLES、GL_TRIANGLE_STRIP_ADJACENCY、GL_TRIANGLES_ADJACENCY 和 GL_PATCH 被接受。” @poetryofruins:“此外,GL_POLYGON 不再是有效的绘图模式”因此,glVertexPointer 在核心配置文件 OpenGL 中也不再可用。所以如果他能用一个,他就可以清楚地使用另一个。 我进行了建议的更改,但仍然没有任何内容。 你确定你的索引是正确的吗?如果它们不是从源数据中按顺序排列的,则顶点的位置与索引指向的位置完全不同。此外,如果(极有可能)在源数据中多次引用顶点,您可能会复制顶点数据。 【参考方案1】:

您的索引数组没有意义。索引glDrawElements 将仅引用您设置的顶点数组 - 并且您正在为每个单独的多边形设置一个新数组。

这意味着

indices.push_back(f.vertices[i]);

应该只是概念上的

indices.push_back(i);

这最终意味着您可以完全跳过索引而直接使用

glDrawArrays(GL_POLYGON,0,f.vcount);

请注意,您在这里所做的是一种非常低效的渲染对象的方式。如果您对整个对象使用单个绘制调用,您会好得多。您可以通过手动将多边形三角剖分为三角形作为预处理步骤来做到这一点。

【讨论】:

那行得通。但是我将如何使用索引。顶点数组是否应该保留每个循环,索引数组是否应该指向每个多边形的开始? 这取决于。在最简单的形式中,您只需为整个对象构建一个顶点数组,根本没有索引 - 您在构建数组时已经取消引用索引,就像以前一样。这意味着您将数组本身和绘图调用从内部循环移动到外部循环,并且内部循环将解包每个多边形。更好的方法是将所有不同的顶点打包到一个数组中,并构建一个索引数组,该数组将包含每个多边形的三角剖分。

OpenGL glDrawElements

】OpenGLglDrawElements【英文标题】:【发布时间】:2016-10-2316:12:00【问题描述】:给定一组面,每个面包含顶点数和指向向量std::Vector中顶点的指针,我想遍历所有面并使用glDrawElements绘制每个面:编辑:我刚刚注意到我忘了激活ver... 查看详情

glDrawElement 的 OpenGL 渲染问题

】glDrawElement的OpenGL渲染问题【英文标题】:OpenGLRenderingIssueWithglDrawElement【发布时间】:2012-11-0121:33:55【问题描述】:当谈到我应该为我的OpenGL延迟渲染使用什么函数时,我有点困惑。我有一个VBO列表(顶点缓冲区对象)每一个... 查看详情

OpenGL glDrawElements 没有颜色

】OpenGLglDrawElements没有颜色【英文标题】:OpenGLglDrawElementshasnocolor【发布时间】:2014-03-0713:50:32【问题描述】:我正在尝试使用我编写的着色器使用OpenGL绘制一个立方体,我可以看到形状但看不到颜色。#defineEDGE_LENGTH0.6enumVertexAtt... 查看详情

OpenGL - glDrawElements vs 顶点数组对象

】OpenGL-glDrawElementsvs顶点数组对象【英文标题】:OpenGL-glDrawElementsvsVertexArrayObjects【发布时间】:2016-06-2308:08:52【问题描述】:我需要帮助来了解它们之间的权衡。在我看来,glDrawElements()需要将索引数据“实时”作为参数。另一... 查看详情

glDrawElements中的OpenGL SegFault

】glDrawElements中的OpenGLSegFault【英文标题】:OpenGLSegFaultinglDrawElements【发布时间】:2014-09-2012:55:57【问题描述】:我对@9​​87654321@的调用产生了分段错误。如果我废弃索引并使用glDrawArrays,我的顶点缓冲区中的所有内容都会被绘... 查看详情

OpenGL- glDrawElements 只绘制第一个元素

】OpenGL-glDrawElements只绘制第一个元素【英文标题】:OpenGL-glDrawElementsonlydrawsfirstelement【发布时间】:2015-12-1123:47:59【问题描述】:大家好,我正在为我的游戏制作一个小3d引擎,并且我为顶点数组和VBO创建了一个类。它一直在工... 查看详情

OpenGL阴影映射,具有多个glDrawElements的帧缓冲区

】OpenGL阴影映射,具有多个glDrawElements的帧缓冲区【英文标题】:OpenGLshadowmapping,framebufferwithmultipleglDrawElements【发布时间】:2014-04-2702:35:45【问题描述】:我有一个由很多对象组成的场景,当我渲染它们时,我会遍历场景中的所... 查看详情

OpenGL 优化 - 重复顶点流或重复调用 glDrawElements?

】OpenGL优化-重复顶点流或重复调用glDrawElements?【英文标题】:OpenGLOptimization-DuplicateVertexStreamorCallglDrawElementsRepeatedly?【发布时间】:2013-08-0720:26:47【问题描述】:这是针对Android上的OpenGLES2.0游戏,但我怀疑正确答案适用于任何o... 查看详情

无法让 openGL 的 glDrawElements 与几何着色器一起使用

】无法让openGL的glDrawElements与几何着色器一起使用【英文标题】:Can\'tgetopenGL\'sglDrawElementstoworkwithgeometryshader【发布时间】:2017-11-2010:27:20【问题描述】:我已经附加了着色器,但我找不到任何关于如何使用glDrawElements和附加到着... 查看详情

OpenGL - VAO、VBO、IBO、glDrawElements 不显示

】OpenGL-VAO、VBO、IBO、glDrawElements不显示【英文标题】:OpenGL-VAO,VBO,IBO,glDrawElementsnotdisplaying【发布时间】:2012-07-2414:39:21【问题描述】:我无法让我的关卡数据显示在屏幕上。我正在使用我的着色器来正确渲染立方体,但不能正... 查看详情

调用 glDrawElements 时的段错误

】调用glDrawElements时的段错误【英文标题】:SegfaultwhencallingglDrawElements【发布时间】:2017-01-0406:30:16【问题描述】:我有一个在macOS上开发的OpenGL应用程序。我在我的代码中调用了glDrawElements的段错误。我正在链接OpenGL.framework文... 查看详情

glDrawElements中的index参数是啥意思?

】glDrawElements中的index参数是啥意思?【英文标题】:WhatisthemeaningoftheindexargumentinglDrawElements?glDrawElements中的index参数是什么意思?【发布时间】:2016-11-2708:03:00【问题描述】:有两个OpenGL文档页面对glDrawElements函数的“索引”参... 查看详情

Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题

】OpenglES2.0-glDrawElements(GL_TRIANGLES)的颜色不透明度问题【英文标题】:OpenglES2.0-ProblemwithcoloropacitybyglDrawElements(GL_TRIANGLES)【发布时间】:2019-12-3017:47:32【问题描述】:我在opengles2.0中创建了用于绘制正方形的简单c++类。它将正方... 查看详情

我的opengl学习进阶之旅使用gldrawelements绘制的时候,不绘制任何图元,报错1282即gl_invalid_operation

...司内部代码,不好拿出来,我这里模拟写一个demo,使用glDrawElements来绘制三角形图元,可以模拟出一样的 查看详情

OpenGL - 加载多面的正确方法

...(立方体有6个面)。如何用vbo画出每张脸?我需要调用glDrawElements6次吗?还是有另一个功能可以一次全部绘制?通常我是这样画的:for(inti=0;i<facesNum;i++)glDrawElements(GL 查看详情

为啥 glBufferSubData 需要等到 glDrawElements 不使用 VBO?

】为啥glBufferSubData需要等到glDrawElements不使用VBO?【英文标题】:WhyglBufferSubDataneedtowaituntiltheVBOisnotusedbyglDrawElements?为什么glBufferSubData需要等到glDrawElements不使用VBO?【发布时间】:2014-06-1413:48:10【问题描述】:在OpenGLInsights中,... 查看详情

glDrawElements:绘制的源纹理和目标纹理相同

】glDrawElements:绘制的源纹理和目标纹理相同【英文标题】:glDrawElements:Sourceanddestinationtexturesofthedrawarethesame【发布时间】:2018-06-0919:28:48【问题描述】:我正忙着将一些代码从OpenGL传输到WebGL2(进行决斗深度剥离),但我在控... 查看详情

将 glDrawElements 性能与预期 GPU 性能进行比较?

】将glDrawElements性能与预期GPU性能进行比较?【英文标题】:CompareglDrawElementsperformanceagainstexpectedGPUperformance?【发布时间】:2021-10-1816:35:09【问题描述】:我正在使用OpenGL4.5在集成的IntelUHD630GPU上渲染一个非常大的网格(高度图)... 查看详情