将1d数组的一部分渲染为2D?

时间:2017-01-04 02:12:04

标签: c++ arrays c++11 math coordinates

我试图在屏幕上渲染一堆四边形,但我无法正确渲染它。

我有一个10000(100x100)大小的1D数组并保存纹理ID:

mapping = { 1, 22, 55, 28, 95, 105, ...} 

纹理文件包含512x512像素,每张图像的像素为16x16像素。所以,这总共是32x32图像。纹理ID从0开始从左到右对应:

 0  1  2  3 ... 31
32 33 34 35 ... 63

............... 1023

鉴于屏幕分辨率为800x600像素,我想只渲染适合此分辨率的四边形子集,所以我不想从我的一维数组中绘制所有10000个四边形。

要从(0,0)图块中绘制,这就是我所拥有的:

for (int j = 0; j < 37; j++) {     // 600/16 = 37
    for(int i = 0; i < 50; i++) {  // 800/16 = 50
        int quadIndex = j*800/16 + i;
        int textureID = mapping[quadIndex];
        int x = (textureID % 512) * 16;
        int y = (textureID / 512) * 16;

        // Take image from texture starting at (x,y) and draw on screen at (i, j)
        draw(i, j, x, y);    
    }
}

问题是quadIndex不准确。它正确绘制第一行,但第二行只是第一行的延续而不是实际的第二行。基本上第一行溢出到第二行,并且它正在抛弃一切。

我确信这是因为我可以错误地计算quadIndex,但我不知道解决方案是什么。

另外,作为一个额外的好处,我如何从任何(a,b)偏移量而不是始终从(0,0)指定渲染?也就是说,使用我的一维数组,我想从(4,4)绘制到我的800x600分辨率。

1 个答案:

答案 0 :(得分:0)

您应该使用源数组的宽度,而不是屏幕宽度。据我了解,宽度为mapping = 100?

int quadIndex = j * 100 + i;