作者a27417332 (等号卡比)
看板GameDesign
标题[程式] 关於Shader抽象部份的问题
时间Mon Feb 3 11:49:35 2014
最近小弟想趁寒假结束以前,试着做一些简易的封装。可是在设计上碰到了一些问题,
想请教各位大大。
就是关於Shader的部分,在DirectX里面,每个Shader都是可以独自成一个个体,最後
依照使用状况不同,互相排列绑在管线上面。
可是在OpenGL里面,在4.1之前,Shader都不支援这种混合运用,非得要把每个阶段的
Shader都绑在Program上面以後,以Program为单位去使用。
我的问题就在这边,我目前采用的绘图API是以OpenGL为准,不排除以後加入DirectX
的可能性。但这边就出现一些分歧的地方,就是我不知道该怎麽设计这边的关系。
我想让使用者可以自行决定Shader的绑定,可是在OpenGL里面,单是要查询uniform
block这种动作也非得透过Program才行。
想请问各位大大,有没有甚麽比较好的方法可以使用?我目前是尽量不想要再设计一
个Program类@@(因为DirectX很显然不需要这个类)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.181.73
1F:推 lulumi07:目前似乎不支援,所以你顶多swap 不同阶段的 shader, 02/15 02:39
2F:→ lulumi07:所以你还是得 link program一遍,而且你 02/15 02:40
3F:→ lulumi07:uniform也要重绑。 02/15 02:42
4F:→ lulumi07:但从你最後一句我有疑问的是,为什麽要再设计Program类? 02/15 02:44
5F:→ lulumi07:可以说一下你设计的shader class吗? 02/15 02:46
6F:→ lulumi07:我的方式是preload所有shader,用resourcemanager去查找 02/15 02:47
7F:→ lulumi07:还有你所谓的uniform block是绑UBO的uniform block吗? 02/15 02:48
8F:→ lulumi07:还是单纯的uniform? (ex: uniform int useTexture;) 02/15 02:48
我原本的打算是像是DirectX那样,因为每个Shader自己都是独立的,所以自己可以拥有所有资讯,举凡像是
uniform block或是uniform等等。但在OpenGL里面,要倒出有关资讯都得透过program才行。
而每当换一种组合的时候,都要Link Program感觉会是个消耗时间的操作,而且每次都得重新把资讯捞出
来整理。当然也可以cache起来在一个map里面,利用vs和fs的值去索引,只是感觉还是浪费不少时间。
所以我想设定program类就是因为这样的话可以直接使用,而且麻烦的shader parameter也会都被设置完成。
但这种需求只有在OpenGL才需要而已,让我有点不懂该怎麽设计@@
(Pass虽然记录该阶段所需要的shader们,但他应该是无关绘图API的...)
※ 编辑: a27417332 来自: 114.42.106.145 (02/17 17:38)