2011-02-28 150 views
2

我正在使用2D紋理創建動畫萬花筒的應用程序。它開始顯示給NSOpenGLView。我添加了一個選項來切換到全屏模式。如何在Mac OS中共享NSOpenGLView和全屏上下文之間的紋理?

我寧願使用OS 10.5的方法來全屏,所以我可以支持10.5,但我想我會面臨同樣的問題,如果我使用的方法在「創建一個全屏應用程序Mac OS X v10.6「。

NSOpenGLContext init方法initWithFormat:shareContext:將一個可選指針指向「另一個OpenGL圖形上下文,其紋理名稱空間和顯示列表要與接收器共享」。

的代碼我使用創建全屏OpenGL上下文很簡單:

NSOpenGLPixelFormatAttribute myAttributes[] =    // Pixel Format Attributes for the FullScreen NSOpenGLContext 
{ 
    NSOpenGLPFAFullScreen,         // specify full-screen OpenGL context 
    NSOpenGLPFAScreenMask, 
    CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), // specify main display 
    NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) 32, 
    NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 0, 
    NSOpenGLPFAStencilSize, 0, 
    NSOpenGLPFADoubleBuffer, 
    NSOpenGLPFAAccelerated, 
    0 
}; 

NSOpenGLPixelFormat *myPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:myAttributes]; // Create FullScreen NSOpenGLContext with these attributes 


NSOpenGLContext *fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:myPixelFormat shareContext: myContext]; // Create an NSOpenGLContext with the FullScreen pixel format. 

然而,它似乎並沒有工作。

我的應用程序只使用一個紋理,所以我開始不使用glGenTextures和glBindTexture。相反,我只是使用單個當前紋理作爲上下文。

我試着改變我的代碼來創建一個帶有glGenTextures的命名紋理,希望我可以在切換到全屏上下文但沒有骰子後綁定命名的紋理。兩種方法都會得到相同的結果 - 紋理在全屏幕上下文中不起作用。

我沒有得到任何錯誤,但使用紋理繪圖不會做任何事情。

我每次切換到全屏模式時都被迫重新創建紋理。這很糟糕,因爲紋理可能非常大(取決於用戶加載的圖像的大小,直至最大紋理大小)。這迫使我將兩個非常大的對象副本加載到VRAM中。更糟糕的是,在某些情況下,我必須進行字節調整才能使字節順序正確。這需要花費幾秒鐘的時間才能進入全屏模式,這會導致「懷孕暫停」。

是否有一些技巧我錯過了在NSOpenGLView和全屏OpenGL上下文之間共享紋理?

+0

理論上你應該只需要爲每個上下文創建一次紋理(只要你每次都不刪除/重新創建一個上下文)。您還可以測試GLuint是否使用glIsTexture引用了有效的紋理 – vmpstr 2011-02-28 15:00:14

回答

0

我最近在OSX上共享上下文,努力爲缺乏應該完成的工作清單而努力。我認爲值得分享一些小東西或關鍵字,以幫助找出問題出在哪裏。

建議:如果沒有正確的檢測工具(參見開發者網站的khronos或NVidia),使用繪圖API(如DirectX和OpenGL)可能會非常痛苦。一個正確的工具是你需要的第一件事。

  1. 您創建了一個新NSOpenGLContext使用相同的像素格式初始化它和inidicating其他上下文源資源共享。大!
  2. 您應該使用setOpenGLContext方法將其分配給您的NSOpenGLView。(無需updatesetview或其他的東西,我看到周圍的網絡上非常舊的文章)
    • 如果您創建使用xib文件你的窗口,你可以使用NSOpenGLView類的方法awakeFromNib改變默認情況下剛創建的新的
    • 附加到視圖的舊上下文將自動銷燬
    • 共享上下文中的任何預先創建的資源也將在新的資源中「導入」。
  3. 呼叫[your_new_Context makeCurrentContext] - 我這樣做是在awakeFormNib方法
  4. (在這裏,我想是@Duncan的問題),你需要設置你需要的所有渲染狀態。渲染狀態不會在上下文中共享!只有資源。這些是你想要設置的一些渲染狀態(根據你的需要改變它們):

    glEnableVertexAttribArray(pgmImagePosition_); glEnableVertexAttribArray(pgmImageTextureCoord_); glEnable(GL_TEXTURE_2D); glDisable(GL_DITHER); glDisable(GL_DITHER); glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); glDisable(GL_STENCIL_TEST); glDisable(GL_FOG); glDisable(GL_DEPTH_TEST); glPixelZoom(1.0,1.0); glClearColor(0.1,0.1,0.1,1.0);

希望這可能有所幫助。仍建議讀取https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_contexts/opengl_contexts.html

相關問題