Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在OpenGL中绘制多个四边形的最有效方法

在OpenGL中绘制多个四边形的最有效方法
EN

Stack Overflow用户
提问于 2010-05-14 01:53:58
回答 2查看 1.4K关注 0票数 0

我一直在制作这个基于2d瓦片的游戏引擎,用于几个项目中。

我有一个名为"ScreenObject“的类,它主要由一个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dictionary<Point, Tile>

point键用于显示在屏幕上渲染Tile的位置,并且Tile包含一个或多个要在该点绘制的纹理。此ScreenObject是将修改、删除、添加等磁贴的位置。

我在测试中绘制图块的原始方法是遍历ScreenObject,并在每个位置分别绘制每个四边形。据我所知,这是对资源的巨大浪费。它在测试中并不是特别慢,但在我完成了动画类和效果类之后,我确信它会非常慢。

最后一件事,如果你不介意的话..正如我之前所说的,Tile类可以包含多个要在屏幕上的Point位置绘制的纹理。

我认为我在这里可能有两个选择。或者在要绘制的每个纹理的该位置添加一个四边形,或者以某种方式..对同一四边形使用多个纹理(如果可能)。即使每个瓷砖只包含一个纹理,也就是在屏幕上绘制64个四边形。大多数瓷砖将包含2-5个纹理,因此使用此方法将显著增加四边形的总数。是否可以为每个新纹理添加一个四边形,或者我忽略了一个更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2010-05-14 07:49:01

我怀疑使用字典会比直接使用数组慢。如果你的世界由512x512瓦片组成,那么你分配一个长度为512x512 (262144)的数组。YTou可以通过使用"arrayx + (y * 512)“获得该数组中的任何给定瓦片。

