2012-05-01 3 views
0

Я разрабатываю 2D-прокручивающую игру. У меня есть черепичное растровое изображение для фона размером 2400x480. Как я могу прокрутить это растровое изображение?Прокрутка в OpenGL ES 1.1

Я знаю, что я могу сделать это с помощью следующего кода:

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

Так будет прокручиваться растрового изображения для 240000 пикселей.

Но я не хочу рисовать изображения, которые остаются на экране (размером 800x480).

Как я рендер прокрутки плитки? Как я могу дать скорость его? (Для параллакс прокрутки после нормального прокручивания)

+0

_scrambling через мой мозг_ Вы не должны [принимать ответы] (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: Если ваш hw является совместимым с OpenGL ES2.0, то, скорее всего, ваша фиксированная функция в любом случае реализуется только с помощью шейдеров. Создание простых шейдеров может привести к некоторым показателям производительности. – CuriousChettai

Смежные вопросы