2016-03-31 18 views
2

Gölgemden bir arabellek kullanmam gerekiyor. Tampon bir diziden oluşturulur. (Gerçek senaryoda, dizi 10k + (değişken) numaraları vardır.) O gölgelendiriciye tarafından kullanılabilir yani WebGL: Gölgelendiriciden erişim arabelleği

var myBuffer = gl.createBuffer(); 
gl.bindBuffer(gl.ARRAY_BUFFER, myBuffer); 
gl.bufferData(gl.ARRAY_BUFFER, new Uint8Array([1,2,3,4,5,6,7]), gl.STATIC_DRAW); 

Nasıl gönderebilirim? Bir özellik olsaydı

precision mediump float; 
uniform uint[] myBuffer;//??? 

void main() { 
    gl_FragColor = vec4(myBuffer[0],myBuffer[1],0,1); 
} 

Normalde, bu

gl.vertexAttribPointer(myBuffer, 2, gl.UNSIGNED_BYTE, false, 4, 0);

olurdu ama herhangi gölgelendirici pikselden tüm dizi erişmek mümkün gerekir, bu yüzden bir köşe özellik değil .

+2

Dizinizi bir dokuya yüklemeyi denediniz mi? Sampler2D nesnesinin kullanılması Umarım tüm diziye erişebilirsiniz .. – Raki

+0

Bunu yapmanın yolu bu mu? Sampler2D'nin rastgele özel ikili veriler için resimler ve arabellek olduğunu sanmıştım. – RainingChain

+0

Bir diziden bir Sampler2D nesnesini nasıl oluşturabilirsiniz? – RainingChain

cevap

4

Gölgelendiricideki birçok veriye rasgele erişim istiyorsanız, bir doku kullanın.

10000 değeriniz varsa, 100x100 pikseli bir doku oluşturabilirsiniz. Eğer daha sonra doku filtreleme gl.NEAREST ayarlı olduğundan emin olun

uniform sampler2D u_texture; 

vec2 textureSize = vec2(100.0, 100.0); 

vec4 getValueFromTexture(float index) { 
    float column = mod(index, textureSize.x); 
    float row = floor(index/textureSize.x); 
    vec2 uv = vec2(
     (column + 0.5)/textureSize.x, 
     (row + 0.5)/textureSize.y); 
    return texture2D(u_texture, uv); 
} 

gibi bir şeyle doku gelen her değeri elde edebilirsiniz.

Tabii ki textureSize'u tekdüze yaparsanız, tekstürün boyutundan geçebilirsiniz. + 0.5 bölüm see this answer

Normal gl.RGBA, gl.UNSIGNED_BYTE dokuları kullanabilirsiniz ve ekleme/değerlerin geniş bir ürün yelpazesi elde etmek için birlikte kanallar çarpabilirsiniz neden gelince

. Ya da bununla karıştırmak istemiyorsanız kayan nokta dokuları kullanabilirsiniz. You need to enable floating point textures.

İlgili konular