你知道有多少瓦片,所以存储一个数组,每个瓦片要么指向该位置的瓦片,要么在列表中有一个到瓦片的索引(这样可能会节省内存,因为你可以将所有瓦片的大小保持在小于65536甚至256的数组中,从而将索引存储为16位。

然后找到数组中要渲染的区域。要以最佳方式执行此操作,您需要尽可能避免切换纹理。所以第一件事,我会检查你的瓷砖有多大,然后试着把所有的纹理组合成一个大的纹理。然后设定UV以对此大纹理的子部分进行采样。通过这种方式,您应该能够限制使用几个大纹理的纹理数量。当然,你可能会发现一个给定的瓦片集(比方说岩石地面)将使用相同的纹理组。也可能会有一些混合到草的地方,所以它可能很值得在两个大纹理中持有草纹理,以避免进行如此多的纹理交换。即牺牲视频内存来换取速度。

然后迭代数组的可见部分,使用texture 1绘制所有瓦片,然后使用texture 2绘制所有瓦片,依此类推。

票数 0
EN

Stack Overflow用户

发布于 2013-04-15 17:55:28

我建议使用由三角形+索引组成的单个VAO对象。计算客户端的位置,并在每一帧上更新它(流)。

使用纹理图集在单个纹理中存储所有内容(以避免切换状态)。您可以使用纹理打包器工具。

一次渲染(如果启用了深度缓冲区)。否则,首先渲染不透明的对象,然后渲染应该混合的所有对象。

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

https://stackoverflow.com/questions/2831402

复制
相关文章
【OpenGL】十七、OpenGL 绘制四边形 ( 绘制 GL_QUAD_STRIP 模式四边形 )
GitHub 地址 : https://github.com/han1202012/OpenGL ( GitHub 源码始终都会随着后续博客的进度更新覆盖 , 可能没有本博客的相关源码 , 推荐下载博客源码快照 ) ;
韩曙亮
2023/03/28
1.4K0
【OpenGL】十七、OpenGL 绘制四边形  ( 绘制 GL_QUAD_STRIP 模式四边形 )
【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )
在上一篇博客 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 ) 中 , 讲解了绘制单个点的操作 , 本篇博客简单介绍下绘制多个点 ;
韩曙亮
2023/03/28
1.3K0
【OpenGL】十一、OpenGL 绘制多个点  ( 绘制单个点 | 绘制多个点 )
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
四边形绘制时 , 在 glBegin 方法中传入 GL_QUADS 参数 , 其绘制规则是每遇到
韩曙亮
2023/03/28
1.2K0
【OpenGL】十六、OpenGL 绘制四边形  ( 绘制 GL_QUADS 四边形 )
OpenGL 的 glDrawElements 绘制方法
在之前的绘制中,我们都是通过 glDrawArrays 方法来实现的,它会按照我们传入的顶点顺序和指定的绘制方式进行绘制。
音视频开发进阶
2019/07/25
2.4K0
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 )
使用 glPolygonMode(GL_FRONT, GL_LINE) 设置当前的绘制模式是线框模式 , 设置了该模式后 , 之后的所有图形都会变成线 ;
韩曙亮
2023/03/28
2K0
【OpenGL】十九、OpenGL 绘制模式  ( 绘制线框模式 | 绘制点模式 )
opengl-球体的绘制
将y轴切分成64等分,x-z平面切分成64等分的扇形 y轴从上到下取值为[0, 180],即[0, π],x-z平面扫描取值[0, 360]即[0, 2π] 详细计算,参考如下代码,把一个球体拆分成65 * 65 个点 注意: y = cos(ySegment * PI); x = sin(ySegment * PI) * cos(xSegment * 2 * PI); x = sin(ySegment * PI) * sin (xSegment * 2 * PI); 按照上面这个顺序来理解比较容易
公号sumsmile
2020/08/26
4K1
opengl-球体的绘制
用OpenGL绘制地球
本想用自动纹理坐标生成做的,可是红宝书上说得一点都不明白。网上有个人的课程设计是自己画的球,就是一个个四边形的拼个球,然后再给四边形贴图。这样太麻烦了!逛啊逛,让我找到了另一种方法,仅仅几行代码: // 画地球 void OpenGL::DrawEarth(void) ...{     GLUquadricObj *quadObj = gluNewQuadric();//创建一个二次曲面物体     gluQuadricTexture(quadObj,GL_TRUE);        //启用
逍遥剑客
2018/05/21
2.9K0
OpenGL ES 绘制纹理
在OpenGL ES中绘制一张图片需要使用到纹理(texture),绘制纹理步骤如下:
老孟Flutter
2020/09/11
1.1K0
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )
线的绘制宽度是 OpenGL 状态机中的一个值 , 通过 glLineWidth 方法设置 ; 下面的代码将线的宽度设置为 2 像素 ;
韩曙亮
2023/03/28
4.7K0
【OpenGL】十二、OpenGL 绘制线段  ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )
【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )
上一篇博客 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 进行了 OpenGL 渲染环境初始化 ;
韩曙亮
2023/03/28
4.2K0
Android开发笔记(一百五十五)利用GL10描绘点、线、面
上一篇文章介绍了GL10的常用方法,包括如何设置颜色、如何指定坐标系、如何调整镜头参数、如何挪动观测方位等等,不过这些方法只是绘图前的准备工作,真正描绘点、线、面的制图工作并未涉及,那么本文就来谈谈如何利用GL10进行实际的三维绘图操作。 首先在三维坐标系中,每个点都有x、y、z三个方向上的坐标值,这样需要三个浮点数来表示一个点。然后一个面又至少由三个点组成,例如三个点可以构成一个三角形,而四个点可以构成一个四边形。于是OpenGL使用浮点数组表达一块平面区域的时候,数组大小=该面的顶点个数*3,也就是说,每三个浮点数用来指定一个顶点的x、y、z三轴坐标,所以总共需要三倍于顶点数量的浮点数才能表示这些顶点构成的平面。以下举个定义四边形的浮点数组例子:
aqi00
2019/01/18
7140
ppt中如何快速绘制各种角度的平行四边形
1、打开视图--勾选网格线 2、打开插入--形状--选择矩形 3、选中矩形,打开格式--选择编辑形状 此时矩形上会有四个点,我们可以拖动这四个点改变矩形的形状。 4、以网格线为参考形成平行四边形 5、
西西嘛呦
2020/08/26
5.5K0
Flash在DirectX中的绘制
这里使用的是之前我说过的OLE控件在Direct3D中的渲染方法, 自己不进行swf的解析, 这不现实. 前提条件: COM编程, OLE编程, DirectX编程, ActionScript/Flash(可选). 创建一个ShockwaveFlashObjects::IShockwaveFlash的对象 实现一个IOleClientSite来做为IShockwaveFlash的容器 绘制 通过OleDraw来把GDI的像素数据绘制到DC上(IShockwaveFlash是一个IViewObjec
逍遥剑客
2018/05/23
1.8K0
OpenGL ES for Android 绘制线
line_vs.glsl和line_fs.glsl分别表示顶点shader和片段shader的文件,存放于assets/glsl目录下,readAssetsTxt为读取assets目录下文件的公用方法。
老孟Flutter
2020/09/11
9671
OpenGL 系列---基础绘制流程
OpenGL 是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库。
音视频开发进阶
2019/07/26
1.9K0
OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换
通过模型矩阵,观察者矩阵(View Matrix),投影矩阵(Projection Matrix)三步矩阵变换后最终确定该展示怎样的图像。要注意的是矩阵的计算时从右往左的所以: result = 投影矩阵 * 观察者矩阵 * 模型矩阵。
用户8893176
2021/08/09
2.3K0
OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换
OpenGL ES for Android 绘制旋转的地球
No 图 No Code,上面旋转的地球是不是很酷炫,下面就让我们开始说说如何绘制旋转地球吧?绘制旋转地球需要3个步骤:
老孟Flutter
2020/09/11
1.7K0
OpenGL 学习系列---基本形状的绘制
在之前的一篇博客中,讲述了 OpenGL 基础绘制流程 及相关的代码,其中关于 OpenGL 程序编译部分都是可以在其他项目中接着复用的,接下来会讲到如何去绘制其他的基本图元。
音视频开发进阶
2019/07/25
1.9K0
OpenGL与OpenGL在移动端的应用
OpenGL首先我们从字面意思来理解:Open Graphics Library,开放的图形库,图形库自然是处理图形的,所以简单来说OpenGL就是用来处理图形的一个三方库。 稍微技术流一点,作如下解释:是用于渲染2D,3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。
清墨
2019/11/15
2.7K0
OpenGL与OpenGL在移动端的应用
点击加载更多

相似问题

绘制全屏四边形的最便宜方法

21

OpenGL --在OpenGL中绘制椭圆最有效的方法是什么?

22

在OpenGL 3+中绘制许多纹理四边形的最快方法

15

未绘制OpenGL四边形

20

在OpenGL 3.2中绘制全屏四边形的最好方法是什么?

63
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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