• 编写和调试Shader程序(1)


    编写和调试Shader程序
    (1)DirectX EffectEdit


    JohnsonFeng

    常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手,本文先介绍DirectX的EffectEdit。

    EffectEdit是DirectX9.0在August2005之前提供的一个编辑器
    Binary:$installdir/bin/dxutils/effectedit.bin
    Soucecode: $installdir/samples/c++/direct3d/effectedit
    以下是EffectEdit的界面,虽然看上去很简陋,但是挺好用,笔者在这个工具上写过法线贴图程序,动态水波程序:



    EffectEdit在August2005版本之后就去掉了,取而代之的是DirectX Viewer(DxViewer.exe),被这个工具替换掉的还有mview.exe,也是一个很好用的工具。在该版本中也可以找到EffectEdit的源代码。
    此工具支持一些基本用于编辑的语义(semantic)和释义(anotation)工具,这里列出它支持的释义。对应版本的帮助中提供了释义介绍,但是不完整,根据源码,笔者将列出:

    (一)工具内置语义(Semantic)
    语义还包括输入输出语义,这里仅仅列出编辑器实用的,用于自动初始化的语义,不区分大小写,其中斜体是文档中没有列出但有效的语义。

    Semantic Meaning
    WORLD
    world transform matrix
     
    VIEW view transform matrix
    PROJECTION projection transform matrix
    WORLDVIEW world*view
    VIEWPROJECTION view*projection
    WORLDVIEWPROJECTION world*view*projection
    MATERIALAMBIENT material.ambient
    MATERIALDIFFUSE material.diffuse
    MATERIALSPECULAR material.specular
    MATERIALPOWER material.power
    TIME current time
    MESHRADIUS mesh bounding sphere radius

    举例:
    sample.fx中的以下代码中,k_a将会自动用材质的颜色初始化,此编辑器中,材质是编辑器自动从.x中读取的。
    float4 k_a :MATERIALAMBIENT={1.0f,1.0f,1.0f,1.0f};
    另外一个很有用的语义是TIME,将被自动初始化成当前时间,类型为float,在调试动画时比较有用。


    (二)释义(Anotation)
    释义和注释是不同的概念,释义即写在变量后边的括号中的变量,特定类型和名字的释义变量取可以被正确地初始化为被解释对象的属性,
    EffectEdit中纹理对象支持的释义包括:

    Texture Anotation Meaning
    NAME texture filename
    FUNCTION texture blendfunction?
    TARGET Compile Target(tx_0,tx_1),refer D3DXCompileShader
    WIDTH specify texture width
    HEIGHT specify texture height
    DEPTH volumn depth
    TYPE texture type

    其中纹理类型:
    Texture Type Meaning
    volumn 该纹理是一个体积纹理
    cube 该纹理是一个cubetexture
    <default> 一般的2D纹理

    (三)内置变量
    Texture Type Meaning
    BIMG 调试视窗的背景
    XFILE 调试程序使用的.x文件
    BCLR 调试程序背景色

    另外,下边给出一些学习Shader程序的路径供参考:

    step content description
    1 technique 一个物体可以有多种渲染方法,每个technique代表一种
    2 pass 某些特效在实现时需要渲染多次物体,渲染一次就对应一个pass,每个pass可以选用各自的顶点和像素Shader
    3 renderstate 渲染状态可以在pass内指定,语法参考dx帮助文档
    4 input/output Semantic 输入和输出语义告诉设备,Shader程序的入口参数用顶点的什么信息初始化,以函数返回值代表什么含义。
    5 datatype 常见的如floatfloat3float4代表13432位浮点数字
    float4x4可以定义矩阵,float2可以定义uv坐标,float3可以用来定义法线。Shader程序可以认为是一种浮点数计算的程序。
    6 function HLSL提供了很多内置的数学函数,参考dx相关文档
    7 algorithm 这是学习Shader最难的部分了,对于VS,最好是学习好了固定管线的原理之后再写Shader程序。对于PS,这部分需要使用较多的纹理特效,2D图形学和3D数学知识,典型的如photoshop中用到的滤镜算法,卷积预算等。



    补充一些PS调试的技巧:

    1.在进行PS程序调试时,有时候光照结果不正确,可以试着直接返回法线,光源向量,反射向量等参数,这样很容易判别是哪里出了问题。

    2.在光源向量后增加以下释义,可以在视窗中增加一个用于调接光源方向的箭头,通过交互式的方式调整一些方向向量。可在多个需要调整的向量上增加此释义,箭头的名称是释义字符串的值得,名称和向量的值得将会显示在箭头旁边。
    float3 lightDir<string UIDirectional="Light Direction">={0,1,0};

    EffectEdit源码:
    https://files.cnblogs.com/Tue/EffectEdit.rar

    中秋假期快完了,乘着整理以前写的Shader程序的时机,总结一下,希望能给大家作个参考。

    2008年9月15日

  • 相关阅读:
    Source InSight context 窗口丢失的解决办法
    [EffectiveC++]item41:了解隐式接口和编译器多态
    [EffectiveC++]item04:Make sure the objects are initialized before they're used
    [EffectiveC++]item3:尽可能使用const
    linux man指令问题
    解读ARM成功秘诀:薄利多销推广产品
    source insight设置问题 [问题点数:20分,结帖人leecapacity]
    totalcommander
    firefox
    处理SecureCRT中使用vim出现中文乱码问题
  • 原文地址:https://www.cnblogs.com/Tue/p/1291150.html
Copyright © 2020-2023  润新知