在Android OpenGL

时间:2015-12-03 16:41:40

标签: android opengl-es renderpartial

我想根据我的内部应用逻辑只渲染我的屏幕的一方。 但我面临的问题是为glScissor提供参数。

这是我的onDrawFrame方法:

@Override
public void onDrawFrame(GL10 gl) {
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glPushMatrix();
    gl.glScissor(250,250,300,300);

    gl.glEnable(GL10.GL_SCISSOR_TEST);

    gl.glViewport(250,250,300,300);

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    attack.draw(gl);

    gl.glDisable(GL10.GL_SCISSOR_TEST);

    gl.glPopMatrix();
}

250,250,300,300只是我给测试的值......但屏幕内容是在屏幕的多个位置重复绘制的......

我使用attact.draw2*x/width-1

将我的屏幕坐标映射到我的2*y/height-1中的OpenGL坐标(攻击是我班级的一个对象)

有人可以告诉我使用glScissor做错了什么,并指导我做正确的做法。

1 个答案:

答案 0 :(得分:0)

问题很可能是您没有清除整个渲染表面。通常(不考虑可以改变行为的扩展),您需要清除整个表面,或者确保在每次重绘时覆盖渲染期间的所有像素。帧的任何未清除/渲染的部分都将是未定义的。看起来像重复绘图可能只是未定义的内容。

您没有清除整个表面的原因是剪刀测试适用于glClear()。因此,在启用剪刀测试和剪刀矩形设置的情况下,只会清除该矩形。

要解决此问题,您只需将呼叫顺序更改为:

即可
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glScissor(250, 250, 300, 300);
gl.glEnable(GL10.GL_SCISSOR_TEST);

使用此顺序,调用glClear()时将不会启用剪刀测试,并且将清除整个曲面。