在 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 中绘制立方体需要多少个顶点? 的相关文章

  • 如何将文本渲染为位图并绘制它

    我是 android 新手 我的小组目前正在使用 opengl es 2 0 使用 GlSurfaceView 创建图形应用程序 我们最近在绘图上显示了网格和刻度线 现在我被分配了实现数字刻度并将 x 和 y 轴标记为 X 和 Y 的任务
  • OpenGL固定功能着色器实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何包装器可以在 OpenGL ES 2 0 之上模拟 OpenGL ES 1 1 API 我进
  • 防止没有 GL 扩展的设备从 Google Play 下载应用程序

    是否可以使应用程序在 Google Play 商店中没有特定 OpenGL ES 扩展的设备上不可用 Since
  • GPUImage 的 GPUImageOpacityFilter 行为不符合预期,不会更改 Alpha 通道

    我正在尝试做一个Overlay Blend具有相机源输出的库存图像 其中库存图像的不透明度小于 100 我想我可以放一个GPUImageOpacityFilter在过滤器堆栈中 一切都会好起来的 GPUImageVideoCamera gt
  • iOS glGenerateMipmap 是同步的,还是可能是异步的?

    我正在开发一个在 OpenGL ES 中使用大纹理的 iPad 应用程序 当场景首次加载时 我在天花板上看到了几帧的大型黑色伪像 如下图所示 就好像更高级别的 mipmap 尚未填充 在后续帧中 天花板正确显示 当我开始使用 mipmapp
  • Android GLSurfaceView 具有可绘制背景

    我有一个带有可绘制对象作为背景的 GLSurfaceView 但是在没有 surfaceView setZOrderOnTop true 的情况下渲染时只有背景可见 我需要避免使用 setZOrderOnTop true 因为在 GLSur
  • LibGDX - 着色器适用于桌面但不适用于 Android

    我编写了一个简单的程序 可以在 3D 环境中渲染球体 并根据球体周围的四个光源为其着色 当我在桌面上运行该程序时 它工作得很好 但在 Android 设备上 球体只是纯色的 下面是一些图片来说明我正在谈论的内容 gt Desktop gt
  • Android OpenGLES 渲染到纹理

    我为 iPhone 编写图形应用程序 并且希望将我最新的应用程序 Layers 移植到 Android 平台 Layers 是一款绘画应用程序 允许用户在屏幕上绘画并使用不同的画笔 颜色等创建多层绘画 并导出到 PSD 它有桌面同步 涂抹工
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • OpenGL ES 2.0 中的纹理点?

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

    我很困惑为 iPhone 编写游戏时最好的方法是什么 游戏将使用 OpenGL 渲染 但我很好奇创建开始屏幕 菜单 高分页面等 您是否使用 OpenGL 完成所有这些操作 或者创建额外的 UIView 并使用 UIKit 我认为没有最好的方
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • OpenGL ES 片段着色器显然不可能返回白色

    这是一个奇怪的现象 我有一个片段着色器 据我所知只能返回黑色或红色 但它将像素渲染为白色 如果我删除一根特定的线 它会返回我期望的颜色 它适用于 WebGL 但不适用于 Raspberry Pi 上的 OpenGL ES 这是着色器代码 如
  • 为什么在 iPhone 应用程序中调用 glMatrixMode(GL_PROJECTION) 会给我 EXC_BAD_ACCESS ?

    我有一个 iPhone 应用程序 我在应用程序 DidFinishLaunching 中调用这三个函数 glMatrixMode GL PROJECTION glOrthof 0 rect size width 0 rect size he
  • 使用 Nexus 10 在 Android 4.3 上滚动时性能不佳

    我的应用程序有一个带有一些滚动的列表视图 在我测试过的所有手机 Nexus One Nexus 4 和 Galaxy S3 4 上都表现得非常好 以 60fps 滚动 但 Nexus 10 上的表现很糟糕 大概在 15fps 左右 我已经将
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • Android 版 OpenGL ES 中的透明纹理

    我试图在 opengl 中设置四边形上纹理的透明度 使用混合函数没有帮助 谷歌上也没有任何帮助 有什么建议么 我遇到了类似的问题 一段代码可以正常工作 而另一段则不能 经过大量的日志记录和调试 我发现差异只是一行代码 在具有工作 Alpha
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • ios 8 opengl es 1.1 已停产?

    我们即将在 iOS 应用商店上推出一款游戏 最近我们发现它无法在 iOS 8 上运行 游戏加载到黑屏 但其他一切似乎都可以运行 可以听到音乐 对触摸屏有反应 但显示屏上没有任何反应 我们的引擎相当旧并且使用 OpenGL ES 1 1 我现

随机推荐