2015-04-06 56 views
1

我的一個朋友必須在c中繪製一個帶有opengl的mandelbrot。我決定在Swift中做到這一點。非常快的像素在屏幕上繪圖

我試過的第一種方法是用ARGB數據創建一個數組並將其轉換爲CGImage並在UIImageView中查看該數組。然而這還不夠快。

現在我想知道,將單個像素繪製到屏幕上的最快方法是什麼。我看着金屬,但似乎主要是關於三角形和三維的東西。然後我來到scenekit着色器(.fsh),並認爲這可能是一個很好的解決方案。但我想也能放大mandelbrot分形,我無法找到一種方法來輸入變量在我的mandelbrot(我的參考:https://www.weheartswift.com/fractals-xcode-6/

你們可以告訴我/給一個例子(Swift請)在最快繪製單個像素的方式,或者至少是一種將原始像素繪製到屏幕上的方法,而不必像構建CGImage那樣使用中間值等東西?

+0

您爲什麼認爲畫CGImage是慢?你的代碼是否運行過儀器?你究竟發現了什麼? – matt

+0

你想計算GPU上的分形樣本(使用OpenGL着色器)嗎?或者你想要在CPU上計算它們(使用Swift)並且快速繪製它們?您是在每次計算像素時創建一個新的'CGImage',還是在計算完所有像素之後創建一個CGImage? –

+0

@matt這是一種解決方法,因爲我找不到更直接的繪畫方式,而且我還必須在內存中創建一堆像素,所以我認爲它確實比較慢。 – Simon

回答

0

如果你想計算GPU上的分形,那麼這是一個比Swift問題更多的OpenGL(或金屬)問題。您需要採取較小的步驟:

  1. 使用OpenGL在屏幕上獲取純色三角形。
  2. 用兩個純色三角形填充屏幕。
  3. 使用片段着色器以簡單漸變填充三角形。
  4. 用簡單的紋理填充三角形。
  5. 執行兩階段繪圖:繪製到屏幕外緩衝區(帶有三角形和着色器),然後使用該緩衝區作爲紋理在屏幕上繪製。
  6. 使用着色器將分形繪製到離屏緩衝區中。

請注意,第6步可能很困難,您可能需要幫助,但是直到您可以成功執行步驟1-5爲止,即使啓動也沒有意義。您應該能夠找到很多教程來幫助您完成步驟1-5,但您可能需要將它們從C,C++或Objective-C轉換爲Swift。

您鏈接的頁面完全跳過步驟1-5,因爲Xcode場景查看器會爲您處理它們。如果你想編寫一個獨立的應用程序,你需要學習如何完成這些步驟。

+0

好的,所以最終我會得到一個帶有兩個三角形的屏幕,它們一起填滿整個屏幕,並且具有相同的着色器,總共呈現mandelbrot?如果這是我應該這樣做的方式,我會嘗試並按照你的指導步驟 – Simon

2

不是使用頂點和片段着色器,而是使用內核函數(或計算着色器)。這將是一個單一的着色器,它可以完成數學運算並在紋理的每個像素處設置顏色值。然後可以使用CAMetalLayer將紋理渲染到屏幕上。

看看這個博客帖子裏寫到使用粒子傳遞到內核函數座標的質地:http://flexmonkey.blogspot.co.uk/2015/03/swift-metal-four-million-particles-on.html

+0

哇謝謝,這看起來像一個驚人的知識來源:)當我有時間的時候我會潛入這個! – Simon