refactor: WebGL2 工具函数

This commit is contained in:
unanmed 2025-11-04 13:22:21 +08:00
parent 91c7ee455c
commit d749c886e4
4 changed files with 56 additions and 29 deletions

View File

@ -1,18 +1,45 @@
import { logger } from '@motajs/common';
export function compileGLWith(
/**
*
* @param gl WebGL2
* @param type
* @param source
*/
export function compileShader(
gl: WebGL2RenderingContext,
vert: string,
frag: string
): WebGLProgram | null {
const vsShader = compileShader(gl, gl.VERTEX_SHADER, vert);
const fsShader = compileShader(gl, gl.FRAGMENT_SHADER, frag);
type: number,
source: string
): WebGLShader | null {
const shader = gl.createShader(type);
if (!shader) return null;
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!vsShader || !fsShader) return null;
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const info = gl.getShaderInfoLog(shader);
const typeStr = type === gl.VERTEX_SHADER ? 'vertex' : 'fragment';
logger.error(10, typeStr, info ?? '');
return null;
}
return shader;
}
/**
*
* @param gl WebGL2
* @param vs
* @param fs
*/
export function compileProgram(
gl: WebGL2RenderingContext,
vs: WebGLShader,
fs: WebGLShader
) {
const program = gl.createProgram();
gl.attachShader(program, vsShader);
gl.attachShader(program, fsShader);
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
@ -24,23 +51,21 @@ export function compileGLWith(
return program;
}
function compileShader(
/**
* 使
* @param gl WebGL2
* @param vs
* @param fs
*/
export function compileProgramWith(
gl: WebGL2RenderingContext,
type: number,
source: string
): WebGLShader | null {
const shader = gl.createShader(type);
if (!shader) return null;
gl.shaderSource(shader, source);
gl.compileShader(shader);
vs: string,
fs: string
): WebGLProgram | null {
const vsShader = compileShader(gl, gl.VERTEX_SHADER, vs);
const fsShader = compileShader(gl, gl.FRAGMENT_SHADER, fs);
// 如果编译失败
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const info = gl.getShaderInfoLog(shader);
const typeStr = type === gl.VERTEX_SHADER ? 'vertex' : 'fragment';
logger.error(10, typeStr, info ?? '');
return null;
}
if (!vsShader || !fsShader) return null;
return shader;
return compileProgram(gl, vsShader, fsShader);
}

View File

@ -1,3 +1,6 @@
{
"name": "@motajs/render-assets"
"name": "@motajs/render-assets",
"dependencies": {
"@motajs/client-base": "workspace:*"
}
}

View File

@ -14,9 +14,9 @@ import {
} from './types';
import vert from './shader/pack.vert?raw';
import frag from './shader/pack.frag?raw';
import { compileGLWith } from './utils';
import { logger } from '@motajs/common';
import { isNil } from 'lodash-es';
import { compileProgramWith } from 'packages/client-base/src/glUtils';
interface IndexMarkedComposedData {
/** 组合数据 */
@ -229,7 +229,7 @@ export class TextureMaxRectsWebGL2Composer
this.canvas.width = maxWidth;
this.canvas.height = maxHeight;
this.gl = this.canvas.getContext('webgl2')!;
const program = compileGLWith(this.gl, vert, frag)!;
const program = compileProgramWith(this.gl, vert, frag)!;
this.program = program;
// 初始化画布数据

View File

@ -5,4 +5,3 @@ export * from './store';
export * from './streamComposer';
export * from './texture';
export * from './types';
export * from './utils';