面试题答案
一键面试思路
- 明确数据类型:确定WebGL着色器输入输出数据类型,如顶点数据、纹理坐标、颜色等,在TypeScript中定义相应类型。
- 类型定义管理:利用类型别名、接口等组织和管理这些类型,方便复用与维护。
- 检查数据传递:在不同着色器间数据传递处,使用类型检查确保数据格式正确,避免运行时错误。
- 结合泛型:对于通用的操作或数据结构,通过泛型提高代码的灵活性和可复用性。
技术点
- 类型别名:
- 定义特定数据类型别名,如
type Vertex = { position: number[]; color: number[]; };
,使代码可读性增强,方便修改。
- 定义特定数据类型别名,如
- 接口继承:
- 若有多个相关的着色器输入输出结构,可通过接口继承来复用和扩展类型。例如,
interface BaseShaderInput { uniformValues: number[]; }
,然后interface GeometryShaderInput extends BaseShaderInput { vertexData: Vertex[]; }
,这样能清晰体现类型间关系。
- 若有多个相关的着色器输入输出结构,可通过接口继承来复用和扩展类型。例如,
- 泛型:
- 当编写通用的WebGL操作函数,如创建缓冲区函数
function createBuffer<T>(data: T[], target: GLenum): WebGLBuffer { /* 具体实现 */ }
,T 可代表不同类型数据,如顶点数据或索引数据,提高函数通用性。
- 当编写通用的WebGL操作函数,如创建缓冲区函数
- 函数类型定义:
- 定义与WebGL交互的函数类型,如
type ShaderCompileFunction = (source: string, type: GLenum) => WebGLShader;
,明确函数输入输出类型,便于类型检查。
- 定义与WebGL交互的函数类型,如
- 联合类型与交叉类型:
- 联合类型用于表示可能的多种类型,如
type AttributeType = 'float' | 'vec2' | 'vec3';
。 - 交叉类型用于合并多个类型,如
type ComplexShaderInput = GeometryShaderInput & TessellationShaderInput;
,表示同时满足两种着色器输入要求的类型。
- 联合类型用于表示可能的多种类型,如