在多个四边形上拉伸一个纹理

时间:2011-12-21 23:04:18

标签: c++ opengl texture-mapping

要对单个四边形进行纹理贴图,以下代码可以正常工作:

glBegin( GL_QUADS);
  glTexCoord2f( 0,0 ) ;
  glVertex3f( -1,-1,0);

  glTexCoord2f(1,0);
  glVertex3f(  1,-1,0);

  glTexCoord2f(1,1);
  glVertex3f(  1, 1,0);

  glTexCoord2f(0,1);
  glVertex3f( -1, 1,0);
glEnd();

我的问题是,如何使用一个纹理映射以下多个四元组。 for循环创建一个由2个单位边缘的较小四边形组成的10x10四边形,我想将纹理从1x1th quad扩展到10x10th quad:

void wall(int num)
{
int wallx;
int wally;
for(wallx=0;wallx<num;wallx++)
{
    for(wally=0;wally<num;wally++)
    {
    glPushMatrix();
        glBegin( GL_QUADS);
        glVertex3f( -1 + wallx*2,-1+ wally*2,0 );           
        glVertex3f(  1+ wallx*2,-1+ wally*2,0 );             
        glVertex3f(  1+ wallx*2, 1+ wally*2,0 );             
        glVertex3f(  -1+ wallx*2, 1+ wally*2,0 );           
            glEnd();
    glPopMatrix();
    }
}

}

2 个答案:

答案 0 :(得分:1)

正如您可以从第一个代码片段中看出的那样,纹理坐标在0-1范围内,因此0,0是一个角向前进到1,1对角线。四边形的单位大小无关紧要,纹理坐标位于纹理空间,而不是世界空间。

因此,您只需将纹理坐标计算为1 / n,其中n是您用于构建大型四边形的四边形数量。在这种情况下,第一个例如具有坐标(0,0),(0,0.1),(0.1,0)和(0.1,0.1)。只需计算1 / n然后在循环中使用此值来计算每个小四边形的坐标。如果你在四边形的一个角上使用了坐标(0,0),而在对角线的对角使用了(10,10)(在另外两个角上使用了正确的值)那么你的纹理会在你的纹理上平铺10次四

答案 1 :(得分:1)

如果你考虑一下,这就是为每个四边形指定正确的纹理坐标。

float unitx = 1.0f/(float)num;
float unity = 1.0f/(float)num;
for(wallx=0;wallx<num;wallx++)
{
    for(wally=0;wally<num;wally++)
    {
    glPushMatrix();
        glBegin( GL_QUADS);
        glTexCoord2f( unitx * (float) wallx, unity * (float) wally );
        glVertex3f( -1 + wallx*2,-1+ wally*2,0 );    
        glTexCoord2f( unitx * (float) (wallx+1), unity * (float) wally );
        glVertex3f(  1+ wallx*2,-1+ wally*2,0 );             
        glTexCoord2f( unitx * (float) (wallx+1), unity * (float) (wally+1) );
        glVertex3f(  1+ wallx*2, 1+ wally*2,0 );             
        glTexCoord2f( unitx * (float) wallx, unity * (float) (wally+1) );
        glVertex3f(  -1+ wallx*2, 1+ wally*2,0 );           
            glEnd();
    glPopMatrix();
    }
}