nimsl

Shaders in Nim.

Pure Nim score 15/100 · tests present · no docs generated

Summary

Latest Version Unknown
License MIT
CI Status Failing
Downloads 0
Last Indexed 2026-07-21 05:24

Installation

nimble install nimsl
choosenim install nimsl
git clone https://github.com/yglukhov/nimsl

OS Compatibility

Platform Linux macOS Windows FreeBSD OpenBSD NetBSD Android iOS WASM Embedded
nimsl - - - - - - -

Source

Repository https://github.com/yglukhov/nimsl
Homepage https://github.com/yglukhov/nimsl
Registry Source nimble_official

README

nimsl CI nimble

Shaders in Nim language.

Ever wanted to use metaprogramming and unittests for your shader functions? Now you have it! Of course you also have other nice Nim features, such as type inference, template, generics, etc. Since shader code is valid Nim code, you can compile it to native/js target and debug it with your regular debugging tools.

import nimsl/nimsl

proc myVertexShader(uModelViewProjectionMatrix: Mat4, aPos: Vec2, vPos: var Vec2): Vec4 =
  vPos = aPos
  result = uModelViewProjectionMatrix * vec4(aPos, 0, 1)

proc myFragmentShader(vPos: Vec2): Vec4 =
  if vPos.x < 50:
    result = vec4(1, 0, 0, 1) # red
  else:
    result = vec4(0, 1, 0, 1) # green

const shaderCodeInGLSL = getGLSLVertexShader(myVertexShader)
echo shaderCodeInGLSL

Outputs:

uniform mat4 uModelViewProjectionMatrix;
attribute vec2 aPos;
varying vec2 vPos;
void main(){gl_Position=vec4(0.0);vPos=aPos;gl_Position=(uModelViewProjectionMatrix*vec4(aPos,0.0,1.0));}

Running shader on the CPU:

import nimsl/emulation

const screenWidth = 500
const screenHeight = 500
const colorComponents = 4

var pseudoScreenBuffer = newSeq[uint8](screenWidth * screenHeight * colorComponents)
let vertices = [vec2(0, 0), vec2(screenWidth, 0),
  vec2(screenWidth, screenHeight), vec2(0, screenHeight)]

var mvp = newIdentityMat4()

cpuTest(myVertexShader, myFragmentShader,
    {
        uModelViewProjectionMatrix : mvp, # Uniforms
        aPos: [vertices[0], vertices[1], vertices[2]] }, # Attributes
    pseudoScreenBuffer, screenWidth)
# Color data (RGBA) is written to pseudoScreenBuffer