在 OpenGL ES 中绘制立方体需要多少个顶点?

2024-04-30

我在不同的在线站点中看到不同数量的顶点来表示 OpenGL ES 中的同一个立方体。 例如,这是一个:

float vertices[] = { -width, -height, -depth, // 0
                              width, -height, -depth, // 1
                              width,  height, -depth, // 2
                             -width,  height, -depth, // 3
                             -width, -height,  depth, // 4
                              width, -height,  depth, // 5
                              width,  height,  depth, // 6
                             -width,  height,  depth // 7
        };  
  short indices[] = { 0, 2, 1,
                0, 3, 2,

                1,2,6,
                6,5,1,

                4,5,6,
                6,7,4,

                2,3,6,
                6,3,7,

                0,7,3,
                0,4,7,

                0,1,5,
                0,5,4
                         };

这是另一个:

float vertices[] = {
            //Vertices according to faces
                -1.0f, -1.0f, 1.0f, //Vertex 0
                1.0f, -1.0f, 1.0f,  //v1
                -1.0f, 1.0f, 1.0f,  //v2
                1.0f, 1.0f, 1.0f,   //v3

                1.0f, -1.0f, 1.0f,  //...
                1.0f, -1.0f, -1.0f,         
                1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, -1.0f,

                1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, -1.0f,            
                1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, -1.0f,

                -1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, 1.0f,         
                -1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, 1.0f,

                -1.0f, -1.0f, -1.0f,
                1.0f, -1.0f, -1.0f,         
                -1.0f, -1.0f, 1.0f,
                1.0f, -1.0f, 1.0f,

                -1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, 1.0f,           
                -1.0f, 1.0f, -1.0f,
                1.0f, 1.0f, -1.0f,
                                    };

OpenGL ES 中哪种表示形式性能最高(请注意,是 OpenGL ES 而不是 OpenGL)?当我想指定照明法线时,这是最好的表示。在我关于 SO 的其他方程式中,我的印象是我需要为立方体指定 24 个顶点,另一个说我需要 36 个顶点,还有一个说我需要不同的数字,以获得同一问题的矛盾答案。无论如何,我想知道技术上正确的正确单一答案。

我知道绘图有三角带或三角扇等概念,但就我而言,我使用的是:

gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);

所以这应该清楚地阐明了我的要求。


如果使用索引,则只需提供 8 个不同的顶点即可在 OpenGL ES 中定义立方体。例如:

