什么是CgFX?

来源:互联网 发布:留学好处知乎 编辑:程序博客网 时间:2024/05/16 01:04
导读:
  CgFX是一种强大的通用的着色器规范和交换格式。CgFX运行时,比如Cg,支持OpenGL,同样也支持DirectX8和DirectX9。对于实时图像艺术家和开发者来说,这种格式提供了几个好处:
  1、交叉API,交叉平台的兼容性和便携性
  2、多技术(technique)的封装,使细节层、功能性或性能退居其次。
  3、支持Cg,汇编语言以及固定功能的着色器
  4、文件中内嵌可编辑的参数和GUI描述
  5、多遍着色器
  6、渲染状态和纹理状态规范
  在实际情况下,通过将渲染状态,纹理状态和渲染次数(passes)与Cg顶点程序(Cg vertex programs)和Cg片段程序(Cg fragment programs)包装在一起,开发人员可以在CgFX文件中描述一个完整的渲染效果。尽管一个单独的Cg程序可以包含一个效果必须的核心渲染语法,但只有将这些额外的环境信息合并在一起才使着色器变得完整和自包含。对于艺术家很友好的GUI描述使得CgFX文件与被艺术家和程序员使用的产品流程很好的集成在一起。
  CgFX文件格式简介
  Cg语言可以让你轻松的表示出一个物体应该被怎么渲染。虽然现在的Cg范本只是描述了一个单独渲染过程,很多渲染技术,像shadow volume或shadow map,需要多于一次的渲染过程。
  许多应用程序需要面向很广范围的图形硬件功能和性能。于是,在一个比较旧的硬件上运行的着色器的版本和对远处物体协助性能的着色器的版本是重要的。
  每个Cg程序一般来说都是面向一个profile,并不能退到其它profile中,或者汇编语言着色器,或者是固定功能的顶点或片段处理过程。
  用Cg程序来产生图像,一些关于它们的环境的信息是必须的。例如,一些程序可能需要alpha混合被打开而深度写被关闭。其他的程序可能为了正常工作需要特定的贴图格式。这些信息在标准的Cg源文件中并没有提供。
  CgFX通过一个基于文本的文件,来包含Cg,汇编,固定功能着色器以及为了渲染一个效果需要的渲染状态和和环境信息。这个文本文件的语法与Microsoft .fx 2.0格式(Direct 9.0 效果格式)很类似。
  CgFX在一个单独文本文件中包含为渲染效果所需要的所有东西。这个特点使得第三方工具或其它3D应用程序可以像它自己的文件一样来使用CgFX,除了几何和纹理数据之外不需要额外的扩展信息。在这种情况下,CgFX就像一个交换格式。CgFX使得在着色器可以在没有相关C++代码的情况下被交换,这些C++代码在一般情况下都是为了使一个Cg程序与OpenGL和Direct3D一起进行工作的。
  
  技巧(Techniques)
  每个CgFX文件通常表示一个着色器作者极力完成的特定的效果,例如凸凹贴图,环境映射或各向异性灯光等。CgFX包含一个或多个技巧,每一个都描述了完成一个效果的方式。每个技巧都面下一个特定层次的GPU功能,因此一个CgFX文件可以包含一个针对带有强大片段编程能力的高级GPU的技巧,同时另一个技巧是为支持固定功能纹理混合的比较旧的图形硬件准备的。CgFX也可以用于功能性,细节层和性能退化。例如:
  effect myEffectName
  {
  technique PixelShaderVersion
  {...};
  technique FixedFuntionVersion
  {...};
  technique LowDetailVersion
  {...};
  };
  应用程序可以对一个效果中那么技巧正在被显示出来进行查询,也可以在运行时选择一个合适的技巧,基于无论如何都适当的标准。
  轮回(Passes)
  每个技巧都包含一个或多个轮回(passes)。每个轮回表示一系列的渲染状态和着色器被应用到一个技巧的一个渲染轮回上。例如,第一个轮回可能仅仅是准备深度,只有这样才能使接下来的轮回得以应用一个添加的alpha混合技巧,而不必进行多边形排序。
  每个轮回可能包含一个顶点程序,一个片段程序,或者两者,而且每一个轮回都可以使用固定功能顶点或像素处理或二者。例如,第一个轮回可以使用固定功能像素处理来输出环境颜色。下一个轮回可以使用ps_1_1片段程序和第三个轮回可以使用ps_2_0片段程序。在实际中,在一个技巧中的所有轮回通常都使用固定功能处理或都使用Cg或汇编程序。这个方法防止深度冲突,也就是说防止固定功能和一些GPU中的可编程部分在处理同样数据的时候使用不同的方式。
  渲染状态
  每个轮回也可以包含渲染状态,例如alpha混合,深度写,以及纹理过滤模式。
  pass firstPass
  {
  DepthWriteEnable = true;
  AlphaBlendEnable = false;
  MinFilter[0] = Linear;
  MagFilter[0] = Linear;
  MaxFilter[0] = Linear;
  // Pixel shader written in assembly
  PixelShader = asm
  {
  ps.1.1
  tex t0;
  mov r0, t0;
  };
  };
  注意到CgFX额外嵌入了Cg程序,使你可以使用asm关键字来编码汇编语言顶点和片段程序。
  变量和语义
  最后,CgFX文件包含了全局和每个技巧中的Cg风格的变量。这些变量通常作为统一的参数传递给Cg函数,或者作为一个为渲染或纹理状态设置准备的值。例如,一个bool变量可以被作为统一参数给一个Cg函数来使用,或者作为一个值是能或禁止alpha混合渲染状态:
  bool AlphaBlending = false;
  float bumpHeight = 0.5f;
  这些变量可以包含一个用户定义的语义,可以帮助应用程序提供一个正确的数据给着色器,而不必一定进行变量名的解释:
  float4x4 myViewMatrix : ViewMatrix;
  texture2D someTexture : DiffuseMap;
  接下来,一个允许使用CgFX的应用程序就可以查询这个CgFX文件的变量和它们的语义。
  注释(Annotations)
  另外,每个变量都可以有一个可选的注释。注释是一个每变量拥有的结构,包含了效果作者与一个CgFX应用程序,例如一个艺术家工具,进行沟通的数据。这个应用程序允许对变量进行基于GUI方式的操作,这种操作方式是对于这些注释比较合适的操作方式。
  一个注释可以被用于描述用户界面元素,从而操作统一的变量,或者用来描述在一次渲染轮回中期待的渲染目标的类型。
  float bumpHeight
  <
string gui = "slider";
float uimin = 0.0f;
float uimax = 1.0f;
float uistep = 0.1f;
>  string gui = "slider";
  float uimin = 0.0f;
  float uimax = 1.0f;
  float uistep = 0.1f;
  >= 0.5f;
  注释被放置在可选的语义之后,在变量初始化之前。应用程序可以查询注释,并使用它们在那些使用CgFX的工具中暴露特定的参数给艺术家,例如Discreet的3ds max 5或Alias|Wavefront的Maya 4.5
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1606370

本文转自
http://blog.csdn.net/willoj/archive/2007/05/12/1606370.aspx
原创粉丝点击