2012-05-01 35 views
0

我正在开发2D横向滚动游戏。我有一个平铺的位图,用于背景,大小为2400x480.如何滚动此位图?在OpenGL ES 1.1中滚动

我知道,我可以用下面的代码做到这一点:

for(int i=0;i<100;i++) 
draw(bitmap,2400*i,480); 

因此,将滚动位图240000个像素。

但我不想绘制图片保持在屏幕外(尺寸为800x480)。

我怎么能渲染滚动瓷砖?我如何给速度呢?(对于正常滚动后的视差滚动)

+0

_scrambling through my brain_你不应该[接受答案](http://stackoverflow.com/a/10179587/1262542)不帮助你。没关系。 –

+0

@StefanHanke对不起,但我接受,因为我应该明白你说的话。然后我试着编码这个算法,但我不能成功。这就是为什么我再次问。 – droidmachine

回答

0

下面的代码不使用两个四边形,但一个四,并适应纹理相应坐标。请注意,我删除了所有纹理处理代码。投影矩阵仅包含glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);Quad2D定义了四,其特COORDS可以使用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?里面,把下面的代码:

long time = SystemClock.uptimeMillis() % 3000L; 
    float velocity = 1.0f/3000.0f; 
    float offset = time * velocity; 
    mQuad.updateTexCoords(offset); 

由于纹理坐标超越1.0f,对于S纹理坐标包裹必须设置为GL_REPEAT

0

如果你还没有着色器的工作,我们可以有一个更清洁,可能是更有效的方式来做到这一点。

创建一个覆盖整个屏幕四边形的VBO。智商和身高分别应该是800和480。

然后创建你的顶点着色器为:

attribute vec4 vPos; 
uniform int shift; 
varying mediump vec2 fTexCoord; 
void main(void){ 
    gl_Position = vPos; 
    fTexCoord = vec2((vPos.x-shift)/800.0, vPos.y/480.0);//this logic might change slightly based on which quadarnt you choose. 
} 

片段着色器会是这样的:

precision mediump float; 
uniform sampler2D texture;  
varying mediump vec2 fTexCoord; 
void main(void){ 
    gl_FragColor = texture2D(texture, fTexCoord); 
} 

和你做。 要滚动,只需使用“glUniformX()”apis设置统一值。

+0

我没有使用OpenGL ES 2.0 – droidmachine

+0

@droidmachine:如果你的硬件是符合OpenGL ES2.0的,那么很可能你的固定功能只能通过着色器实现。使着色器变得简单可能会让你获得一些性能数据。 – CuriousChettai