我正在使用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);
答案 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)