下面的代码不是使用两个四边形,而是一个四边形,并相应地调整纹理坐标。请注意,我剥离了所有纹理处理代码。投影矩阵仅包含glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
。Quad2D
定义一个四边形,其 tex 坐标可以使用 动画updateTexCoords
:
static class Quad2D {
public Quad2D() {
/* SNIP create buffers */
float[] coords = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, };
mFVertexBuffer.put(coords);
float[] texs = { 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, };
mTexBuffer.put(texs);
/* SNIP reposition buffer indices */
}
public void updateTexCoords(float t) {
t = t % 1.0f;
mTexBuffer.put(0, 0.33f+t);
mTexBuffer.put(2, 0.0f+t);
mTexBuffer.put(4, 0.33f+t);
mTexBuffer.put(6, 0.0f+t);
}
public void draw(GL10 gl) {
glVertexPointer(2, GL_FLOAT, 0, mFVertexBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, mTexBuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
/* SNIP members */
}
现在怎么打电话updateTexCoords
?在里面onDrawFrame
,输入以下代码:
long time = SystemClock.uptimeMillis() % 3000L;
float velocity = 1.0f / 3000.0f;
float offset = time * velocity;
mQuad.updateTexCoords(offset);
由于纹理坐标超出1.0f
,S 坐标的纹理环绕必须设置为GL_REPEAT
。