p5
Version:
[](https://www.npmjs.com/package/p5)
85 lines (67 loc) • 2.04 kB
JavaScript
const filterUniforms = `
// Group 0: Filter Properties
struct FilterUniforms {
canvasSize: vec2<f32>,
texelSize: vec2<f32>,
}
// Group 1: Model Transform
struct ModelUniforms {
uModelViewMatrix: mat4x4<f32>,
}
// Group 2: Camera and Projection
struct CameraUniforms {
uProjectionMatrix: mat4x4<f32>,
}
var<uniform> filterParams: FilterUniforms;
var tex0: texture_2d<f32>;
var tex0_sampler: sampler;
var<uniform> model: ModelUniforms;
var<uniform> camera: CameraUniforms;
`;
const baseFilterVertexShader = filterUniforms + `
struct VertexInput {
aPosition: vec3<f32>,
aTexCoord: vec2<f32>,
}
struct VertexOutput {
position: vec4<f32>,
vTexCoord: vec2<f32>,
}
fn main(input: VertexInput) -> VertexOutput {
var output: VertexOutput;
// transferring texcoords for the frag shader
output.vTexCoord = input.aTexCoord;
// copy position with a fourth coordinate for projection (1.0 is normal)
let positionVec4 = vec4<f32>(input.aPosition, 1.0);
// project to 3D space
output.position = camera.uProjectionMatrix * model.uModelViewMatrix * positionVec4;
return output;
}
`;
const baseFilterFragmentShader = filterUniforms + `
struct FilterInputs {
texCoord: vec2<f32>,
canvasSize: vec2<f32>,
texelSize: vec2<f32>,
}
struct FragmentInput {
vTexCoord: vec2<f32>,
}
struct FragmentOutput {
color: vec4<f32>,
}
fn main(input: FragmentInput) -> FragmentOutput {
var output: FragmentOutput;
var inputs: FilterInputs;
inputs.texCoord = input.vTexCoord;
inputs.canvasSize = filterParams.canvasSize;
inputs.texelSize = filterParams.texelSize;
var outColor = HOOK_getColor(inputs, tex0, tex0_sampler);
outColor = vec4<f32>(outColor.rgb * outColor.a, outColor.a);
output.color = outColor;
return output;
}
`;
export { baseFilterFragmentShader, baseFilterVertexShader };