glScissor在我的代码中表现得很奇怪

时间:2013-07-03 19:14:52

标签: opengl

运行ATI Radeon HD 5800 Series的笔记本电脑用户只是向我展示了我的2D游戏在他的计算机上运行的视频,看起来我的glScissor代码无法正常工作(尽管它正在处理很多其他电脑)。

每当我想将渲染限制在屏幕上的某个矩形时,我会将SetClip函数调用到特定的矩形,或Rectangle.Empty来重置剪刀。

public void SetClip(Rectangle theRect)
{
    if (theRect.IsEmpty)
        OpenGL.glDisable(OpenGL.EnableCapp.ScissorTest);
    else
    {
        if (!OpenGL.glIsEnabled(OpenGL.EnableCapp.ScissorTest))
            OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

        OpenGL.glScissor(theRect.Left, myWindow.clientSizeHeight - theRect.Bottom,
           theRect.Width, theRect.Height);
        CheckError();
    }
}

这种方法有误吗?例如,我觉得glEnable / glDisable可能需要glFlushglFinish来保证按照我调用它们的顺序执行它。

1 个答案:

答案 0 :(得分:2)

我把钱花在了驱动程序错误上。你的代码看起来很好。

我建议改变这一点:

if (!OpenGL.glIsEnabled(OpenGL.EnableCapp.ScissorTest))
       OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

仅仅是

OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

改变glEnable状态实际上是免费的,因此进行该测试是微优化。实际上,使用glIsEnabled进行首次测试可能会花费同样多的成本,因为冗余设置会导致开销。但是有些驱动程序可能会因glIsEnabled报告的内容而出错,所以我会删除它以减少另一个潜在的错误来源。

  

我觉得glEnable / glDisable可能需要一个glFlush或glFinish来保证它按照我调用它们的顺序执行。

不,他们没有。事实上,大多数程序都不需要glFlush和glFinish。如果您使用双缓冲区,则根本不需要它们。