<@乌龟:>关于DXSAS的总结(我在GameRes上的提问)

leftnoteasy:

请教一下各位大大关于Shader的RenderToTarget的问题

我看到很多Post-Screen的程序都是使用了RenderToTarget,我也使用过这种方法
但是我觉得这样有点麻烦,主要是如果要用的话,就需要在程序中反复的调用RenderToTarget,而且要在cpp文件中设置很多的参数,这样使得cpp文件改动起来挺麻烦的,我目前觉得使用FX Composer 2.5开发shader比较舒服,能不能把RenderToTarget都放在Shader中实现了.这样我使用FX Composer 2.5开发的程序可以直接在DirectX程序中使用.
谢谢了 :-)

 

qrli

不可能


leftnoteasy
请教一下,为什么不可能呢,还有就是版本的问题,DXSAS在SDK只是寥寥提了几句,没有一个具体的例子.如果FX Composer的程序可以直接拿来用的话,Shader的开发周期就真正减少了很多了

在Nvida的文档中有这个例子:

 

Shader code

 

clayman:

你说的这个叫做 stripting annotation
本来是dxsas 0.8的一部分,可惜到1.0以后,被ms从标准里删除了
不过并不影响使用,因为dxsas里的stripting annotation实际只定义了一套标准脚本的格式和语法,以便不同程序可以解析相同的脚本,如果不考虑跨程序应用,完全可以定义一套自己的脚本格式。
实际的脚本解析,dxsas是没有做的,需要你自己编写代码来处理

 

基本思路是用string类型的annotation来记录脚本,比如
technique R2T
{
    pass P0
    <
         string Script = "RenderColorTarget0 = RenderTargetTexture;"
                         "ClearSetColor = clearClor;"
     >
     {........}
}
你的c++程序发现annotation的名称是script时,就说明后面所更的是脚本
大部分脚本都以 xx = xx的方式出现,外加几条有限的指令,所以实现解析还是不太难
fx composer应该就是这样做的

不幸的是关于stripting annotation,可以找到的资料非常少,就连dx sdk里也几乎没有说:(
你可以把nvidia的dxsas标准找来看看
另外,如果你有机会看到shaderx4,那么里面有一篇叫post-processing effects scripting的文章有比较详细的讲解

good luck

clayman

另外说一下,虽然effect可以设置渲染状态,比如
cullmode = none;
ZEnable = false;
ZWriteEnable = false;
AlphaBlendEnable = false;

 

但最好不要使用这个功能,原因之一就是会让你的程序很难debug,当你有大量物体时,渲染状态出错以后,你的C++代码完全无法知道是哪个物体破坏或者说修改了渲染状态

tonykee

意思是说这些状态最好是在shader之外程序代码中设置了对吧
好像很有道理,值得采纳。

leftnoteasy

非常感谢clayman兄的耐心解答,这个问题我也比较明白了,原来是各个显卡公司为了在自己的工具上能够正常运行而设计的程序,而ms并没有完全支持,我非常看好这一块,如果DirectX能够很好的支持或者扩展DXSAS,那shader的编写就会大大的方便了

posted on 2009-03-12 09:16  乌龟_毛驴  阅读(10480)  评论(4编辑  收藏  举报

导航