我正在开发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