ページ 11

OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月01日(月) 15:59
by 山口
以前、ココの掲示板で背景スクロールに着いて質問させて頂いた者です。
http://www.play21.jp/board/formz.cgi?ac ... &rln=63427
お礼が遅くなってしまいすみませんでした。

int型でのスクロールは問題なく見えるのですがfloat型ですとスクロールがおかしいです。
URL一番↓の様に修正してみたのですがやはりカクカクしてしまいます。

下記のソースではスクロールしなければいけない所までくるとカクカクになりスクロール速度が落ちている様に見えてしまいます。
何とか修正したいのですがうまくいきません。

背景の画像サイズは1024×512です。
画面サイズは320×480です。

DrawTexture関数は指定した座標の中心点に描画します。
#define SCROLL_SPEED 0.5f

// init
scBack = 0;

// loop
scBack += SCROLL_SPEED;
if( scBack >= 1024 ) scBack -= 1024;

// 描画処理
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
int size = int(320-copy_w);
DrawTexture(160, 240, texBack, scBack, 0, 320, 480, 0xffffff, 255);
 if (copy_w < 320){
    DrawTexture( int(320-size/2), 240, texBack, 0, 0, size, 480, 0xffffff, 255);
    //if( scBack == copy_w ) DrawTexture( int(320-size/2)+1, 240, texBack, 0, 0, size, 480, 0xffffff, 255);
    //else DrawTexture( int(320-size/2), 240, texBack, 0, 0, size, 480, 0xffffff, 255);
}


void DrawTexture( int x, int y, Texture texture, int texStartX, int texStartY, int texSizeX, int texSizeY, int color, int alpha ){
    int r = color >> 16; 
    int g = (color >> 8) & 0xff; 
    int b = color & 0xff;
    DrawTexture( x, y, texture, texStartX, texStartY, texSizeX, texSizeY, r, g, b, alpha );
}

void DrawTexture( int x, int y, Texture texture, int texStartX, int texStartY, int texSizeX, int texSizeY, int red, int green, int blue, int alpha ){
    
    // テクスチャのサイズの半分の値を取得
    int width = texture.imageSize.width;
    int height = texture.imageSize.height;
    int w = texSizeX / 2;
    int h = texSizeY / 2;
    
    // 読み込むテクスチャの領域を指定
    float startX,startY,sizeX,sizeY;
    
    // 開始位置
    if( texStartX == 0 ) startX = 0.0f;
    else startX = (float)texStartX / (float)width;
    if( texStartY == 0 ) startY = 0.0f;
    else startY = (float)texStartY / (float)height;
    
    // 終了位置
    if( texSizeX == 0 ) sizeX = 0.0f;
    else sizeX = (float)texSizeX / (float)width;
    if( texSizeY == 0 ) sizeY = 0.0f;
    else sizeY = (float)texSizeY / (float)height;
    
    //長方形を構成する四つの頂点の座標を決定します
    const GLfloat squareVertices[/url] = {
        x-w,    y-h,
        x+w,    y-h,
        x-w,    y+h,
        x+w,    y+h,
    };
    
    //長方形を構成する四つの頂点の色を指定します
    //ここではすべての頂点を同じ色にしています
    const GLubyte squareColors[/url] = {
        red, green, blue ,alpha,
        red, green, blue ,alpha,
        red, green, blue ,alpha,
        red, green, blue ,alpha,
    };
    
    //元画像のどの範囲を描画に使うかを決定します
    const GLfloat texCoords[/url] = {
        startX,            startY,
        startX+sizeX,    startY,
        startX,            startY+sizeY,
        startX+sizeX,    startY+sizeY,
    };
    
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    
    //テクスチャ機能を有効にし、描画に使用するテクスチャを指定します
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture.texture);    
    
    //頂点座標と色、およびテクスチャの範囲を指定し、描画します
    glVertexPointer(2, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
    glEnableClientState(GL_COLOR_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
    //テクスチャ機能を無効にします
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
    
    glDisable( GL_BLEND );    

}

Re:OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月01日(月) 16:31
by ISLe
先のスレで回答したようにはなっていないですね。
// 描画処理
int iScBack = scBack; // ここで端数処理。以後scBackを使わずにiScBackを使う。
int copy_w = (iScBack < 1024 - 320) ? 320 : 1024 - iScBack; // ←
int size = 320-copy_w;
DrawTexture(160, 240, texBack, iScBack, 0, 320, 480, 0xffffff, 255); // ←
if (copy_w < 320){
    DrawTexture(320-size/2, 240, texBack, 0, 0, size, 480, 0xffffff, 255);
}

Re:OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月01日(月) 21:09
by 山口
ISLe様
何度も回答ありがとう御座います。
添付して頂いたソースの様に修正してみたのですがピクピク動いてしまいます・・・。
動画をあげれればと思うのですがそのような環境がないため用意できません><
多分、DrawTexture(320-size/2, 240, texBack, 0, 0, size, 480, 0xffffff, 255);がピクピク動いている気がします。

わかりにくい質問で大変申し訳ないです。

Re:OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月01日(月) 23:18
by ISLe
> 添付して頂いたソースの様に修正してみたのですがピクピク動いてしまいます・・・。

2コマに1ピクセルの移動なのでピクピク動いているように感じるのではないでしょうか?
継ぎ目以外ではピクピクしないのでしょうか?

Re:OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月02日(火) 14:20
by 山口
ISLe様
ご回答ありがとうございます。
つなぎ目以外では希望の様にスクロールしてくれます・・・。
多分、描画用に作った関数が行けないのかも知れません・・・。

Re:OpenGLES 2.0 背景のスクロールについて

Posted: 2010年11月02日(火) 18:46
by ISLe
squareVerticesにセットする値は、サイズが奇数のとき1ピクセル少なくなりますね。
継ぎ目での端数の扱いが面倒ですね。

いっそクリッピングはOpenGLに丸投げにして一部を切り出さずに
DrawTexture(1024/2-scBack, 512/2, texBack, scBack, 0, 1024, 512, 0xffffff, 255);
DrawTexture(1024/2-scBack+1024, 512/2, texBack, scBack, 0, 1024, 512, 0xffffff, 255);
というふうにテクスチャ全体を使うほうがシンプルになりますけど。
#引数は合ってないかも。