OpenGL - 如何滚动纹理?

时间:2011-03-05 14:57:39

标签: opengl scroll glut

我正在使用pango布局创建纹理,并使用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 个答案:

答案 0 :(得分:3)

另一种方法是使用纹理矩阵(矩阵模式GL_TEXTURE)或在着色器中进行。

取决于必须修改多少个顶点。如果只是少数它可能更高性能,但对于许多顶点,纹理矩阵/着色器方法可能更好。请注意,不推荐使用内置矩阵运算,即现在建议使用纹理。

在着色器中滚动很容易:out.tex = in.tex + offset其中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 :(得分:1)

除非你想要平铺,否则我只想修改你输出的顶点的UV坐标。然后,您只需更改为glTexCoord2f提供的坐标以指定裁剪。

这里还有一个很好的纹理转换示例http://potatoland.org/glart/week5/GLART_5_texture_samples.java(它是java,但您可以轻松地将其转换为C)