openGL的在运行时创建的纹理地图?

所以,我建立了我的框架,一个整洁的小系统来包装SDL,OpenGL和Box2D的一起2D游戏。

现在,它的工作原理是,我创造“游戏对象”类的一个对象,指定一个“源PNG”,然后它会自动创建一个OpenGL纹理和相同尺寸的Box2D的身体。

现在我担心如果我开始向需要呈现在屏幕上的许多不同的纹理。

是否有可能在运行时在我所有的精灵表加载,然后将它们全部组合在一起成一个纹理? 如果是这样,怎么样? 而这将是实现它(这样我就不必手动将指定任何参数或任何东西)的好方法。

我想这样做在运行时没有预先做的原因是为了让我可以轻松地在一起的所有(或大部分)瓷砖,敌人等一定程度的加载到这一个纹理,因为每个级别获得“吨有相同的敌人。 它也想使整个艺术创作过程变得更容易。

--------------解决方案-------------

有可能已经存在了创建纹理地图(最佳包装是一个平凡的问题),并转换旧纹理坐标到新的一些图书馆。

但是,如果你想自己做,你可能会做这样的事情:

  • 从磁盘加载所有纹理(你的“源PNG”),以及获取原始像素数据缓冲区,
  • 如果需要的话,所有的源纹理转换成相同的像素格式,
  • 创建一个新的纹理大到足以容纳所有现有的纹理,具有相应的缓冲沿容纳像素数据
  • “blit的”从源图像转换成新的缓冲液中在一个给定的偏移量(见下文)中的像素数据
  • 创建使用新缓冲区的数据纹理正常。
  • 而这样做,确定从“老”的纹理映射坐标到“新的”纹理坐标(应记录所述偏移为纹理地图的每个元素和操作的快速转换的一个简单的事情)。 它很可能也是很容易做到这一点像素着色器内,但一些分析将需要看是否传递额外的参数的开销是值得的。

显然,你还需要检查,以确保你是不是做一些愚蠢像加载相同的纹理成册两次,但是这是一个问题这是此过程之外。



从源图像你会做这样的事情的目标图像“位图传送”(复印件)(假设你复制一个128x128的纹理成512x512的图册的质感,从(128,0)上的目标):

unsigned char* source = new unsigned char[ 128 * 128 * 4 ]; // in reality, comes from your texture loader
unsigned char* target = new unsigned char[ 512 * 512 * 4 ];

int targetX = 128;
int targetY = 0;

for(int sourceY = 0; sourceY < 128; ++sourceY) {
for(int sourceX = 0; sourceX < 128; ++sourceX) {
int from = (sourceY * 128 * 4) + (sourceX * 4); // 4 bytes per pixel (assuming RGBA)
int to = ((targetY + sourceY) * 512 * 4) + ((targetX + sourceX) * 4); // same format as source

for(int channel = 0; channel < 4; ++channel) {
target[to + channel] = source[from + channel];
}
}
}

这是一个非常简单的蛮力实现:有更快,更简洁和更聪明的方式来复制一个数组,但这个想法是,你基本上是在给定的X和Y复制源纹理到目标纹理的内容抵消。 最终,你会创建一个新的纹理,其中包含在其中的老纹理。

如果索引数学没有意义的你,想想怎么一个二维数组实际上是一维空间(如计算机内存)里面收录。

请原谅任何错误。 这不是生产代码,而是一些我没有检查,如果它编译或运行中写道。



由于您使用SDL,我应该指出,它有一个很好的功能,可能是能够帮助你: SDL_BlitSurface 。 您可以创建一个SDL_Surface SDL内完全和简单地使用SDL_BlitSurface到你的源表面复制到其中,然后将其转换地图集表面成GL质感。

它会照顾所有的数学的,也可以做一个格式转换为你的飞行。

分类:C# 时间:2012-10-27 人气:0
本文关键词: OpenGL的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.346 (s). 10 q(s)