import { ShaderMaterial, ShaderMaterialParameters, Vector3, Vector2, Data3DTexture, Matrix4 } from "three"; import type { Side, IUniform } from "three"; import type { IVector2, IVector3 } from "type-tls"; import { Axis } from "type-tls"; import { type Texture3D } from "@three3d/tools"; /** * 体积材质填充模式 */ export declare enum VolumeFit { /** * 填充 * @remarks * 材质会充满容器 */ Fill = 0, /** * 对齐 * @remarks * 材质会从容器的最小点开始绘制,但不会充满容器 */ Align = 1, /** * 原始 * @remarks * 材质会从容器空间中的坐标原点开始绘制,也不会充满容器 */ Raw = 2 } /** * 体积材质的 Uniforms 类型 */ export interface VolumeMaterialUniforms { map: IUniform; containerMin: IUniform; containerMax: IUniform; fit: IUniform; opacity: IUniform; alphaRange: IUniform; atomize: IUniform; steps: IUniform; accFactor: IUniform; isDoubleSide: IUniform; } /** * 体积材质的选项 */ export interface VolumeMaterialOptions extends Omit { /** * 三维的纹理 */ map?: Data3M | null; /** * 渲染体积材质的容器的最小点 * @remarks * 容器的最小点和最大点一般是被设置成 geometry 的AABB包围盒;但也可以不是 * 总之,体积材质的渲染依托于 geometry 的形状,它不会超出 geometry 的尺寸; * 但可以控制容器的最小点和最大点来控制体积材质的渲染尺寸; * @defaultValue {x:0,y:0,z:0} */ containerMin?: IVector3 | null; /** * 渲染体积材质的容器的最大点 * @remarks * 容器的最小点和最大点一般是被设置成 geometry 的AABB包围盒;但也可以不是 * 总之,体积材质的渲染依托于 geometry 的形状,它不会超出 geometry 的尺寸; * 但可以控制容器的最小点和最大点来控制体积材质的渲染尺寸; * @defaultValue map尺寸中的最大点 */ containerMax?: IVector3 | null; /** * 体积材质在容器内的填充模式 * @defaultValue VolumeFit.Fill */ fit?: VolumeFit | null; /** * Mesh三角形的渲染面 * @remarks * 可设置为前面、后面、或者两面都渲染 * 如果只渲染前面,进入体积材质内部,体积材质就会消失 * 如果只渲染后面,体积初遮挡,就会消失 * 如果两面都渲染,则会隐藏看到容器的面 */ side?: Side | undefined; /** * 透明度 * @remarks * 决定整体的透明度 * @defaultValue 1 */ opacity?: number | null; /** * 有效透明度的取值范围 * @remarks * 如果最终颜色的透明度小于或等于 alphaRange.x ,则被认为是完全透明 * 如果最终颜色的透明度在于或等于 alphaRange.y ,则被认为是完全不透明 * 取值范围应当在 0 - 1 * @defaultValue {x:0,y:0.95} */ alphaRange?: IVector2 | null; /** * 是否开启雾化的效果 * @remarks * 开启后的渲染效果会更像雾 * @defaultValue true */ atomize?: boolean | null; /** * 体积材质渲染的采样数 * @remarks * 采样数越高,占用的GPU资源就越大;所以该数据设置的适宜最好; * @defaultValue 100 */ steps?: number | null; /** * 颜色累积系数 * @remarks * 它是对体积材质进行积分时使用的系数;只在开启雾化效果{@link VolumeMaterial.atomize}时才有效; * 值越小,最终呈现出的效果就越雾化; * @defaultValue 1 */ accFactor?: number | null; } /** * 体积材质 */ export declare abstract class VolumeMaterial = VolumeMaterialUniforms> extends ShaderMaterial { readonly isVolumeMaterial = true; constructor(options?: VolumeMaterialOptions); /** * uniforms */ uniforms: VolumeUniforms; /** * 三维的纹理 */ get map(): Data3M | null; set map(value: Data3M | null); /** * 渲染体积材质的容器的最小点 * @remarks * 容器的最小点和最大点一般是被设置成 geometry 的AABB包围盒;但也可以不是 * 总之,体积材质的渲染依托于 geometry 的形状,它不会超出 geometry 的尺寸; * 但可以控制容器的最小点和最大点来控制体积材质的渲染尺寸; */ get containerMin(): Vector3; set containerMin(value: Vector3); /** * 渲染体积材质的容器的最大点 * @remarks * 容器的最小点和最大点一般是被设置成 geometry 的AABB包围盒;但也可以不是 * 总之,体积材质的渲染依托于 geometry 的形状,它不会超出 geometry 的尺寸; * 但可以控制容器的最小点和最大点来控制体积材质的渲染尺寸; */ get containerMax(): Vector3; set containerMax(value: Vector3); /** * 渲染体积材质容器的尺寸 * @remarks * 每次调用都会重新计算 */ get containerSize(): Vector3; /** * 体积材质在容器内的填充模式 * @defaultValue VolumeFit.Fill */ get fit(): VolumeFit; set fit(value: VolumeFit); /** * 获取当前填模式下对 map 的应用的平移 * @returns */ getFitTranslate(): Vector3; /** * 获取当前填模式下对 map 的应用的缩放 * @returns */ getFitScale(): Vector3; /** * 获取当前填模式下对 map 的应用的变换矩阵 * @returns */ getFitMatrix(): Matrix4; /** * 获取当前填模式下对 map 的应用的变换矩阵的逆矩阵 * @returns */ getFitMatrixInvert(): Matrix4; /** * Mesh三角形的渲染面 * @remarks * 可设置为前面、后面、或者两面都渲染 * 如果只渲染前面,进入体积材质内部,体积材质就会消失 * 如果只渲染后面,体积初遮挡,就会消失 * 如果两面都渲染,则会隐藏看到容器的面 */ get side(): Side; set side(value: Side); protected _side: Side; /** * 透明度 * @remarks * 决定整体的透明度 */ get opacity(): number; set opacity(value: number); /** * 有效透明度的取值范围 * @remarks * 如果最终颜色的透明度小于或等于 alphaRange.x ,则被认为是完全透明 * 如果最终颜色的透明度在于或等于 alphaRange.y ,则被认为是完全不透明 * 取值范围应当在 0 - 1 * @defaultValue {x:0,y:0.95} */ get alphaRange(): Vector2; set alphaRange(value: Vector2); /** * 是否开启雾化的效果 * @remarks * 开启后的渲染效果会更像雾 * @defaultValue true */ get atomize(): boolean; set atomize(value: boolean); /** * 体积材质渲染的采样数 * @remarks * 采样数越高,占用的GPU资源就越大;所以该数据设置的适宜最好; * @defaultValue 100 */ get steps(): number; set steps(value: number); /** * 颜色累积系数 * @remarks * 它是对体积材质进行积分时使用的系数;只在开启雾化效果{@link VolumeMaterial.atomize}时才有效; * 值越小,最终呈现出的效果就越雾化; * @defaultValue 1 */ get accFactor(): number; set accFactor(value: number); /** * 将材质空间下的坐标转为 map 空间下的坐标 * @param coord - 材质空间下的坐标 * @returns */ toMapPosition(coord: IVector3): Vector3; /** * 将材质空间下的深度转为 map 空间下的深度 * @param axis - map坐标系下的坐标轴 * @param depth - 材质空间下的深度 * @returns */ toMapDepth(axis: Axis, depth: number): number; /** * 获取3D数据的切片 * @remarks * 切片就是指定轴的指定位置的垂直截面 * @param axis - map坐标系下的坐标轴 * @param depth - 材质空间下,在轴方向的坐标值 * @returns */ getData3DSlice(axis: Axis, depth: number): import("image-tls").IData2D | null; /** * 获取3D数据中指定坐标处的数据项目 * @param coord * @returns */ getItem(coord: IVector3): number[] | null; } //# sourceMappingURL=VolumeMaterial.d.ts.map