【问题标题】:Using glScissor in android OpenGL在 android OpenGL 中使用 glScissor
【发布时间】:2015-12-03 16:41:39
【问题描述】:

我想根据我的内部应用逻辑只渲染我的屏幕的一部分。 但我在为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 只是我测试时给出的值……但是屏幕内容是在屏幕的多个位置重复绘制的……

我正在使用2*x/width-12*y/height-1 将我的屏幕坐标映射到我的attact.draw(攻击是我的一类对象)中的OpenGL 坐标

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

【问题讨论】:

    标签: android opengl-es renderpartial


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢..它现在可以工作了....我如何在多个地方绘制,例如使用多个剪刀矩形...??? @雷托科拉迪
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2012-10-22
    相关资源
    最近更新 更多