2012-05-01 30 views
0

私は2Dのサイドスクロールゲームを開発しています。私は2400x480のサイズの背景のタイルビットマップを持っています。このビットマップをスクロールするにはどうすればいいですか?OpenGL ES 1.1のスクロール

私は、私は次のコードでそれを行うことができることを知っている:

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

だから、240000個のピクセルのビットマップをスクロールします。

しかし、私は画面の外に(サイズ800x480で)残っている画像を描画したくありません。

私はそれに速度を与えることができますどのように?(ラスタースクロールのために、通常のスクロール後)タイルを?スクロールレンダリングすることができますどのように

+0

私の脳を通ってスクランブルする_あなたを助けてはならない[受け入れるべきではない](http://stackoverflow.com/a/10179587/1262542)。大丈夫です。 –

+0

@StefanHanke申し訳ありませんが、私があなたの言うことを理解するはずですから、私はこのアルゴリズムをコーディングしようとしましたが、成功できません。 – droidmachine

答えて

0

次のコードは、2つの大腿四頭筋、しかし、1つのクワッドを使用していない、と質感がそれに応じて調整する適応。私はすべてのテクスチャ処理コードを取り除いたことに注意してください。投影行列は、glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);のみを含む。

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を呼び出す方法:Quad2Dは、そのテックスCOORDS updateTexCoordsを使用してアニメーション化することができますクワッドを定義しますか? の内部では、次のコードを置く:テクスチャ座標が1.0fを越えて行くので

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

を、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:あなたのhwがOpenGL ES2.0に準拠していれば、とにかくあなたの固定機能はとにかくシェーダによってのみ実装されているでしょう。シェーダをシンプルにすると、パフォーマンスの数値が得られるかもしれません。 – CuriousChettai

関連する問題