растяжение одной текстуры на несколько квадов - PullRequest
0 голосов
/ 22 декабря 2011

Для отображения текстуры на один квад работает следующий код:

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, состоящий из меньших квадратов с двумя ребрами, я хочу растянуть текстуру с 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();
    }
}

}

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Если вы подумаете об этом, речь идет об указании правильной координаты текстуры для каждого четырехугольника.

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();
    }
}
1 голос
/ 22 декабря 2011

Как вы, вероятно, можете сказать из своего первого фрагмента кода, координаты текстуры находятся в диапазоне 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 раз перевернули свою текстуру квад.

...