0

一位笔记本电脑用户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可能需要glFlushorglFinish来保证它按照我调用它们的顺序执行。

4

1 回答 1

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。如果您使用的是双缓冲区,则根本不需要它们。

于 2013-07-03T19:20:58.713 回答