Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在OpenGL ES中渲染对象组

在OpenGL ES中渲染对象组
EN

Stack Overflow用户
提问于 2012-06-26 22:17:07
回答 1查看 1.2K关注 0票数 3

我是OpenGL ES的新手,我正在编写一个iPad应用程序,它需要我加载一个Wavefront Obj文件,在OpenGL中绘制它们。我的问题是关于渲染Obj文件组的最有效方法。

关于我所掌握的一些背景知识。Obj模型的所有解析/加载工作都在进行中(我使用GLM加载文件),因此繁琐的工作就不复存在了。对于基础项目,我在XCode中扩展了OpenGL ES游戏模板,并删除了对着色器的所有调用。我使用GLKit的BaseEffect为我的着色器,并加载我所有的顶点数据使用VAO和VBO。对于一个有16个组的模型,在初始化时,我将每个组分成一个VAO,每个VAO有一个用于顶点数据和法线(交错)的VBO,以及另一个用于纹理坐标的VBO。每组都有一种材质(有时还有一种纹理,但为了解决这个问题,只假定材质)。

在我的渲染例程(下面的伪代码)中,我循环遍历我为每个组创建的所有VAO,将组的材质应用到BaseEffect,然后使用DrawArrays绘制它(而不是使用DrawElements,因为我已经设置了VBO,所以数据已经按索引顺序排列,尽管它可能没有在图形内存中那么有效)。这是可行的,我可以用不同的材质绘制每个模型,但随着组数的增加,我的帧率会下降,因为我必须花费更多的时间在渲染函数中循环遍历每个组。对于较低的模型数,这是很好的,但随着我向应用程序添加更多的模型,帧速率远低于30fps,这是我的基准。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (groups in model)
{
    Bind VAO for this group

    Apply Material or Texture (if one exists) for this group using GLKBaseEffect

    Call PrepareToDraw for GLKBaseEffect

    DrawArrays passing it the vertex count for this group

    glBindVertexArray(0)   
}

显而易见的答案是简化模型,以便有更少的组,但我很好奇渲染例程是否有任何改进,可以让我做同样的事情,但减少绘制调用。我希望仍然有一个详细的obj文件,但也有最有效的渲染我可以。

这是绘制obj文件的最好方法吗?我必须为文件中的每个组使用多个材质/纹理,还是有一种方法可以做到这一点,而不是循环每个组并单独绘制它们?我希望每个obj模型只有一次对DrawArray/DrawElements的调用,但我不知道如何在对对象应用多种材质/纹理的情况下做到这一点。我一直在看着这段代码,想着“一定有更好的方法”,但我不确定那是什么。如果我遗漏了显而易见的一块拼图,或者如果你有任何建议可以优化这一点,我将永远感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-26 22:43:57

我认为你的想法是正确的。实际上,一次只能有一组纹理或一个材质球处于活动状态,因此必须绘制使用该状态的模型部分,切换状态,然后绘制下一个组。

如果您添加更多模型时性能下降,您可以尝试对您的组进行排序,以便在一行中绘制具有相同状态的所有组,而无需切换。

因此,如果您正在绘制100个模型副本,并且模型具有三个组A、B和C:则不这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach(model)
   set state A;
   glDrawArrays(A);
   set state B;
   glDrawArrays(B);
   set state C;
   glDrawArrays(C);

你应该这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sort models into groups;
foreach(group)
    set state
    foreach(instance of group)
         glDrawArrays

这样可以节省约99%的状态转换(材质球切换、纹理绑定等)。这将是一个很大的性能改进。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11216721

