OpenGL精灵映射不起作用

时间:2013-05-04 06:47:42

标签: c opengl sprite

我正在使用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)是右下角坐标,图中是一个黄色圆圈,里面有一个绿色圆圈。 uv coordinates

我的问题是我的函数没有正确映射精灵。我观察到,如果我在第一行和第二行之间添加:if(us<0) s.u=1+s.u;,我最终会将精灵2和4混合起来。

1 个答案:

答案 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