https://github.com/yglukhov/nimsl
Shaders in Nim language
https://github.com/yglukhov/nimsl
Last synced: 7 months ago
JSON representation
Shaders in Nim language
- Host: GitHub
- URL: https://github.com/yglukhov/nimsl
- Owner: yglukhov
- License: mit
- Created: 2015-11-19T14:18:13.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2022-10-04T13:14:47.000Z (about 3 years ago)
- Last Synced: 2024-10-14T15:04:47.149Z (12 months ago)
- Language: Nim
- Size: 42 KB
- Stars: 100
- Watchers: 9
- Forks: 8
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# nimsl [](https://github.com/yglukhov/nimsl/actions?query=branch%3Amaster) [](https://github.com/yglukhov/nimble-tag)
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.
```nim
import nimsl/nimslproc myVertexShader(uModelViewProjectionMatrix: Mat4, aPos: Vec2, vPos: var Vec2): Vec4 =
vPos = aPos
result = uModelViewProjectionMatrix * newVec4(aPos, 0, 1)proc myFragmentShader(vPos: Vec2): Vec4 =
if vPos.x < 50:
result = newVec4(1, 0, 0, 1) # red
else:
result = newVec4(0, 1, 0, 1) # greenconst shaderCodeInGLSL = getGLSLVertexShader(myVertexShader)
echo shaderCodeInGLSL
```
Outputs:
```glsl
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:
```nim
import nimsl/emulationconst screenWidth = 500
const screenHeight = 500
const colorComponents = 4var pseudoScreenBuffer = newSeq[uint8](screenWidth * screenHeight * colorComponents)
let vertices = [newVec2(0, 0), newVec2(screenWidth, 0),
newVec2(screenWidth, screenHeight), newVec2(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
```