ixshader(ixshade)
ixshader(ixshade)
是OpenGL着色语言在Haskell中的一个浅层嵌入。它旨在尽可能接近实际的glsl着色器代码,同时提供更好的编译时安全性。当前正在中写入着色器代码ixshader(ixshade)
的IxShader(Ix着色器)
monad将捕获变量赋值不匹配、乘法不匹配和其他一些常见错误。它还构建了您的类型级别的着色器,以便在缓冲和统一更新期间在下游使用。最后,它抽象了为opengl和webgl编写的着色器代码。
由于这是一项正在进行的工作,因此还不支持整个语言,虽然您可以轻松使用nxt(新文本)
和符合
将您自己的glsl推入的函数管道,只检查您想要的类型。
生成的源代码非常漂亮,易于阅读,甚至可以在没有资源映射。
您应该为着色器创建一个单独的文件,如下所示ixshader(ixshade)
依赖于这个可重新绑定语法
语言扩展和重新定义关键功能,如>>=
,>>
,返回
,失败
,空隙
,from整数
和来自Rational
.
例子
{-#LANGUAGE允许模糊类型#-}{-#LANGUAGE数据种类#-}{-#LANGUAGE灵活上下文#-}{-#LANGUAGE灵活实例#-}{-#语言GADTs#-}{-#LANGUAGE Lambda案例#-}{-#LANGUAGE多参数类型类#-}{-#LANGUAGE PolyKinds#-}{-#LANGUAGE排名类型#-}{-#LANGUAGE可重新绑定语法#-}{-#LANGUAGE范围类型变量#-}{-#语言类型系列#-}{-#LANGUAGE TypeInType#-}{-#LANGUAGE类型运算符#-}{-#LANGUAGE无法确定实例#-}模块MyShaders,其中导入图形。IxShader(Ix着色器)我的顶点::for all(ctx::GLContext)。HasContext文本文本=>IxShader ctx‘[]’[In Xvec2“位置”,Xvec4“彩色”,统一Xmat4“投影”,统一Xmat4“模型视图”,输出Xvec4“fcolor”,输出Xvec4“gl_Position”,主要] ()myvertex=do位置<-in_颜色<-in_项目<-统一_modl<-统一_f颜色<-out_glPos<-gl_位置main_$dofcolor.=颜色颜色全局位置=项目*模型*(位置:0.0.:1.0)我的碎片::for all(ctx::GLContext)。IsGLContext ctx=>IxShader ctx'[]'[In Xvec4“fcolor”,输出Xvec4(GLFragName ctx),主要] ()myfragment=做f颜色<-in_glFrag<-gl_FragColormain_$glFrag.=f颜色main=做putStrLn“第一个OpenGL:”putSrcLn$vertex@'OpenGLContextputStrLn“\nThen WebGL:”putSrcLn$vertex@'WebGLContext{-第一个OpenGL:vec2位;vec4颜色;均匀mat4投影;统一mat4模型视图;输出vec4-fcolor;空心总管(){fcolor=颜色;gl_Position=投影*模型视图*vec4(Position.x,Position.y,0.0,1.0);}然后是WebGL:属性vec2位置;属性vec4颜色;均匀mat4投影;统一mat4模型视图;可变vec4-f颜色;空干管(){fcolor=颜色;gl_Position=投影*模型视图*vec4(Position.x,Position.y,0.0,1.0);}-}