在 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-1
, 2*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()
时不会启用剪刀测试,整个表面将被清除。
我只想根据我的内部应用程序逻辑呈现我的屏幕的一部分。
但是我在给 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-1
, 2*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()
时不会启用剪刀测试,整个表面将被清除。