Skip to content

Daniel Holden's functions designed to avoid conditionals in GLSL, available both as ES modules strings and as GLSL files for use with glslify.

License

Notifications You must be signed in to change notification settings

dmnsgn/glsl-conditionals

Repository files navigation

glsl-conditionals

npm version stability-frozen npm minzipped size dependencies types Conventional Commits styled with prettier linted with eslint license

Daniel Holden's functions designed to avoid conditionals in GLSL, available both as ES modules strings and as GLSL files for use with glslify.

Disclaimer: you might not need this as it is highly hardware dependant and branching might not equate more operations in modern GPUs. Also it can make your shader harder to visually parse.

paypal coinbase twitter

Installation

npm install glsl-conditionals

Usage

ESM

import * as glslConditionals from "glsl-conditionals";

const shader = /* glsl */ `
// Comparisons
${glslConditionals.WHEN_EQ}
${glslConditionals.WHEN_NEQ}

${glslConditionals.WHEN_GT}
${glslConditionals.WHEN_LT}

${glslConditionals.WHEN_GE}
${glslConditionals.WHEN_LE}

// Logical operators
${glslConditionals.WHEN_AND}
${glslConditionals.WHEN_OR}
${glslConditionals.WHEN_XOR}
${glslConditionals.WHEN_NOT}

void main() {
  float x = 10.0;
  float y = 0.0;

  y += 5.0 * when_eq(x, 0.0);
  y += 5.0 * when_eq(x, 0.0);
  y += 5.0 * when_neq(x, 0.0);
  y += 5.0 * when_gt(x, 0.0);
  y += 5.0 * when_lt(x, 0.0);
  y += 5.0 * when_ge(x, 0.0);
  y += 5.0 * when_le(x, 0.0);
  y += 5.0 * when_and(x, 0.0);
  y += 5.0 * when_or(x, 0.0);
  y += 5.0 * when_xor(x, 0.0);
  y += 5.0 * when_not(x, 0.0);

  // ...
}
`;

glslify

// Comparisons
#pragma glslify: when_eq = require(glsl-conditionals/when_eq)
#pragma glslify: when_neq = require(glsl-conditionals/when_neq)

#pragma glslify: when_gt = require(glsl-conditionals/when_gt)
#pragma glslify: when_lt = require(glsl-conditionals/when_lt)

#pragma glslify: when_ge = require(glsl-conditionals/when_ge)
#pragma glslify: when_le = require(glsl-conditionals/when_le)

// Logical operators
#pragma glslify: when_and = require(glsl-conditionals/when_and)
#pragma glslify: when_or = require(glsl-conditionals/when_or)
#pragma glslify: when_xor = require(glsl-conditionals/when_xor)
#pragma glslify: when_not = require(glsl-conditionals/when_not)

void main() {
  float x = 10.0;
  float y = 0.0;

  y += 5.0 * when_eq(x, 0.0);
  y += 5.0 * when_eq(x, 0.0);
  y += 5.0 * when_neq(x, 0.0);
  y += 5.0 * when_gt(x, 0.0);
  y += 5.0 * when_lt(x, 0.0);
  y += 5.0 * when_ge(x, 0.0);
  y += 5.0 * when_le(x, 0.0);
  y += 5.0 * when_and(x, 0.0);
  y += 5.0 * when_or(x, 0.0);
  y += 5.0 * when_xor(x, 0.0);
  y += 5.0 * when_not(x, 0.0);

  // ...
}

License

MIT. See license file.

About

Daniel Holden's functions designed to avoid conditionals in GLSL, available both as ES modules strings and as GLSL files for use with glslify.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published