DirectX Effects初探

简介:

一个effect包括以下几部分:一个vertex shader和/或一个pixel shader,一个需要设置的设备状态列表,一个或多个渲染管道。此外,设计一个备用机制以使effect能够在不同级别的图形设备上工作也是很有用的-也即对于同一个效果设计不同的版本。

Direct3D将effects放在effect文件中,这样做的好处是,首先它使我们能够随时改变一个effect的实现而不必重新编译程序的源代码,这使得使用effect非常简单,方便。其次它将所有的东西封装到了一个文件里面。

一个effect包含一个或多个techniques,一个technique就是渲染某个effect的用的特定方法,换句话说,一个effect文件提供了渲染同一effect的一种或多种方法。为什么要为同一个effect提供不同的实现呢?因为硬件之间有差别,有些硬件不支持某些effect,所以为了适应不同级别的硬件,需要提供多种不同的实现。比如可以为一个effect提供两个版本的实现,一个用fixed pipeline实现,一个用shader实现,这样支持shader的显卡可以使用shader,不支持shader的显卡可以使用fixed pipeline.

每个techniques都包含一个或多个pass,一个pass封装了设备状态,采样器,和/或shader.

注意:effect不只局限于使用可编程管线,也可以使用固定管线,比如控制设备状态,光照,材质和纹理等。

使用多个pass的原因是某些特定的效果需要对同一个几何图元进行多次渲染,但是需要在不同的设备状态下进行。下面是一段technique和pass的伪代码

Code

effect常用的对象类型

纹理对象

代表一个IDirect3DTexture9对象,使用纹理对象,我们可以把纹理和一个特定的采样阶段直接关联起来,纹理对象有以下数据成员可以关联

type-纹理的类型,2D, 3D

format-纹理的像素格式

width-纹理的宽度,以像素为单位

height-纹理的高度,以像素为单位

depth-纹理的深度(3D volume texture)以像素为单位

注:到目前为止,我们只是使用纹理来存放image数据,但是随着技术的深入,你会发现纹理可以存放任何数据,换句话说,纹理就是数据表,它们不必一定存放image数据,比如在bump mapping中我们使用normal map,这里的纹理包含的就是normal vectors。

采样器对象和采样器状态

使用sampler_state关键字,我们可以直接在effect文件为采样器设置纹理及采样状态,请看下面的例子

复制代码
 1  Texture Tex;
 2 
 3  sampler SO  =  sampler_state
 4  {
 5       Texture  =  (Tex);
 6       MinFilter  =  LINEAR;
 7       MagFilter  =  LINEAR;
 8       MipFilter  =  LINEAR;
 9  };
10 
复制代码

顶点和像素着色器对象

vertexshader和pixelshader分表代表了顶点着色器和像素着色器对象,vertexshader和pixelshader可以在应用程序中通过ID3DXEffect接口来设置,即ID3DXEffect::SetVertexShader和ID3DXEffect::SetPixelShader,例如,假定Effect是一个ID3DXEffect对象,VS是一个IDirect3DVertexShader9对象,而VSHandle是一个D3DXHANDLE,那么我们可以用下面的方法初始化vertex shader

1  Effect -> SetVertexShader(VSHandle, VS);

或者,你也可以直接在effect文件中设置vertexshader和pixelshader,如下

1  //  Define Main:
2  OUTPUT Main(INPUT input){}
3 
4  //  Compile Main:
5  pixelshader ps  =  compile ps_2_0 Main();
6 

然后就可以将shader与pass相关联了

Code

或者更紧凑一点

复制代码
1  pass P0
2  {
3        //  Set the vertex shader whose entry point is "Main()" as the
4        //  vertex shader for this pass.
5       vertexshader  =  compile vs_2_0 Main();
6 
7       
8  }
9 
复制代码

如果你使用汇编语言编写shader,你也可以使用下面的代码

1  vertexshader vs  =  asm {  /* assembly instructions go here  */  };
2  pixelshader ps  =  asm {  /* assembly instructions go here  */  };
3 

字符串

字符串对象可以像下面这样使用

1  string  filename  =   " texName.bmp " ;

尽管字符串对象并不被HLSL中的任何函数使用,但是它们可以被应用程序读取,这样,我们可以封装effect文件引用的数据文件,比如纹理文件的名字,X文件的名字。

注解-Annotations

注解可以和变量相关联,注解并不被HLSL使用,但是可以被应用程序通过effect framework访问,它们只不过是变量的一个注释而已,注解的语法是<annotation>,下面的代码演示了如何使用annotation

1  texture tex0  <   string  name  =   " tiger.bmp " > ;

这个例子将一个string变量关联到一个纹理tex0,string变量即纹理文件的名字,显然将一个纹理和它的文件名关联起来是很有好处的

应用程序可以通过下面的方法获取注解

1  D3DXHANDLE ID3DXEffect::GetAnnotationByName(
2       D3DXHANDLE hObject,
3       LPCSTR pName
4  );
5 

pName是注解的名字,hobject是注解的包含块的句柄,比如一个technique, pass或structure块,一旦我们取得了注解的句柄,我们就可以通过下面的方法获取它的信息

ID3DXEffect::GetParameterDesc to fill out a D3DXCONSTANT_DESC structure. See the DirectX SDK documentation for details.


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2009/11/19/1606270.html,如需转载请自行联系原作者

相关文章
|
图形学 异构计算
Unity Visual Effect Graph 制作Fireworks烟花特效
Unity Visual Effect Graph 制作Fireworks烟花特效
412 1
Unity Visual Effect Graph 制作Fireworks烟花特效
|
异构计算
好工具推荐系列:OpenGL Extensions Viewer
好工具推荐系列:OpenGL Extensions Viewer
174 0
|
Windows
Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷)
原文 Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷) Windows 10 Fall Creators Update(Build 16299)添加了acrylic brush,这是一个类似于Windows 7 Aero效果的UI画笔。
1398 0
[UWP]使用Reveal
原文:[UWP]使用Reveal 1. 前言 之前在 如何使用Fluent Design System 这篇文章里已经简单介绍过Reveal的用法,这篇再详细介绍其它内容。 2. 自定义RevealButtonStyle 我觉得常用ItemsControl都已经自动应用了Reveal,用就是了。
983 0
|
算法 程序员 C#
【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来说可算是相当有难度了,首先我是个Java Web开发程序员,从来没正经地学过微软的开发语言和工具;其次,对于算法这种东西,向来有种天生的排斥,一看便头疼。
1691 0
|
算法 C#
【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果)          浮雕效果主要有两个参数:Amount和Width。
1203 0
|
算法 C#
【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效。
777 0
|
JavaScript 前端开发 Ruby