OpenGL - Как вы прокручиваете текстуру? - PullRequest
0 голосов
/ 05 марта 2011

Я создаю текстуру из макета панго и отображаю текстуру на экране, используя OpenGL и GLUT. Я хочу прокрутить текстуру в окне. Меня не интересуют элементы управления для прокрутки, но как заставить карту отображать часть текстуры, которую я хочу видеть на экране? Я предполагаю, что использую glTranslate, но где я могу его применить?

Заранее спасибо.

Вот что я сейчас делаю:

glEnable(GL_TEXTURE_2D);

{  
  glBegin(GL_QUADS);  

  {  
        glTexCoord2f(0.0f, 0.0f); glVertex2f(  0.0f+x,   0.0f+y);  
        glTexCoord2f(1.0f, 0.0f); glVertex2f(_width+x,   0.0f+y);  
        glTexCoord2f(1.0f, 1.0f); glVertex2f(_width+x, _height+y);  
        glTexCoord2f(0.0f, 1.0f); glVertex2f(  0.0f+x, _height+y);    
  }  

  glEnd();  
}

glFlush();    

glDisable(GL_TEXTURE_2D);

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Другой способ - использовать матрицу текстур (матричный режим GL_TEXTURE) или сделать это в шейдере.

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

Прокрутка в шейдере будет легкой: out.tex = in.tex + offset, где смещение может быть униформой, которая устанавливается для каждого кадра или вычисляется издругие входные данные.

Поскольку в вашем примере используется непосредственный режим, я расширю его с помощью режима матрицы текстуры.Но учтите, что это устаревшая методология.

glEnable(GL_TEXTURE_2D);
{
  glMatrixMode(GL_TEXTURE);
  glLoadIndentity();
  glTranslatef(x,y,0);
  glMatrixMode(GL_MODELVIEW);


  glBegin(GL_QUADS);
  {
    glTexCoord2f(0.0f, 0.0f); glVertex2f( 0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(_width, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(_width, _height);
    glTexCoord2f(0.0f, 1.0f); glVertex2f( 0.0f, _height);
  }
  glEnd();
} 
glFlush();
glDisable(GL_TEXTURE_2D);
1 голос
/ 05 марта 2011

Если вы не хотите использовать мозаику, я бы просто изменил координаты UV вершин, которые вы выводите. Затем вы просто меняете координаты, которые вы вводите, на glTexCoord2f, чтобы указать обрезку.

Здесь также есть хороший пример преобразования текстур http://potatoland.org/glart/week5/GLART_5_texture_samples.java (это Java, но вы можете легко перевести его на C)

...