我正在使用OpenGL和GLUT(在Linux,C下)使用我自己的图形引擎。问题在于sprite loader.Basicaly,我有一个结构,它只保存渲染纹理的一部分数据,如下所示:
struct Sprite {
Vertex start,end,size;
int textureID;
}
我有一个功能可以将其呈现在屏幕上。 textureID 表示纹理的id。顶点开始和结束表示uv坐标(介于0和1之间),它们指定我要渲染的精灵的左上角(开始)和右下角(末尾)。顶点大小指定屏幕空间中精灵的实际大小 这是在较小的精灵中分割大纹理的函数的一部分。这只是它的数学部分,我做了一个C应用程序来测试它,它确实无法工作。 s.u 和 s.v 是起始uv坐标(精灵的左上角),类似于x(s.u)和y(s.v)。 e.u 和 e.v 是结束坐标(精灵的右下角)。 nx 和 ny 是纹理上的分割数量(在下图中有2个水平分割和2个垂直分割。 id 代表我想要的精灵。
s.u=(1.0f/nx)*(id%nx-1);
s.v=(1.0f/ny)*(ny-id/nx);
e.u=s.u+(1.0f/nx);
e.v=s.v-(1.0f/nx);
例如,如果我给我的函数这个数字:id = 1,nx = 2,ny = 2,它应该返回这个坐标:start(0; 1)和end(0.5; 0.5)。 start(0; 1)是左上角坐标,图中是一个黄色圆圈,里面有一个红色圆圈,而end(0.5; 0.5)是右下角坐标,图中是一个黄色圆圈,里面有一个绿色圆圈。
我的问题是我的函数没有正确映射精灵。我观察到,如果我在第一行和第二行之间添加:if(us<0) s.u=1+s.u;
,我最终会将精灵2和4混合起来。
答案 0 :(得分:1)
我不确定你为什么要在你的等式中混合 id 。此外,您的结构只需要Sprite的起点和尺寸:
struct Sprite {
Vertex start,end;
int textureID;
}
// nx and ny are indexes of which sprite inside the atlas do you need (index starting at 0
// xsize and ysize are the standard size of an sprite in texture space, for example
// in your example both would be 0.5
Sprite generateSprite(int nx, int ny, int xsize int ysize){
Sprite s;
s.start.u = xsize*nx;
s.start.v = ysize*ny;
s.end.u = s.start.u+xsize;
s.end.v = s.start.v+ysize;
}
这就是我认为你想要存档的内容,希望有所帮助。
编辑:您可以轻松地计算xsize和ysize,例如,如果您的纹理包含相同大小的4x4精灵,xsize = ysize = 1.0 / 4