summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/webgl.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/utility/webgl.ts')
-rw-r--r--packages/frontend/src/utility/webgl.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/webgl.ts b/packages/frontend/src/utility/webgl.ts
new file mode 100644
index 0000000000..ae595b605c
--- /dev/null
+++ b/packages/frontend/src/utility/webgl.ts
@@ -0,0 +1,40 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function loadShader(gl: WebGL2RenderingContext, type: GLenum, source: string): WebGLShader {
+ const shader = gl.createShader(type);
+ if (shader == null) {
+ throw new Error('falied to create shader');
+ }
+
+ gl.shaderSource(shader, source);
+ gl.compileShader(shader);
+
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
+ console.error(`falied to compile shader: ${gl.getShaderInfoLog(shader)}`);
+ gl.deleteShader(shader);
+ throw new Error(`falied to compile shader: ${gl.getShaderInfoLog(shader)}`);
+ }
+
+ return shader;
+}
+
+export function initShaderProgram(gl: WebGL2RenderingContext, vsSource: string, fsSource: string): WebGLProgram {
+ const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);
+ const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
+
+ const shaderProgram = gl.createProgram();
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ console.error(`failed to init shader: ${gl.getProgramInfoLog(shaderProgram)}`);
+ throw new Error('failed to init shader');
+ }
+
+ return shaderProgram;
+}