2011-03-05 32 views
0

我從pango佈局創建紋理,並使用OpenGL和GLUT將紋理映射到屏幕。我想在窗口中滾動紋理。我不關心要滾動的控件,但是如何將我想要看到的紋理部分映射到屏幕上?我假設我使用glTranslate,但我在哪裏應用它?OpenGL - 你如何滾動紋理?

在此先感謝。

這是我目前做的:

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

回答

3

另一種方法是使用一個紋理矩陣(矩陣模式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);