* Init and link program with shader.
(vertexSource: string, fragmentSource: string)
| 238 | * Init and link program with shader. |
| 239 | */ |
| 240 | private _createProgram(vertexSource: string, fragmentSource: string): WebGLProgram | null { |
| 241 | const gl = this._gl; |
| 242 | |
| 243 | // Create and compile shader |
| 244 | const vertexShader = this._createShader(gl.VERTEX_SHADER, vertexSource); |
| 245 | if (!vertexShader) { |
| 246 | return null; |
| 247 | } |
| 248 | |
| 249 | const fragmentShader = this._createShader(gl.FRAGMENT_SHADER, fragmentSource); |
| 250 | if (!fragmentShader) { |
| 251 | return null; |
| 252 | } |
| 253 | |
| 254 | // Create program and link shader |
| 255 | const program = gl.createProgram(); |
| 256 | if (!program) { |
| 257 | return null; |
| 258 | } |
| 259 | |
| 260 | gl.attachShader(program, vertexShader); |
| 261 | gl.attachShader(program, fragmentShader); |
| 262 | gl.linkProgram(program); |
| 263 | gl.validateProgram(program); |
| 264 | |
| 265 | gl.deleteShader(vertexShader); |
| 266 | gl.deleteShader(fragmentShader); |
| 267 | |
| 268 | if (Logger.isEnabled && !gl.getProgramParameter(program, gl.LINK_STATUS) && !gl.isContextLost()) { |
| 269 | Logger.error( |
| 270 | `Could not link WebGL program\n\n` + |
| 271 | `Shader error: ${gl.getError()}\n\n` + |
| 272 | `Validate status: ${gl.getProgramParameter(program, gl.VALIDATE_STATUS)}\n\n` + |
| 273 | `Program information log: ${gl.getProgramInfoLog(program)}` |
| 274 | ); |
| 275 | gl.deleteProgram(program); |
| 276 | return null; |
| 277 | } |
| 278 | |
| 279 | return program; |
| 280 | } |
| 281 | |
| 282 | private _createShader(shaderType: number, shaderSource: string): WebGLShader | null { |
| 283 | const gl = this._gl; |
no test coverage detected