艰难的shader系统

其实shader系统的设计已经开始好长时间了。因为shade的拖累,整个渲染器除了能清屏以外什么都干不了。我的目标是设计一个完全可动态生成shader代码,却又不至于落入shader代码是预定义死的死板套路中。一开始发现比较简单,其实实现起来却非常难。最近研究mental mill,也没什么心得,还是把最近的一些需求和初步想法写出来,也许会有些收获,以下便是今天晚上的想法,最近没时间出去拍片,白天累的要死,心情也佳。看来思维水平下降不少啊。不知道何时能完成这个shader系统-------不过我相信总能完成的。

第一部分:
shader系统包含的shader组成部分:
一: 完整的SHader代码,这样的Shader代码独立可执行。不需要shader修改器一类的。
二: shader基础代码。这样的shader代码可以增加修改器,安装默认修改器代码后可独立执行。
三: shader修改器代码。类似于一个函数。
四: shader的输入模块。这样的shader模块,表示一个模块接受什么样的输入参数,
这样的系统还将对输入数据进行基本处理。
Vertex Shader通常是一个对应于Input Assembler的系统
Pixel Shader则对应如何抓取纹理数据和接受GS/VS传递下来的数据。
举例说,一个视频处理的ps的输入模块可能是一个转换YUV为RGB,并进行亮度,对比度调节的输入模块。
输入模块和输出模块,修改器系统一起组成一个完整的shader.

shader输入系统除了要对输入参数描述外,还需要对这个系统的输出数据进行定义。这样的结构叫输入描述符
基础shader代码会包含一个输入描述符

五:shader输出模块:
这样的shader模块,表示一个shader处理完后能输出什么样的数据。
VS的输出模块要和gs/ps的输入系统匹配。
ps的输出模块则可以定义输出多少个RenderTarget等。
输出模块的输出参数需要进行描述,以便与对应的输入模块进行匹配。
基础shader代码会包含一个输出描述符

六:shader的控制文件。
用来描述用以上描述的5个部分中的那些数据来组成一个完整可用的shader。


第二部分:
shader修改器系统的组成
(以下各部分均为和具体的shader api有关,比如)

shader基础代码:
shader基础代码如果不使用其修改器。则会调用默认的例程,
这可能用#ifdef来控制。也可能由Shader系统用默认的插入代码。
shader的修改器描述符:
定义shader修改器的类型,参数等,还可能定义出默认的插入代码
shader的修改器代码:
多个修改器代码组成一个完整的修改器。
一个修改器代码加入到shader修改器之前需要匹配参数。
shader修改器堆栈:
一个用来描述如何用修改器代码组成修改器,并加入到shader代码里形成新shader的结构。

你可能感兴趣的:(sha)