在 android OpenGL 中使用 glScissor

Using glScissor in android OpenGL

我只想根据我的内部应用程序逻辑呈现我的屏幕的一部分。 但是我在给 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.draw 中的 OpenGL 坐标(攻击是我的 class 之一的对象)使用 2*x/width-12*y/height-1

谁能告诉我我在使用 glScissor 时犯了什么错误,并指导我找到正确的方法。

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

您没有清除整个表面的原因是剪刀测试适用于 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()时不会启用剪刀测试,整个表面将被清除。