getAttribLocation始终返回相同的索引

时间:2016-07-30 12:55:12

标签: webgl

  attribute vec2 test; 
  attribute vec2 position;

  void main() {
    vTexCoord = position ; 
    vec2 gg = test;
    .....
  }

getAttribLocation的用途是什么? 我以前认为它是代码中属性的索引, 但不是,它总是返回0表示位置,1表示测试

1 个答案:

答案 0 :(得分:0)

getAttribLocation获取属性的位置。仅仅因为你的GPU /驱动程序返回0 position1返回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"));