五、FLSL2.0的命名空间
FLSL2.0文件的开头都使用了命名空间。那么不禁要问:FLSL2.0的命名空间在哪儿?里面包括了些什么基本数据类型和函数?命名空间的内容可以修改和增加吗?FLSL2.0文件一定要有命名空间吗?
下面就逐个回答这些疑问.
1、在前面我章节中建议大家FLSL2.0文件的调试和编译最好在免费的Flare3D的IDE中进行。你下载安装了这个软件,命名空间就在这个软件的安装目录下的libs文件夹中的三个FLSL文件里定义。如图:
2、FLSL2.0命名空间所用基本数据类型和函数都在 01 flare3d.flsl、02 flare3d.flsl、03 flare3d.flsl 这三个文件中。有空多看看这三个文件,对你会有很大的帮助。
3、这三个文件是可以修改和增加内容的,你可以在里面定义自己函数。
4、在编辑FLSL2.0文件时所用了命名空间,命名空间里有的数据类型和函数可以直接使用。当然也可以不使用命名空间,那样编辑FLSL2.0的文件就要复杂些。
使用了命名空间:
use namespace flare;
use namespace flare.transforms;
use namespace flare.filters;
sampler2D texture;
param float alpha = 1;
technique template
{
output vertex = transform();
output fragment = sampler2D( texture, iUV0 ) * alpha;
}
没有使用命名空间:
sampler2D texture;
param float alpha = 1;
float4 gxtransform()
{
param WORLD_VIEW_PROJ worldViewProj;
input POSITION position;
return position.xyzw * worldViewProj;
}
float4 textureMap( sampler2D texture )
{
input UV0 uv;
interpolated float2 iUV = uv;
return sampler2D( texture, iUV )
}
technique main()
{
output vertex = gxtransform();
output fragment = textureMap( texture ) * alpha;
}
这2个FLSL文件是完全一样的,可见没有使用命名空间会复杂很多。
六、FLSL2.0的FLSLMaterial和FLSLFilter
这里谈谈FLSLMaterial和FLSLFilter的不同,FLSLMaterial是一个完整的shader,它必须包括顶点着色器和片元着色器;FLSLFilter只是整个shader的一个部分,所以它可以没有顶点着色器。如:
use namespace flare;
use namespace flare.transforms;
use namespace flare.filters;
sampler2D texture;
param TIME time;
technique template
{
output fragment = textureMap( texture, float2(1), time.xy );
}
另外,在AS方面的应用就完全不一样了。
package
{
import flare.basic.*;
import flare.core.*;
import flare.flsl.*;
import flare.materials.*;
import flare.materials.filters.*;
import flare.primitives.*;
import flash.display.*;
public class TimeFLSLFilter extends Sprite
{
[Embed(source = "timetexture.flsl.compiled", mimeType = "application/octet-stream")]
private var flslFilterAsset:Class;
[Embed(source = "../bin/clay4.png")]
private var textureAsset:Class;
private var _scene:Scene3D;
private var _cube:Cube;
private var _flslFilter:FLSLFilter;
private var _shader:Shader3D;
public function TimeFLSLFilter():void
{
_scene = new Viewer3D( this );
_scene.camera.setPosition( 10, 20, -30 );
_scene.camera.lookAt( 0, 0, 0 );
_flslFilter = new FLSLFilter( new flslFilterAsset, BlendMode.NORMAL );
_flslFilter.params.texture.value = new Texture3D( new textureAsset );
_shader = new Shader3D( "", [ _flslFilter, new ColorFilter( 0xff0000, 0.5,BlendMode.ADD ) ] );
_cube = new Cube( "cube", 10, 10, 10, 1, _shader );
_scene.addChild( _cube );
}
}
}