运行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
可能需要glFlush
或glFinish
来保证按照我调用它们的顺序执行它。
答案 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。如果您使用双缓冲区,则根本不需要它们。