2013-07-03 55 views
0

運行ATI Radeon HD 5800 Series的筆記本電腦用戶只是向我展示了我的2D遊戲在他的機器上運行的視頻,並且它看起來像我的glScissor代碼沒有按預期工作(儘管它工作的很多其他電腦)。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來保證它按照我所說的順序執行。

回答

2

我把我的錢放在一個驅動程序錯誤。你的代碼看起來很好。

的唯一的事情,我建議改變這一點:

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

成一個單純的

OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest); 

更改glEnable狀態變爲幾乎免費的,所以這樣做的測試是microoptimization。事實上,第一次使用glIsEnabled進行測試的成本可能會相當高,因爲冗餘設置會導致開銷。但是碰巧有些司機可能會在glIsEnabled報告的內容中出現問題,所以我會刪除它以削減另一個潛在的錯誤來源。

我有一種感覺glEnable/glDisable可能需要一個glFlush或glFinish來保證它按照我所說的順序執行。

不,他們沒有。事實上,大多數程序並不需要glFlush和glFinish。如果你使用雙緩衝區,你根本不需要它們。

+0

我與用戶聯繫,他運行了'AMD Driver Autodetect',它告訴他他有最新的驅動程序,並且正在運行Windows 7. –

+0

@ Mr.Smith:是的。所以呢?即使是最新的驅動程序也可能有錯誤。 – datenwolf

+0

好吧,我會被詛咒的,「glIsEnabled」不僅僅是一個表現問題,而且也是罪魁禍首。刪除它修復了它,並且我還發現了其他人做了類似的操作:[明確地將GL_SCISSOR_TEST保存到解決方法驅動程序錯誤](https://github.com/MachineMuse/MachineMusePowersuits/pull/325) –