attribute vec2 test;
attribute vec2 position;
void main() {
vTexCoord = position ;
vec2 gg = test;
.....
}
getAttribLocation的用途是什么? 我以前认为它是代码中属性的索引, 但不是,它总是返回0表示位置,1表示测试
答案 0 :(得分:0)
getAttribLocation
获取属性的位置。仅仅因为你的GPU /驱动程序返回0
position
而1
返回test
并不意味着所有驱动程序都会。{/ p>
此外,在调试时,通常会注释掉着色器的某些部分。如果未使用属性,则驱动程序可以将其优化。在您的情况下,如果您要使用position
注释掉任何行,则test
可能会获得位置0
。如果您没有查找该位置,并且您认为test
始终位于位置1,则代码将失败
另一方面,您可以在致电linkProgram
致电bindAttribLocation
之前设置位置。例如
gl.bindAttribLocation(program, 10, "position");
gl.bindAttribLocation(program, 5, "test");
gl.linkProgram(program);
在这种情况下,您不必查找位置。
var vs = `
attribute float position;
attribute float test;
void main() {
gl_Position = vec4(position, test, 0, 1);
}
`;
var fs = `
void main() {
gl_FragColor = vec4(0, 1, 0, 1);
}
`;
function createShader(gl, type, source) {
var s = gl.createShader(type);
gl.shaderSource(s, source);
gl.compileShader(s);
if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {
console.log(gl.getShaderInfoLog(s));
}
return s;
}
var gl = document.createElement("canvas").getContext("webgl");
var prg = gl.createProgram();
gl.attachShader(prg, createShader(gl, gl.VERTEX_SHADER, vs));
gl.attachShader(prg, createShader(gl, gl.FRAGMENT_SHADER, fs));
gl.bindAttribLocation(prg, 5, "position");
gl.bindAttribLocation(prg, 10, "test");
gl.linkProgram(prg);
if (!gl.getProgramParameter(prg, gl.LINK_STATUS)) {
console.log(gl.getProgramInfoLog(prg));
}
console.log("test location:", gl.getAttribLocation(prg, "test"));
console.log("position location:", gl.getAttribLocation(prg, "position"));