C OpenGL sprite映射没有';行不通

C OpenGL sprite映射没有';行不通,c,opengl,sprite,C,Opengl,Sprite,我正在使用OpenGL和GLUT(在Linux、C下)开发自己的图形引擎。问题在于sprite loader。Basicali,我有一个结构,它保存用于渲染纹理一部分的数据,如下所示: struct Sprite { Vertex start,end,size; int textureID; } 我有一个函数可以把它呈现在屏幕上。textureID表示纹理的id。顶点开始和结束表示uv坐标(介于0和1之间),它们指定要渲染的精灵的左上角(开始)和右下角(结束)。顶点大小指定

我正在使用OpenGL和GLUT(在Linux、C下)开发自己的图形引擎。问题在于sprite loader。Basicali,我有一个结构,它保存用于渲染纹理一部分的数据,如下所示:

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,它应该返回这个坐标:开始(0;1)和结束(0.5;0.5)。开始(0;1)是左上角的坐标,在图像中是一个黄色圆圈,里面有一个红色圆圈,结束(0.5;0.5)是右下角的坐标,在图像中是一个黄色圆圈,里面有一个绿色圆圈。


我的问题是,我的函数没有正确映射精灵。我观察到,如果我添加以下内容:
if(us我不确定为什么要在等式中混合id。此外,您的结构只需要精灵的起点和维度:

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