系統:的Android 4.03,OpenGL ES 2.0的在OpenGL ES中提供良好/有效的練習期間編譯着色器?
問題:當glAttachShader在第一幀之後調用已經呈現與另一個程序/着色器,某些設備(銀河S3)崩潰與 「GL_INVALID_VALUE」錯誤(錯誤堆棧中沒有更多詳細信息)。其他設備(華碩eee TF101)完全正確。該錯誤並不總是會發生,有時它也是一個「GL_INVALID_ENUM」。 如果我強制在第一次調用onDrawFrame時編譯所有着色器,它可以在所有(我的)設備上運行。
問題: 是否存在openGL(ES)機器不能編譯着色器的狀態? 綁定緩衝區,紋理或啓用的屬性數組是否有可能干擾將着色器附加到程序? 如果是這樣,在附加着色器和鏈接程序之前,必須確保什麼樣的理想狀態? 在其他對象已經被其他着色器渲染之後編譯着色器是否合法?
背景:我開發一個Android的庫,這將允許我使用OpenGL圖形以一種更加面向對象的方式(使用對象,如「場景」,「材料」,「模範」等),utlimatively到輕鬆寫遊戲。場景,模型等創建在與GL上下文不同的線程中。只有當onDrawFrame遇到其中一個對象時,它纔會在正確的線程中執行緩衝區對象綁定,紋理綁定和着色器編譯。 我想避免在我的代碼開始處編譯所有着色器。着色器源根據材質,模型和場景的要求進行組裝(例如:材質:包含凹凸貼圖,模型:包含矩陣 - 調色板 - 略圖,場景:包含霧)。當模型從場景中移除時,我將再次刪除着色器 - 如果我添加另一個模型,則應該編寫新的着色器。
在這一點上,我試圖儘可能簡潔,沒有發佈代碼 - 你可以想象,從這個庫中提取相關部分是困難的。
這聽起來很有趣 - 我是否得到了正確的結論,即使它們之前已經編譯過,驅動程序會在觸發某些狀態/事件時自動重新編譯着色器?我可以在哪裏瞭解更多關於這種行爲 –
這對您而言是透明的,但瞭解其含義是獲得良好表現的關鍵。在此查看示例Tegra文檔:http://docs.nvidia.com/tegra/data/Optimize_OpenGL_ES_2_0_Performance_for_Tegra.html – Trax
AMD提供了一個名爲MakeBinaryShader.exe的Windows可執行文件,該文件將文本着色器編譯爲二進制文件。 AMD還提供了一個基於庫的界面BinaryShader.lib,它提供了可以調用的函數,以直接從應用程序中編譯着色器。 Imagination Technologies還提供了自己的二進制着色器編譯工具PVRUniSCo和一個名爲PVRUniSCo Editor的編輯器。 – GLES