webgl踩坑记录 WebGL: INVALID_OPERATION: useProgram: program not valid

584 阅读38分钟

下面是js源代码和着色器代码

  const ctx = document.getElementById('canvas')  const gl = ctx.getContext('webgl')  //顶点着色器  const VERTEX_SHADER_SOURCE = `    void main(){      //要绘制的坐标 x,y,z,w(齐次座标,x/w,y/w,z/w)      gl_Position = vec4(0.0,0.0,0.0,1.0);      //点的大小      gl_PointSize = 30.0;    }  `  //片元着色器  const FRAGMENT_SHADER_SOURCE = `    void main(){      gl_FragColor = vec4(1.0,0.0,0.0,1.0);    }  `  //创建着色器  const vertexShader = gl.createShader(gl.VERTEX_SHADER)  const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)  //指定顶点着色器源码  gl.shaderSource(vertexShader,VERTEX_SHADER_SOURCE)   //指定片元着色器源码  gl.shaderSource(fragmentShader,FRAGMENT_SHADER_SOURCE)   //编译着色器  gl.compileShader(vertexShader)  gl.compileShader(fragmentShader)  //创建程序对象  const program = gl.createProgram()  gl.attachShader(program, vertexShader)  gl.attachShader(program, fragmentShader)  gl.linkProgram(program)  gl.useProgram(program)  //执行绘制  gl.drawArrays(gl.POINTS,0,1)

运行后控制台警告报错:WebGL: INVALID_OPERATION: useProgram: program not valid

经过排查后发现 void main() 函数中一定要有分号,采用严格模式写法。

改完后完整代码:

  const ctx = document.getElementById('canvas')  const gl = ctx.getContext('webgl')  //顶点着色器  const VERTEX_SHADER_SOURCE = `    void main(){      //要绘制的坐标 x,y,z,w(齐次座标,x/w,y/w,z/w)      gl_Position = vec4(0.0,0.0,0.0,1.0);      //点的大小      gl_PointSize = 30.0;    }  `  //片元着色器  const FRAGMENT_SHADER_SOURCE = `    void main(){      gl_FragColor = vec4(1.0,0.0,0.0,1.0);    }  `  //创建着色器  const vertexShader = gl.createShader(gl.VERTEX_SHADER)  const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)  //指定顶点着色器源码  gl.shaderSource(vertexShader,VERTEX_SHADER_SOURCE)   //指定片元着色器源码  gl.shaderSource(fragmentShader,FRAGMENT_SHADER_SOURCE)   //编译着色器  gl.compileShader(vertexShader)  gl.compileShader(fragmentShader)  //创建程序对象  const program = gl.createProgram()  gl.attachShader(program, vertexShader)  gl.attachShader(program, fragmentShader)  gl.linkProgram(program)  gl.useProgram(program)  //执行绘制  gl.drawArrays(gl.POINTS,0,1)