WebGL:从着色器访问缓冲区
我需要从着色器访问缓冲区。缓冲区是从数组创建的。(在实际场景中,数组有10k+(可变)个数。) 我如何发送它,以便着色器可以使用它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
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);
}