【问题标题】:stretching one texture over multiple quads在多个四边形上拉伸一个纹理
【发布时间】:2011-12-22 07:13:16
【问题描述】:

要对单个四边形进行纹理贴图,可以使用以下代码:

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 循环创建一个 10x10 的四边形,由 2 个单位边的较小四边形组成,我想将我的纹理从 1x1 的四边形拉伸到 10x10 的四边形:

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();
    }
}

}

【问题讨论】:

  • 我的眼睛会欺骗我吗? glBegin() 和 glEnd() ?请不要使用它,它已被弃用。
  • 不使用 glBegin 和 glEnd 怎么办?

标签: c++ opengl texture-mapping


【解决方案1】:

您可能从第一个代码 sn-p 中可以看出,纹理坐标在 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 次四边形。

【讨论】:

    【解决方案2】:

    如果你仔细想想,这只是为每个四边形指定正确的纹理坐标。

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 2014-07-21
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2014-01-19
      相关资源
      最近更新 更多