2013-09-29 52 views
1

即時通訊基本上試圖提供關於對象的不同形狀信息到用glsl編寫的光線跟蹤器。訪問來自glsl着色器的自定義數據

形狀像

球體:VEC3中心;浮動半徑;

box:vec3 center; vec3 halfSize;

的問題有以下要求:

  1. 在片段着色器可以訪問所有的形狀
  2. 不使用統一的變量,給他們的每一幀,不知何故緩存它們更長的時間直到手動移除。
  3. 能夠從應用程序
  4. 數據是可變長度每種類型的更新數據(球,箱的計數,...)

數據沒有被交織。

  • 所以統一變量發送太多的數據。似乎
  • 屬性不被換貨很多種對象(屬性陣列使用一個位置上的每個元件)
  • 紋理改變數據不期望且難看訪問形狀信息

這樣一個如何能做到這一點?

最好還具有代表數據的結構。像結構體Sphere {vec3 p; float r; }; ...

+0

一般來說,在片段着色器你將有機會獲得的唯一途徑「所有」的東西,如果你使用的紋理或最近(的OpenGL 4.2+)圖像加載/存儲的狀態存儲。計算着色器是一個非常適合這種事情,所以很高興知道你所瞄準的是哪一代硬件G。 –

回答

1

您可以使用Uniform Buffer Objects,如果存儲你所需要的量是不是太巨大。這些基本上都是使用glUniformBlockBinding綁定在一起而不是單獨綁定的統一塊。這樣整個緩衝區就被寫入一次,然後在每個着色器調用之前綁定。 UBO必須具有至少16KB的最大大小,所以你應該沒問題,除非你有大量的基元/基元類型。 (請注意,數組必須是固定大小的,所以每當您更改基本數組的大小時,您都需要重新編譯着色器,或者分配足夠的數據以保存您將需要的最大數量。 ,你需要OpenGL 4.3和Shader Storage Buffer Objects,它們基本上是UBO,但更大,可以寫入(讀取和寫入是不連貫的,因此在使用SSBO時需要使用相同的內存屏障,就像圖像統一一樣) 。