我正在Haskell中创建一个渲染引擎,并且正在处理基于简单case语句和Maybe数据类型的着色器的使用方式。
目前我有4种不同类型的着色器:
简单着色器,
Light Shader(Phong),
纹理着色器,
Light + Texture Shader
目前,我为每个人都有单独的着色器文件,但我想介绍其他着色模型。至少有3种不同的着色模型,我甚至没有做过颜色。
所以总共有4个(Flat,Gourad,Phong,没有照明)* 2(纹理开/关)* 2(颜色开/关)= 16种可能性我不想要有单独的着色器每个人的文件。它似乎不是一个好的模型。
所以我想用DSL构建它。这个看起来很不错:https://github.com/fiendfan1/Haskell-GLSL-eDSL
有没有人对我如何做到这一点有任何提示?我希望能够轻松添加更多可能性,因为每次添加内容时我都必须至少加倍。它变得异常繁琐。
所以我现在就是这样做的:
p <- case (sProgram state) of
(Just sp) -> return sp
Nothing -> case (lighting state) of
(Just _) -> case (texture state) of
(Just _) -> ltShader state
Nothing -> lShader state
Nothing -> case (texture state) of
(Just _) -> tShader state
Nothing -> sShader state
每个着色器函数都设置统一/属性变量和填充。提前谢谢你的帮助!