簡體   English   中英

SurfaceCreated之后可以加載OpenGL ES 2.0着色器程序

[英]Possible to load OpenGL ES 2.0 shader program after SurfaceCreated

我目前正在使用OpenGL ES 2.0構建適用於Android的圖像處理應用程序,我想知道在該應用程序中使用着色器程序的情況。

我不確定是否可以一次加載的着色器程序(無法使用Google打開任何東西)的最大限制,但是目前我正在查看應用程序中的10到20個着色器程序。 該應用程序不是游戲,而是用於圖像的圖形編輯。 我想象一個游戲會使用更多的陰影,所以我不確定這對應用程序是否有太多開銷,或者這意味着我當前正在浪費時間優化不需要優化的代碼。

不幸的是,我只需要在任何一次使用這些着色器中的2-6個之間的任何位置。 我本來是試圖設計代碼的,所以它只會在特定時間加載所需的着色器程序,並刪除不需要的着色器程序,但到目前為止,似乎我無法單擊鼠標來加載着色器程序。按鈕。

着色器調用應在onSurfaceChanged(),onSurfaceCreated()或onDrawFrame()的GL線程內

當我嘗試在上述任何方法之外(單擊按鈕時)創建着色器時,glCreateShader方法將返回0。 我試過在queueEvent中調用它,理論上應該將其放在GL線程上,但它仍返回0。

所以我現在是否在考慮是否需要在創建GL Surface時加載所有10-20個着色器程序(或將它們與其他if一起放入我的draw方法中以確定是否需要加載任何着色器程序) )。 即使我一次只使用其中的很少幾個,這樣做有什么問題嗎?

您可以隨時創建着色器。 可以擁有多少個着色器對象沒有硬性限制。 他們顯然使用內存,但是它們不是很大,並且有幾十個根本不是問題。

在啟動時構建大量着色器的主要權衡通常是啟動時。 着色器編譯是一個相當昂貴的過程。 對於具有數千個着色器的高端游戲,這是一個嚴重的問題。 同樣,根據您正在談論的數字,我認為這並不重要。

如果要繼續進行延遲的着色器編譯,則將編譯委托給渲染線程是正確的。 您需要擁有最新的OpenGL上下文,並且在Android中使用GLSurfaceView時,是在上下文上運行的渲染線程。 不太確定為什么您對queueEvent的嘗試不起作用。 當您最終進入渲染線程時,上下文可能不是最新的。 如果這是問題所在,則很可能已解決。

我要嘗試的是,當用戶線程要更改着色器時,請在GLSurfaceView中設置用戶變量,並指定新請求的着色器(注意成員變量的線程安全性)。 然后,渲染線程可以在onDrawFrame()檢查所請求的着色器是否不同於當前着色器。 如果不同,請檢查所着色器是否已編譯,例如通過保留着色器名稱到着色器對象的映射。 如果尚未編譯,則將其編譯並存儲在地圖中。 將新的着色器設為當前,然后進行渲染。

還有另一種方法,但我認為這並不簡單。 您可以在GUI線程中,在與呈現上下文相同的共享組中創建另一個EGLContext。 然后,您可以在UI線程中編譯着色器。 您仍然需要與渲染線程同步,以便在准備使用新的着色器時通知它。 您還冒着遇到錯誤的風險,因為上下文之間的對象共享在Android上使用不多,如果它不能在所有設備上正常工作,我也不會感到驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM