使用OpenGL中的纹理图集计算单个图块的纹理坐标

时间:2010-12-10 20:39:06

标签: c# opengl textures

我正在尝试在我使用OpenTK库在C#/ OpenGl中编写的游戏程序中使用纹理图集。

我将纹理图集加载为OpenGL中的纹理(尺寸为256x256),每个图块为32x32。

要获得要显示的地图集的第一个图块,我使用了以下代码:

GL.Begin(BeginMode.Quads);
GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0.125f, 0); GL.Vertex2((32 * zoom), 0);
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom));
GL.TexCoord2(0, 0.125f); GL.Vertex2(0, (32 * zoom));
GL.End();

0.125是通过除以1/8来计算的,8是行/列中的瓦片数。

我不知道如何以这种方式计算第二个瓷砖的坐标! 我尝试分别使用0.125和0.25代替0和0.125,但这没有任何结果。我猜你不允许使用大于零的值(EDIT)第一个(0)纹理坐标?

如果有人可以提供帮助或提供更好的方法,我们将不胜感激!

3 个答案:

答案 0 :(得分:2)

试一试:

int col = 0;
int row = 0;
float tex_w = 256;
float tex_h = 256;
float tile_w = 32;
float tile_h = 32;
float w_factor = tile_w / tex_w;
float h_factor = tile_h / tex_h;

float x_tex_beg = w_factor*(col+0);
float x_tex_end = w_factor*(col+1);
float y_tex_beg = h_factor*(row+0);
float y_tex_end = h_factor*(row+1);

答案 1 :(得分:1)

  1. 摆脱“* zoom”。只需在gl.begin。
  2. 之前调用gl.scale(缩放,缩放,1)
  3. 在嵌套循环中查看8x8磁贴,如下所示:

    GL.Scale(zoom*32,zoom*32,1);
    GL.Begin(BeginMode.Quads);
    for (int i=0; i<8; i++)
    for (int j=0; j<8; j++)
    {
    var x = i/8.0; // texture scale
    var y = j/8.0;
    GL.TexCoord2(x, y); GL.Vertex2(i, j);
    GL.TexCoord2(x+0.125f, y); GL.Vertex2(i+1, j);
    GL.TexCoord2(x+0.125f, y+0.125f); GL.Vertex2(i+1, j+1);
    GL.TexCoord2(x, y+0.125f); GL.Vertex2(i, j+1);
    }
    GL.End();
    GL.Scale(1.0/(zoom*32),1.0/(zoom*32),1); // unzoom

答案 2 :(得分:0)

纹理坐标介于0和1之间。想象一下它是瓷砖网格的平移,但不是每个都是32x32,它们是0.125fx0.125f。 此外,256/8 = 32.你通过32/256获得了这个数字。

要获得第二个图块(假设您正在横向移动),您需要移动(即添加0.125f)到纹理坐标x值。例如:

GL.TexCoord2(0.125f, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0.25f, 0); GL.Vertex2((32 * zoom), 0);
GL.TexCoord2(0.25f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom));
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2(0, (32 * zoom));