用Effect框架调用shader的几个问题。
自学shader有几个疑惑:
1.我在场景开始加载了一个一般光照的shader文件。然后我其他的物体渲染还需要处理一般光照吗?比如我要显示一个模型。这个模型的shader文件里也要写一般光照的处理代码吗?
2.假设在场景里加载了一个Lambert光照的shader,然后在某一个金属物体的渲染里加载phong光照处理的shader,是不是金属物体用自己的光照处理代替整体的光照处理,这个是不是叫局部光照模型?
3.各个shader之间的影响关系是怎么影响的,GPU内部是把这些shader代码按顺序处理吗?
4.用Effect 框架来渲染,设计一个简单的渲染队列,要排序之类的,要怎么获得渲染状态?
[解决办法]
1.如果开启了vertex shader,就需要自己处理顶点变换与光照,不能只处理顶点变换,而让固定管线处理光照,因为这两种方式只能取其一;同理,开启了pixel shader就只能自己处理计算象素的颜色值。
2. 渲染物体时用哪个shader就使用这个shader中的光照处理。局部光照是和全局光照对应的,局部光照里对一个物体的光照不会影响其它物体的光照,没有光照到物体表面经过反射又照亮其它物体这种现象。
3. shader编译之后就是一堆指令,渲染的时候用哪个shader就执行这些指令。GPU不会自己做shader的排序。
4. 要按什么排序呢?是要按shader排序,减少渲染状态切换吗?shader里面改了哪些渲染状态,写shader的人肯定知道,会往里面传相应的值,自然就知道切换了哪些渲染状态。DX之类的也提供了API查询当前的渲染状态。