2012-06-07 90 views
12

我一直在研究這個問題我有,我似乎無法理解它足夠好解決它,所以我想我不妨把它扔出去,智能束可能有一些想法。 :PGLKit的GLKBaseEffect和自定義着色器

基本上我一直在一個iPhone項目的同時,我擁有的奢侈品使用所有最新的框架和目標5.1。所以我一直在使用GLKit和GLKBaseEffect,它們對我來說工作得很好。我開始使用GLKBaseEffect而不是寫自己的着色器的原因是我不瞭解glsl。然而,這些要求變得更加精確,基本效應似乎不再削減。

因爲我已經做使用基數效應的影響,我寧願如果我能保持我的基數效應不變,但在上面添加GLSL型着色器,如果讓任何意義我所有的轉換。

我的舊方法看起來像這樣(這是在一個循環渲染所有對象,其中一個對象包含諸如變換,網格和其他一些不太重要的事情,例如紋理,材質等等。 )

ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName]; 
GLKMatrix4 modelview = effect.transform.modelviewMatrix; 
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform); 

[effect prepareToDraw]; 
[obj render]; 

effect.transform.modelviewMatrix = modelView; 

在這裏,我們取一個對象來呈現和變換(即平移,旋轉和縮放)的對象,然後我們渲染它,那裏的渲染本身獲取該對象的網格,綁定緩存和渲染。

到目前爲止這麼好。

但是我想要做的事情是,在[obj render];調用期間,我希望該對象也可以像glUseProgram(someProgram);那樣添加更專用的着色器代碼。

我想人們可能認爲我想使用基數效應爲我的頂點着色器,想用我的片段着色「正常」的着色器。至少這就是我想我想要做的。

我一直在嘗試一些東西。

我試着在它上面創建片段着色器和glUseProgram,但是它表示在設置和編譯它時需要一個頂點和一個片段着色器。我也試圖創建一個空的頂點着色器,這個着色器效果並不好,我不知道會發生什麼,但我猜測它推翻了基本效果。

我扶着走向,到底會接受,它可能是最好的拋出了基數效應,只是寫我自己的着色器的所有道路。我只是覺得在窗外工作很多,所以我想看看我可以節省多少錢。

我也明白,我的着色器的理解是給我最多的問題的一部分,所以請耐心等待與事實。

回答

11

就像你發現的那樣,你不能只使用片段着色器,而是留下頂點着色器。這是因爲兩者都有不同的任務。頂點着色器處理每個頂點的方面:計算頂點數據,紋理(UV)等,最後繪製面(三角形)。片段着色器處理在屏幕上(或視口中)的每個像素上將繪製的內容。當你只提供一個片段着色器,你告訴你的頂點數據,而你只告訴OpenGL做像素的東西。而且這些像素沒有任何東西/亂碼(我不確定是哪個),因爲你的頂點着色器沒有做任何事情。

當使用GLKEffect,調用該方法[yourEffect prepareToDraw]負責着色器等

如果你只是想用股票着色器對,爲什麼不使用在Xcode的OpenGL遊戲模板提供的一個?當你運行它時,它有兩個立方體,一個使用GLKit渲染,另一個是正常的方式。儘管我認爲這對大部分效果來說還不夠。如果您想了解更多關於着色器的信息,可以查看NeHe GLSL簡介article。關於GLSL以及如何在代碼中編寫和使用着色器。你可能想看看Diney Bomfim'sAll About Shaders的文章和這個page

在大多數情況下使用GLKit是非常好的,因爲它可以幫助您避免編寫大量無用的重複代碼。例如,您不必通過使用GLKTextureLoader即可使用不同顏色編碼和每像素位數(每種格式)的所有圖像格式。

+0

我似乎已經完全忘記了實際上說謝謝你提供的鏈接確實拓寬了我的理解。我很高興我問,即使在問的時候我覺得我根本不知道我實際上做了什麼要求......這麼好的工作搞清楚了;)謝謝。 – qrikko

+0

非常感謝。我很沮喪,我的着色器正在編譯和鏈接,但沒有輸出任何東西。去掉prepareToDraw的這個調用就行了。生活很好! – VaporwareWolf

18

我只是想給我感興趣的人的結論。

我所做的實際上是拋出了GLBaseEffect,並實現了我自己的着色器代碼。

我最大的問題是我並不真正瞭解它是全部或全無可以這麼說。

請我可能是錯的,所以任何糾正我錯在哪裏將不勝感激,我真的不想欺騙任何人閱讀此。

我發現了什麼在我的努力是幾個關鍵點:

  • GLKBaseEffect,是爲了模仿固定功能管線與早期版本的OpenGLES的觀察。因此它包裝了常見的着色器代碼,所以你不必非常關心它。你將擁有基本的功能,但它不是非常的可擴展。
  • 如果您編寫自己的着色器代碼,仍然可以使用GLKit的整潔特性,例如紋理加載器,數學庫等。因此,如果您想要更復雜或可定製的東西(凹凸貼圖,香椿着色等),完全值得重寫正確渲染所需的樣板代碼。我最開始做的是我使用GLKBaseEffect來定位場景,因爲它非常舒適,易於使用。然而,當我想要做更多的事情時(切線空間法線貼圖),由於我無法添加到由GLKBaseEffect處理的着色器程序中,所以我陷入了困境。
  • 着色器確實沒有我一直認爲的那麼可怕!我只是不知道它的真正含義,我很驚訝我已經閱讀了很多關於它們的知識,但仍然沒有理解基本着色器是REPLACING固定功能管道的程序。就那麼簡單。

這就足夠了我想,只是想跟進並添加我收集到的這些東西。

+0

嗨qrikko我可以給你發電子郵件瞭解一個潛在的項目嗎?感謝您的詳細解答! – Crashalot

+0

絕對沒有問題,我總是試圖在這麼辛苦,因爲它對於很多人來說都是如此重要的資源。 :) – qrikko

+0

很酷謝謝,你的電子郵件是什麼? – Crashalot