Javascript 在WebGL中返回-1的findAttribLocation

Javascript 在WebGL中返回-1的findAttribLocation,javascript,opengl-es,coffeescript,webgl,Javascript,Opengl Es,Coffeescript,Webgl,我知道如果在我的顶点着色器中找不到该属性,可能会发生这种情况,但我确信它确实存在。我将尝试提供我的大型代码体中最相关的代码片段: vertices = new Float32Array(dataArrays.verts) normals = new Float32Array(dataArrays.norms) uvs = new Float32Array(dataArrays.txtcos) 我的frag着色器: precision highp float; attribute v

我知道如果在我的顶点着色器中找不到该属性,可能会发生这种情况,但我确信它确实存在。我将尝试提供我的大型代码体中最相关的代码片段:

  vertices = new Float32Array(dataArrays.verts)
  normals = new Float32Array(dataArrays.norms)
  uvs = new Float32Array(dataArrays.txtcos)
我的frag着色器:

precision highp float;
attribute vec3 aPosition;
attribute vec3 vnorm;
attribute vec2 aTexCoord;
varying vec2 vTexCoord;
uniform mat4 pMatrix;
uniform mat4 vMatrix;
uniform mat4 mMatrix;
void main(void) {
  gl_Position = pMatrix * vMatrix * mMatrix * vec4(aPosition, 1.0);
  vTexCoord = aTexCoord;
}
属性查找器:

findAttribLocations = (gl, program, attributes) ->
    out = {}
    i = 0
    while i < attributes.length
      attrib = attributes[i]
      console.log attrib
      out[attrib] = gl.getAttribLocation(program, attrib)
      console.log out[attrib]
      i++
    out
程序创建者:

createGLProgram = (gl, vSrc, fSrc) ->
    program = gl.createProgram()
    vShader = createGLShader(gl, gl.VERTEX_SHADER, vSrc)
    fShader = createGLShader(gl, gl.FRAGMENT_SHADER, fSrc)
    gl.attachShader program, vShader
    gl.attachShader program, fShader
    gl.linkProgram program
    if !gl.getProgramParameter(program, gl.LINK_STATUS)
      console.log 'warning: program failed to link'
      return null
    console.log "program"
    console.log program
    program

除了着色器中缺少变量之外,是否还有其他可能导致此错误的原因?我正在这个程序的其他地方切换着色器,但我相信这里使用的是正确的着色器。我如何进一步调查

着色器未使用的属性称为非活动属性,并且没有绑定

由于未在顶点着色器中使用
vnorm
,因此当通过
glGetAttriblLocation
查询时,它将处于非活动状态并返回-1。使其处于活动状态的唯一方法是以有助于输出的方式在着色器中使用它


另请参见着色器未使用的属性是调用非活动属性且没有绑定

由于未在顶点着色器中使用
vnorm
,因此当通过
glGetAttriblLocation
查询时,它将处于非活动状态并返回-1。使其处于活动状态的唯一方法是以有助于输出的方式在着色器中使用它

另见

createGLProgram = (gl, vSrc, fSrc) ->
    program = gl.createProgram()
    vShader = createGLShader(gl, gl.VERTEX_SHADER, vSrc)
    fShader = createGLShader(gl, gl.FRAGMENT_SHADER, fSrc)
    gl.attachShader program, vShader
    gl.attachShader program, fShader
    gl.linkProgram program
    if !gl.getProgramParameter(program, gl.LINK_STATUS)
      console.log 'warning: program failed to link'
      return null
    console.log "program"
    console.log program
    program