具有巨大图块数据的图块地图,可用于OpenGL渲染(不可选择纹理作为图像)

时间:2018-09-02 18:32:30

标签: opengl tile

我的二进制文件很大。它包含32x32像素的图块。每个像素为32位RBG颜色。由于二进制文件结构,无法将其渲染到纹理图像。

上次我尝试使用SFML加载具有40 416 x 512像素下一个尺寸的生成的纹理时,会产生例外,即不支持此类纹理。

如何在不使用纹理和uv坐标的情况下在屏幕上渲染图块?

因为在每个与tilemap相关的教程中,我仅看到uv纹理坐标操作。我需要其他方式来渲染带有文件中图块的地图。

二进制文件包含以下部分: 百万分之一群体的数组。 数组的兆瓦。 一排小砖瓦。 调色板。

每个兆位组由16个兆位指标组成。 每个兆块都是8x8阵列,并带有微型指标。 每个小块是调色板中的4x4色彩指标阵列。 调色板是256种32位RGB颜色的数组。

例如:

First megatile group just contains 16 0:
[0, 0, ..., 0] (0 x 16)
0-indexed megatile is array with minitile indexes size of 8x8. All its elementes are 0.
[0, 0, ..., 0] (0 x 64)
0-indexed minitile is an 4x4 array. Each element represent color from palette. All its elements are 0.
[0, 0, ... 0] (0 x 16)
0-indexed color from pallete is just black color in 32 bits rgb.

Tilemap单元格由组中的兆位组索引和兆位索引定义。 因此,从tilemap的任何图块(由成对的megatile组和该组中的megatile定义)的任何点上,我都可以获得32x32像素的数组。 如何渲染图块地图?

1 个答案:

答案 0 :(得分:0)

当GPU内存不足时,如何通过OpenGL绘制多个GB的图像?
第一个想法:按块。

如果要绘制固定图像,不更改相机,不更改缩放,则方法可能是:用每个块填充纹理,绘制它,然后重复另一个块。 GPU将丢弃场外部分,或在同一像素中重叠图像的不同部分。对于不固定的视图,这是不切实际的,非常慢。

但是,等等,真的所有GB吗?

一个4K 3840x2160 = 8.3 MPixels显示器需要8.3 x 4 = 33.2 MB的RGBA数据。
问题是,如何在这么多GB的原始数据中选择33.2 MB。

假设您有一系列的图块(每个图块都是大图的块)。
第一个改进是不会将会落在视野之外的图块发送到GPU。可以在CPU端使用具有瓦片四个角的典型MVP矩阵进行测试。

第二个改进是,瓷砖离相机太远,但位于透视/正交投影凸台内。它将被视为单个像素。当一个像素的点足够时,为什么要将整个图块发送到GPU?

quadtree比数组要好,这两个方面都可以实现。
它存储指向图块的指针或标识。但是对于中间的节点来说,代表点具有其子节点的平均颜色。或“压缩”多个图块的代表性图块。

遍历qtree。将节点(及其分支)丢弃。当图块太远时,渲染代表性点/平铺而不是纹理。当某个边缘的大小超过1个像素时,渲染整个图块。

您不会发送仅33.2 MB的内容,而是发送100 MB以下的内容,这非常容易处理。