Javascript webgl:变量未传递到着色器,这会导致魔术效果?

Javascript webgl:变量未传递到着色器,这会导致魔术效果?,javascript,webgl,Javascript,Webgl,表示三角形的顶点数组永远不会通过GetAttributeLocation/VertexAttribute指针传递给顶点着色器。但是,屏幕上仍会绘制一个三角形。三角形是怎么画的。在着色器中,我指定vec2 pos,但从未使用GetAttriblLocation。vec2位置是否为GLSL中的保留值 函数createShader(str,类型){ var shader=gl.createShader(类型); gl.shaderSource(着色器,str); gl.compileShader(着

表示三角形的顶点数组永远不会通过GetAttributeLocation/VertexAttribute指针传递给顶点着色器。但是,屏幕上仍会绘制一个三角形。三角形是怎么画的。在着色器中,我指定vec2 pos,但从未使用GetAttriblLocation。vec2位置是否为GLSL中的保留值

函数createShader(str,类型){
var shader=gl.createShader(类型);
gl.shaderSource(着色器,str);
gl.compileShader(着色器);
返回着色器;
}
函数createProgram(vstr、fstr){
var program=gl.createProgram();
var vshader=createShader(vstr,gl.VERTEX_着色器);
var fshader=createShader(fstr,gl.FRAGMENT_SHADER);
gl.attachShader(程序,vshader);
gl.attachShader(程序,fshader);
总账链接程序(程序);
返回程序;
}
var c=document.getElementById('c');
var gl=c.getContext('experimental-webgl');
var vertexpbuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY\u BUFFER,vertexspuffer);
变量顶点=[-0.5,-0.5,0.5,-0.5,0,0.5];
gl.bufferData(gl.ARRAY\u BUFFER、新Float32Array(顶点)、gl.STATIC\u DRAW);
var vs='属性vec2 asdf;'+
'属性vec2 pos;'+
'void main(){gl_Position=vec4(pos,0,1);}';
变量fs='精度中间泵浮动;'+
'void main(){gl_FragColor=vec4(0,0.8,0,1);}';
var程序=创建程序(vs,fs);
gl.useProgram(程序);
//
函数设置动画(){
gl.EnableVertexAttributeArray(0);
gl.VertexAttribute指针(0,2,gl.FLOAT,false,0,0);
总图数组(总图三角形,0,3);
window.requestAnimationFrame(动画);
}
制作动画()
canvas{边框:1px纯黑;}

总账将为每个属性分配位置,无论您是否查询它们。但是,您只有一个活动属性,因为
asdf
没有任何效果,将被优化掉。因此,
pos
很可能(但不能保证)最终成为属性
0

即使使用了
asdf
,也有可能最终成为
0
,因为属性名称和位置之间的映射完全是特定于实现的


建议当然是:不要这样做。您可以通过
glbindAttriblLocation
(链接程序之前)自行分配位置,或者查询GL分配的位置,否则行为将随每个实现而变化。

在ES 2.0规范@SteveWebster:ES Spec 2.0.25,第2.10.4节“着色器变量”,第2.10.4节“顶点属性”小节中,该规范在何处说明此情况,第32-34页。规范没有提到GLSL优化或映射如何“特定于实现”。@SteveWebster:规范明确地讨论了活动属性和GL分配的位置,如果用户没有明确分配的话。