我正在開發2D橫向滾動遊戲。我有一個平鋪的位圖,用於背景,大小爲2400x480.如何滾動此位圖?在OpenGL ES 1.1中滾動
我知道,我可以用下面的代碼做到這一點:
for(int i=0;i<100;i++)
draw(bitmap,2400*i,480);
因此,將滾動位圖240000個像素。
但我不想繪製圖片保持在屏幕外(尺寸爲800x480)。
我怎麼能渲染滾動瓷磚?我如何給速度呢?(對於正常滾動後的視差滾動)
我正在開發2D橫向滾動遊戲。我有一個平鋪的位圖,用於背景,大小爲2400x480.如何滾動此位圖?在OpenGL ES 1.1中滾動
我知道,我可以用下面的代碼做到這一點:
for(int i=0;i<100;i++)
draw(bitmap,2400*i,480);
因此,將滾動位圖240000個像素。
但我不想繪製圖片保持在屏幕外(尺寸爲800x480)。
我怎麼能渲染滾動瓷磚?我如何給速度呢?(對於正常滾動後的視差滾動)
下面的代碼不使用兩個四邊形,但一個四,並適應紋理相應座標。請注意,我刪除了所有紋理處理代碼。投影矩陣僅包含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
。
如果你還沒有着色器的工作,我們可以有一個更清潔,可能是更有效的方式來做到這一點。
創建一個覆蓋整個屏幕四邊形的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設置統一值。
我沒有使用OpenGL ES 2.0 – droidmachine
@droidmachine:如果你的硬件是符合OpenGL ES2.0的,那麼很可能你的固定功能只能通過着色器實現。使着色器變得簡單可能會讓你獲得一些性能數據。 – CuriousChettai
_scrambling through my brain_你不應該[接受答案](http://stackoverflow.com/a/10179587/1262542)不幫助你。沒關係。 –
@StefanHanke對不起,但我接受,因爲我應該明白你說的話。然後我試着編碼這個算法,但我不能成功。這就是爲什麼我再次問。 – droidmachine