我想根据我的内部应用逻辑只渲染我的屏幕的一方。
但我面临的问题是为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
,2*x/width-1
2*y/height-1
中的OpenGL坐标(攻击是我班级的一个对象)
有人可以告诉我使用glScissor
做错了什么,并指导我做正确的做法。
答案 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()
时将不会启用剪刀测试,并且将清除整个曲面。