WebGL:从着色器访问缓冲区

WebGL:从着色器访问缓冲区,webgl,Webgl,我需要从着色器访问缓冲区。缓冲区是从数组创建的。(在实际场景中,数组有10k+(可变)个数。) 我如何发送它,以便着色器可以使用它 precision mediump float; uniform uint[] myBuffer;//??? void main() { gl_FragColor = vec4(myBuffer[0],myBuffer[1],0,1); } 通常,如果它是一个属性,那么 gl.VertexAttribute指针(myBuffer,2,gl.UNSIGNE

我需要从着色器访问缓冲区。缓冲区是从数组创建的。(在实际场景中,数组有10k+(可变)个数。)

我如何发送它,以便着色器可以使用它

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

void main() {
    gl_FragColor = vec4(myBuffer[0],myBuffer[1],0,1);
}
通常,如果它是一个属性,那么

gl.VertexAttribute指针(myBuffer,2,gl.UNSIGNED_字节,false,4,0)


但是我需要能够从任何着色器像素访问整个阵列,因此它不是顶点属性。

如果您想要随机访问着色器中的大量数据,请使用纹理

如果你有10000个值,你可以制作一个100x100像素的纹理。然后,您可以使用以下方法从纹理中获取每个值

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);
}
确保纹理过滤设置为
gl.NEAREST

当然,如果您制作
textureSize
制服,您可以传递纹理的大小

至于为什么
+0.5
部分


您可以使用普通
gl.RGBA
gl.UNSIGNED_BYTE
纹理,并将通道相加/相乘以获得大范围的值。或者,如果您不想弄乱它,可以使用浮点纹理

您是否尝试过将数组加载到纹理?使用Sampler2D对象,我希望您能够访问整个阵列..您应该这样做吗?我以为Sampler2D是用于图像和用于随机自定义二进制数据的缓冲区。如何从数组创建Sampler2D对象?无所谓,明白了:
gl.texImage2D(gl.TEXTURE\u 2D,0,gl.RGBA,width,height,0,gl.RGBA,gl.UNSIGNED\u BYTE,data)我们仅创建纹理对象。将数据传递给glTexImage2D时,传递数据而不是图像数据。在片段着色器中,使用采样器对象访问内容。
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);
}