@luma.gl/shadertools
Version:
Shader module system for luma.gl
100 lines (80 loc) • 2.83 kB
text/typescript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import {ShaderModule} from '../../lib/shader-module/shader-module';
export type FloatColorsProps = {
/**
* When true, semantic colors are interpreted as 0-255 byte-style values and normalized in shader code.
* When false, semantic colors are interpreted directly as floats.
*/
useByteColors?: boolean;
};
export type FloatColorsUniforms = {
/** Controls whether shader helpers normalize semantic colors from byte space. */
useByteColors: boolean;
};
const GLSL_UNIFORMS = /* glsl */ `\
layout(std140) uniform floatColorsUniforms {
float useByteColors;
} floatColors;
vec3 floatColors_normalize(vec3 inputColor) {
return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
}
vec4 floatColors_normalize(vec4 inputColor) {
return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
}
vec4 floatColors_premultiplyAlpha(vec4 inputColor) {
return vec4(inputColor.rgb * inputColor.a, inputColor.a);
}
vec4 floatColors_unpremultiplyAlpha(vec4 inputColor) {
return inputColor.a > 0.0 ? vec4(inputColor.rgb / inputColor.a, inputColor.a) : vec4(0.0);
}
vec4 floatColors_premultiply_alpha(vec4 inputColor) {
return floatColors_premultiplyAlpha(inputColor);
}
vec4 floatColors_unpremultiply_alpha(vec4 inputColor) {
return floatColors_unpremultiplyAlpha(inputColor);
}
`;
const WGSL_UNIFORMS = /* wgsl */ `\
struct floatColorsUniforms {
useByteColors: f32
};
@group(0) @binding(auto) var<uniform> floatColors : floatColorsUniforms;
fn floatColors_normalize(inputColor: vec3<f32>) -> vec3<f32> {
return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);
}
fn floatColors_normalize4(inputColor: vec4<f32>) -> vec4<f32> {
return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);
}
fn floatColors_premultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
return vec4<f32>(inputColor.rgb * inputColor.a, inputColor.a);
}
fn floatColors_unpremultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
return select(
vec4<f32>(0.0),
vec4<f32>(inputColor.rgb / inputColor.a, inputColor.a),
inputColor.a > 0.0
);
}
fn floatColors_premultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
return floatColors_premultiplyAlpha(inputColor);
}
fn floatColors_unpremultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
return floatColors_unpremultiplyAlpha(inputColor);
}
`;
export const floatColors = {
name: 'floatColors',
props: {} as FloatColorsProps,
uniforms: {} as FloatColorsUniforms,
vs: GLSL_UNIFORMS,
fs: GLSL_UNIFORMS,
source: WGSL_UNIFORMS,
uniformTypes: {
useByteColors: 'f32'
},
defaultUniforms: {
useByteColors: true
}
} as const satisfies ShaderModule<FloatColorsProps, FloatColorsUniforms>;