我正在尝试在我使用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)纹理坐标?
如果有人可以提供帮助或提供更好的方法,我们将不胜感激!
答案 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)
在嵌套循环中查看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));