static const GLfloat cubeVertices[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

static const GLushort cubeIndices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

在这里使用三角形条作为几何图形,我只需要提供 14 个索引来指定立方体。如果您愿意,您可以删除上述索引并按该顺序提供顶点。

genpfault 描述了向 OpenGL ES 提供纯三角形的情况,在这种情况下您需要 36 个顶点。正如您所看到的,其中许多顶点都是多余的,因此条带或索引可以减少您需要发送的几何图形。

埃里克(Eric)在他的评论中提出了一个很好的观点,即如果您需要为每个面提供纹理或颜色(似乎是你的目标 https://stackoverflow.com/questions/5019579/how-to-specify-color-per-side-of-a-cube-in-opengl-es-application)您将需要使用 24 个顶点或索引。您需要这个才能分别处理每张脸。

您的特定应用程序的最高性能取决于您运行该应用程序的硬件。例如,在 iOS 设备内部的 PowerVR 芯片上,Apple有话要说 http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html%23//apple_ref/doc/uid/TP40008793-CH107-SW1:

为了获得最佳性能,您的模型 应作为单个提交 未索引的三角形条使用 glDrawArrays 具有尽可能少的重复项 尽可能的顶点。如果你的型号 需要复制许多顶点 (因为许多顶点是由 未出现的三角形 依次在三角形条中或 因为你的应用程序合并了很多 较小的三角形条),你可以 使用获得更好的性能 单独的索引缓冲区和调用 改为 glDrawElements。有一个 权衡:无索引的三角形带 必须定期复制整个 顶点,而索引三角形 列表需要额外的内存 索引并增加了查看的开销 向上的顶点。为了获得最佳结果,请测试 您的模型同时使用索引和 未索引的三角形条,并使用 执行速度最快的一个。

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

在 OpenGL ES 中绘制立方体需要多少个顶点? 的相关文章

  • “这个 UIView 似乎是 NSISVariable 的委托,它对此一无所知。这是一个内部 UIKit 错误”错误

    我正在开发一个 opengl 项目 我使用了一些图像 2 个用于 x y 比例 和标签 8 在屏幕上显示比例 我的第一个观点是tableview我从那里去openglView 但每当我从openglView to the tableView
  • 具有不同 uv 坐标的 OpenGL ES 1 多重纹理

    我需要使用多重纹理渲染一个对象 但两个纹理对于同一对象具有不同的 uv 坐标 一张是法线贴图 另一张是光照贴图 请提供与此相关的任何有用材料 在 OpenGL ES 2 中 无论如何你都会使用着色器 因此 您可以完全自由地使用您喜欢的任何纹
  • 绑定第二个顶点缓冲区似乎破坏了我的第一个顶点缓冲区,OpenGL OES ios 5.1

    我正在创建两个不同的顶点缓冲区 使用两个不同的着色器来渲染它们 一旦我绑定第二个顶点缓冲区 我停放在第一个顶点缓冲区中的数据似乎已损坏或丢失 如果我只生成并绘制一个顶点缓冲区 如下所示 glGenBuffers 1 vb1 glBindBu
  • WebGL 中的 AlphaFunctions?

    是否可以实现透明度低于 0 5 的片段被丢弃 而 alpha 高于 0 5 的片段渲染为不透明的效果 从我读到的来看 glEnable GL ALPHA TEST glAlphaFunc GL GREATER 0 5 这将是我正在寻找的 但
  • 从帧缓冲区 GLSL 读取到 OpenCV

    我只是想向 cvMat 提供由片段着色器生成的纹理 屏幕上没有出现任何内容 我不知道问题出在哪里 这是在驱动程序中还是在 glreadPixels 中 我刚刚加载了一个 TGA图像 到片段着色器 然后对四边形进行纹理化 我想将该纹理提供给
  • Android——在 OnDrawFrame 方法之外将 GLSurfaceView.Renderer 置于睡眠状态(如 Thread.sleep(20))

    我想控制 GLSurfaceView Renderer 的渲染速率 我在扩展 GLSurfaceView 的类中实现了一个线程 并在 while true 循环中定期将其置于睡眠状态 这不会减慢渲染器的速度 有一个很好的答案here htt
  • 如何使用 GLshorts 表示法线坐标或纹理坐标?

    许多关于提高 iPhone 游戏性能的建议都围绕着向 GPU 发送更少的数据而展开 明显的建议是尽可能使用 GLshorts 而不是 GLfloat 例如对于顶点 法线或纹理坐标 使用 GLshort 作为法线坐标或纹理坐标时有哪些细节 使
  • 如何更改 OpenGL 中的旋转中心

    我有一个 3D 模型 OpenGL ES 1 1 iPhone SDK v3 0 这有点复杂 即数千个顶点和面 并且我想围绕模型中心或附近的 Y 轴旋转该模型 问题是 glRotate 围绕位于 附近的点旋转我的模型其底边之一的中心 不靠近
  • 访问被拒绝查找属性 ro.vendor.hwui.texture_cache_size

    在启动活动时我收到此错误 Access denied finding property ro vendor hwui texture cache size 在 Android OREO 之前一切都工作正常 但在 Android Pie 中却
  • 如果使用多个 EAGLView,则不会绘制纹理

    我在使用Apple EAGLView 和Texture2D 时遇到了一些问题 如果我创建 EAGLView 的实例并绘制一些纹理 效果会很好 但是 每当我创建 EAGLView 的第二个实例时 都不会绘制新视图中的纹理 作为 OpenGL
  • YUV420p 上的大量绿色 --> iOS 上 OpenGL 2.0 着色器中的 RGB

    我想使用 ffmpeg 和 OpenGL ES 2 0 为 iOS 制作一个电影播放器 但我有一些问题 输出 RGB 图像有很多绿色 这是代码和图像 480x320 宽度和高度 512x512 纹理宽度和高度 我从 ffmpeg AVFra
  • 在 OpenGL ES 1.1 中将多个纹理绑定到一个网格

    如果我有一个网格 例如有 6 个面的立方体 每个面分别由 4 个顶点组成 总共 24 个顶点 并且我想对每个面应用不同的纹理 我该怎么做 目前 我使用 glDrawElements 一次绘制整个网格 立方体的所有 6 个面 将所有索引提供到
  • WebGL:enablevertexattribarray索引超出范围

    这是我的顶点和片段着色器
  • 使用未声明的标识符“gl_InstanceID”

    大家好 我一直在IOS平台上尝试在OpenGLES2 0中进行实例化绘制 我的渲染代码 glEnableVertexAttribArray glVertexAttribPointer glDrawElementsInstancedEXT G
  • 渲染脚本渲染在Android上比OpenGL渲染慢很多

    背景 我想根据Android相机应用程序的代码添加实时滤镜 但Android相机应用程序的架构是基于OpenGL ES 1 x 我需要使用着色器来自定义我们的过滤器实现 然而 将相机应用程序更新到OpenGL ES 2 0太困难了 然后我必
  • 开发iPhone游戏需要什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 帮助理解 gluLookAt()

    想象一下你站在地上 抬头看着天空中的一个立方体 当你倾斜头部时 立方体就会移动 我试图在 iPhone 上使用 OpenGL ES 来复制这一点 方法是操纵相机的倾斜 同时查看围绕原点绘制的简单 3D 立方体 我正在使用gluLookAt
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • WebGL - 如何传递无符号字节顶点属性颜色值?

    我的顶点由具有以下结构的数组组成 Position colour float float float byte byte byte byte 传递顶点位置没有问题 gl bindBuffer gl ARRAY BUFFER this vbo
  • OpenGL ES 2.0 中的纹理点?

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到

随机推荐