2012-09-19 81 views
1

我打算做一個簡單的繪圖工具,它支持Photoshop中的多個圖層和所有混合模式。Photoshop「混合模式」與OpenGL

我正在考慮在GPU上進行混合(將每個圖層放入一個紋理並繪製兩個三角形來渲染每個圖層)。但我不確定,如果可以通過OpenGL的blendFunc/blendEquation等實現所有blend modes

另一個選擇是將所有紋理+混合模式標誌傳遞給一個片段着色器,並按照我的意願混合它們,但添加/刪除某些圖層(sampler2D)時,我將不得不重新編譯FS。

那麼你怎麼看?可能嗎?有沒有更好的方法來使用GPU進行混合?所以我現在應該關心它,還是應該全部使用CPU並關心未來的增強功能?

順便說一句。這將是使用WebGL的JavaScript程序,但我認爲這並不重要。

+2

*如果可以用OpenGL的blendFunc/blendEquation等實現所有的混合模式*不可能實現所有的混合模式。硬件幀緩衝混合在它可以執行的操作中受到一定的限制。 – Tim

+0

謝謝蒂姆,我認爲有些混合模式是不可能的,但我不確定。所以我只會在CPU上實現。 –

+1

如果有幫助,我的開源框架在這裏:https://github.com/BradLarson/GPUImage有很多這些混合模式作爲OpenGL ES着色器,它們應該很容易移植到WebGL。我將Adobe自己的參考規範用於混合計算,因此它們應該與Photoshop的行爲緊密匹配。只需查看各種混合類實現的頂部即可查看我使用的着色器代碼。 –

回答

1

當然可以。但它需要在共享者中完成。

加載兩張圖片(實際上可以更多),渲染三角形。但是,只需使用着色器探測兩個紋理並將這些值與依賴於當前混合模式(作爲統一提供)的方程混合即可。

PS不要忘記關閉mipmap和過濾。

+0

是的,我知道,但有些事情我不喜歡那個解決方案。我將不得不爲每一層設置不同的「採樣器」。添加圖層時,我必須製作新的FS程序。當兩層有不同的尺寸時可能會有問題。這就是爲什麼我想用「多個圖紙」來實現framebuffer。 –

+0

好的。所以使用多通解決方案。渲染到紋理而不是渲染到渲染緩衝區。當你完成了所有圖層的渲染,然後渲染爲普通紋理。這樣,無論有多少層,你只需要一個FS。 –

+0

是的,但有一個問題 - 我希望能夠使用Photoshop中的所有混合模式將所有這些紋理混合在一起。 –