我需要在每個WebGL片段着色器調用(包括沒有OES_texture_float或OES_texture_half_float擴展可用時)中保存多達8個32位值。看來我只能通過將它打包到4x8bits RGBA gl_FragColor中來存儲單個32位值。 有沒有辦法存儲8個值?WebGL着色器保存多個32位值
0
A
回答
1
在片段着色器中每次調用繪製多個vec4數據的唯一方法是使用WEBGL_draw_buffers
,它允許您將多個顏色附件綁定到幀緩衝區,然後在單個片段着色器調用中使用它們呈現給所有人
gl_FragData[constAttachmentIndex] = result;
如果WEBGL_draw_buffers
不是唯一可用的解決方法是我能想到的是
渲染在多個繪製調用。
撥打
gl.drawArrays
呈現第一個vec4
,然後再用不同的參數或不同的着色器渲染第二個vec4
。基於gl_FragCoord進行渲染,您可以在其中更改每個像素的輸出。
。換句話說,第一像素獲取第一vec4,第二像素獲取第二個vec4等。例如
float mode = mod(gl_Fragcoord.x, 2.); gl_FragColor = mix(result1, result2, mode);
以這種方式將結果存儲這樣
1212121212 1212121212 1212121212
成一個質地。欲瞭解更多vec4s你可以這樣做
float mode = mod(gl_Fragcoord.x, 4.); // 4 vec4s if (mode < 0.5) { gl_FragColor = result1; } else if (mode < 1.5) { gl_FragColor = result2; } else if (mode < 2.5) { gl_FragColor = result3; } else { gl_FragColor = result4; }
這可能會或可能不會比法1#快。着色器更復雜,因爲它可能對每個像素的result1和result2都進行計算,但取決於GPU和流水線,您可能會免費獲得一些。
至於讓32位值了,即使沒有OES_texture_float
你基本上會寫出來,使用了上述3個技術之一,更是8位值。
在WebGL2繪製緩衝區是一個必需的功能,因爲它在WebGL1中是可選的。在WebGL2中還有變換反饋,它將頂點着色器的輸出(變化)寫入緩衝區。
相關問題
- 1. WebGL多重着色器
- 2. WebGL片段着色器有多大?
- 3. WebGL 1D紋理 - 着色器值捕獲
- 4. 優化WebGL着色器?
- 5. WebGL的着色器錯誤
- 6. 保存/加載編譯的webgl着色器
- 7. 的WebGL:應用多顏色着色器4個三角形
- 8. webgl /三個js着色器錯誤
- 9. Three.js着色器(WebGL着色器)中的旋轉
- 10. UILabel的多色着色與保存lineHeight
- 11. GLSL着色器和WebGL問題
- 12. WebGl Phong着色器中的Bug
- 13. WebGL着色器中的const float數組
- 14. 我如何基準WebGL着色器?
- 15. WebGL - getAttribLocation:無對象,着色器問題
- 16. webgl的着色器 - 分通道RGBA
- 17. WebGL幾何着色器等效?
- 18. 着色器語法錯誤 - Unity WebGL
- 19. WebGL的片段着色器透明度
- 20. WebGL中的開關着色器程序
- 21. webgl替換程序着色器
- 22. webgl readpixels紋理着色器問題
- 23. WebGL:在着色器之間切換
- 24. 在travis-ci上運行WebGL着色器
- 25. WebGL着色器創建問題
- 26. WebGL着色器z位置未用於深度計算
- 27. WebGL和HTML着色型
- 28. webGL中的平面着色
- 29. 使用多個着色器
- 30. 多個着色器或一個大着色器?
是否提供webgl 2? – harold
@harold,webgl 1也需要支持 –
@gman,感謝您的提示,但需要廣泛支持的解決方案 –