2012-05-01 89 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