复制
相关文章
OpenGL ES 文字渲染
在音视频或 OpenGL 开发中,文字渲染是一个高频使用的功能,比如制作一些酷炫的字幕、为视频添加水印、设置特殊字体等等。
字节流动
2021/06/24
1.9K0
OpenGL ES 文字渲染
OpenGL ES 对象
VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VAO
ruochen
2021/11/24
1.7K0
Android OpenGL ES 渲染模式
在OpenGL ES 基础原理中,我们只是对顶点做了简单的填充设置,现在我们继续对片段着色器中的颜色做自定义。
Rouse
2023/02/14
5400
Android OpenGL ES 渲染模式
OpenGL ES 多目标渲染(MRT)
OpenGL ES 多目标渲染(MRT),即多重渲染目标,是 OpenGL ES 3.0 新特性,它允许应用程序一次渲染到多个缓冲区。
字节流动
2020/10/12
3K0
OpenGL ES 与 GLSurfaceView 渲染视频帧
大家好,本文是 iOS/Android 音视频专题 的第六篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
100001509164
2022/01/20
2.6K0
OpenGL ES 文字渲染方式有几种?
在音视频或 OpenGL 开发中,文字渲染是一个高频使用的功能,比如制作一些酷炫的字幕、为视频添加水印、设置特殊字体等等。
字节流动
2021/07/16
2.4K0
OpenGL ES 文字渲染进阶--渲染中文字体
旧文 OpenGL ES 文字渲染方式有几种? 一文中分别介绍了 OpenGL 利用 Canvas 和 FreeType 绘制文字的方法。 无论采用哪种方式进行渲染,本质上原理都是纹理贴图:将带有文字的图像上传到纹理,然后进行贴图。
字节流动
2021/07/05
1.4K0
OpenGL ES 文字渲染进阶--渲染中文字体
Android 基于OpenGl ES渲染yuv视频(十二)
本文是基于前面两篇OpenGl理论学习的实际应用,更好的巩固一下前面的学习内容,重点讲下如何使用OpenGl去渲染一个yuv格式视频。
PengJie
2021/01/14
2.4K0
OpenGL ES + MediaPlayer 渲染播放视频+滤镜效果
之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi 解码后SurfaceView播放视频 ,今天再给大家来一篇 OpenGL ES+MediaPlayer 来播放视频。
字节流动
2020/11/30
2.2K0
OpenGL ES + MediaPlayer 渲染播放视频+滤镜效果
OpenGL ES初探:渲染流程及GLKit简介
OpenGL是一套多功能开放标准库,用于处理可视化2D和3D数据。OpenGL可以将调用函数转换成图形处理命令并传送给底层图形硬件,因此OpenGL的绘制效率非常快。
CC老师
2021/08/25
1.7K0
OpenGL ES 文字渲染进阶--渲染中文字体
旧文 OpenGL ES 文字渲染方式有几种? 一文中分别介绍了 OpenGL 利用 Canvas 和 FreeType 绘制文字的方法。
字节流动
2021/07/16
1.9K1
视频直播与虚拟现实的渲染 - OpenGL ES
这是一篇OpenGL ES的学习笔记,介绍图像绘制里面用到的概念,学习OpenGL ES的基础知识备忘录。 教程 OpenGLES入门教程1-Tutorial01-GLKit OpenGLES入门教程2-Tutorial02-shader入门 OpenGLES入门教程3-Tutorial03-三维变换 OpenGLES入门教程4-Tutorial04-GLKit进阶 OpenGLES进阶教程1-Tutorial05-地球月亮 OpenGLES进阶教程2-Tutorial06-光线 OpenGLE
落影
2018/04/27
1.7K0
视频直播与虚拟现实的渲染 - OpenGL ES
OpenGL ES 3D 模型的加载和渲染
上一节简单介绍了常用的 3D 模型文件 Obj 的数据结构和模型加载库 Assimp 的编译,本节主要介绍如何使用 Assimp 加载 3D 模型文件和渲染 3D 模型。
字节流动
2020/09/22
1.8K0
OpenGL ES 共享上下文实现多线程渲染
EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用:
字节流动
2021/06/04
6.5K0
OpenGL ES 共享上下文实现多线程渲染
EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用:
字节流动
2021/06/09
4.1K0
OpenGL ES 共享上下文实现多线程渲染
OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析
案例运行(绘制一个三角形)的基本步骤 【可以先看看文末的代码,结合文章内容去看, 理解了整个流程之后再来看这个步骤,会容易很多】 用EGL创建屏幕上的渲染表面(Android直接用一个GLSurfaceView) 加载顶点、片段着色器 创建一个程序对象, 连接顶点、片段着色器, 并链接程序对象; 设置视口; 清除颜色缓冲区; 渲染简单图元 使颜色缓冲区的内容在EGL窗口表面(GLSurfaceView)中可见 着色器 在OpenGL ES 3.0中, 除非加载有效的顶点和片段着色器,否则不会绘
凌川江雪
2020/08/11
1.6K0
OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析
OpenGL ES简介
概述 在聊Android的View渲染流程中,通常会有一个比较核心的步骤:通过OpeGL ES接口调用GPU接口通知GPU绘制图形。其完整的流程:UI对象—->CPU处理为多维图形,纹理 —–通过Op
xiangzhihong
2018/01/26
2K0
在面试中,被反复提及的 OpenGL NV21 图像渲染
前面文章一文掌握 YUV 图像的基本处理介绍了 YUV 常用的基本格式,本文以实现 NV21/NV12 的渲染为例。
字节流动
2021/11/29
2.2K0
在面试中,被反复提及的 OpenGL NV21 图像渲染
OpenGL ES简介
概述 在聊Android的View渲染流程中,通常会有一个比较核心的步骤:通过OpeGL ES接口调用GPU接口通知GPU绘制图形。其完整的流程:UI对象—->CPU处理为多维图形,纹理 —–通过Op
xiangzhihong
2018/02/06
1.9K0
OpenGL ES简介
点击加载更多

相似问题

在OpenGL ES 2.0中渲染对象深度

29

在OpenGL ES中渲染两个对象

20

在OpenGL ES 2.0中渲染大量较小的对象

11

使用OpenGL ES 2.0渲染多个对象

60

在OpenGL ES 2.0中渲染点

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文