作为背景资料,GLSL看起来很像C语言,但编译方式有点不同。一些东西会被展开,条件语句可能会并行执行并在最后进行切换等。这取决于硬件...。
可以使用循环索引或常量索引数组。您循环中的赋值是可以的,但tileID的访问不是。
WebGL着色器语言来源于GLES,并有文档可供参考。
http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf
附录第5节讨论了此事。
Indexing of Arrays, Vectors and Matrices
Definition:
constant-index-expressions are a superset of constant-expressions. Constant-index-expressions can include loop indices as defined in Appendix A section 4.
The following are constant-index-expressions:
• Constant expressions
• Loop indices as defined in section 4
• Expressions composed of both of the above
When used as an index, a constant-index-expression must have integral type.
希望这有所帮助!
哦,至于修复它,在上面的确切示例中...看起来你可以从tileID计算而不是预先计算和索引。
或者,预先计算任何你喜欢的数组,并将其作为纹理传递进去。当然,纹理可以按照你喜欢的方式进行索引。
这是我使用的一个javascript辅助方法,将浮点数传递到着色器中:
function glSetupStuff() { ...
...
if(!gl.getExtension("OES_texture_float"))
alert("cant pass in floats, use 8-bit values instead.");
... }
function textureFromFloats(gl,width,height,float32Array)
{
var oldActive = gl.getParameter(gl.ACTIVE_TEXTURE);
gl.activeTexture(gl.TEXTURE15);
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,
width, height, 0,
gl.RGBA, gl.FLOAT, float32Array);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.bindTexture(gl.TEXTURE_2D, null);
gl.activeTexture(oldActive);
return texture;
}
注意使用gl.NEAREST,这样就不会使您的值“模糊”!然后,您可以在gl.drawXxx调用之前设置它,例如:
注意使用gl.NEAREST,这样就不会使您的值“模糊”!然后,您可以在gl.drawXxx调用之前设置它,例如
textureUnit = 3;
gl.activeTexture(gl.TEXTURE0 + textureUnit);
gl.bindTexture(gl.TEXTURE_2D, texture);
var z = gl.getUniformLocation(prog, "uSampler");
gl.uniform1i(z, textureUnit);
在着色器中(我相信是片元着色器或顶点着色器;一些早期的WebGL版本不支持顶点纹理...)
uniform sampler2D uSampler
...
vec4 value = texture2D(uSampler, vec2(xValueBetween0And1,yValueBetween0And1))
因此,您必须适当地为数组作为纹理的尺寸进行索引,范围为0到1之间。尝试从每个值/像素的中间进行采样。例如,如果数组宽度为2个值,则通过索引0.25和0.75。
这就是要点!