当前位置: 首页 > 工具软件 > gfx > 使用案例 >

CgFX语言介绍

高迪
2023-12-01

技巧(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;
> = 0.5f;

注释被放置在可选的语义之后,在变量初始化之前。应用程序可以查询注释,并使用它们在那些使用CgFX的工具中暴露特定的参数给艺术家,例如Discreet的3ds max 5或Alias|Wavefront的Maya 4.5

 类似资料: