转:http://blog.csdn.net/leonwei/article/details/8212800

effect其实整合了shader和render state的控制两大部分内容

9.1 effect文件基本框架

part1 :shader state包括全局变量 shader数据结构定义,shader的实现

part2 :texture and sampler state,这个通常是全局变量,用于shader中,通常要定义在shader的实现之前

part3 其他的render state设置,写在technique的pass里,这才是effect文件的主入口

effet中任何一个变量后面都可以接一个语意:XXX

1.可以使用的变量类型

Data : Buffer Scalar Vector Matrix Sample Shader Texture Struct UserDefined

9.1.1参数类型

hlsl中使用的参数有两种:Uniform和 varying

Uniform存储在常量缓存中的,是对shader的每一次调用值都是一样的,可以在D3D中访问的 前面可以加uniform(可不加),通常是全局的

varying:只对一次调用起作用的,是来自vertext stream中的,通常要有语意的修饰,通产是写在shader的输入输出参数里的

9.1.2 sampler纹理采样器

要包含三个信息

  • A texture :纹理物体(tex0 tex1 tex2...NULL)
  • A sampler (with sampler state)如
  • A sampling instruction

例如定义这样一个sampler

 
sampler s = sampler_state 
{ 
  texture = NULL; 
  mipfilter = LINEAR; 
};
 
就可以在shader中使用
float2 sample_2D(float2 tex : TEXCOORD0) : COLOR
{
  return tex2D(s, tex);
}
来采样纹理
9.1.3 shader的函数体

函数通常要包含这样几部分:

  • A return type
  • A function name
  • An argument list (optional)
  • An output semantic (optional)
  • An annotation (optional)
float4 VertexShader_Tutorial_1(float4 inPos : POSITION ) : POSITION
{
   ...
}
struct VS_OUTPUT
{
    float4  vPosition        : POSITION;
    float4  vDiffuse         : COLOR;
}; 
 
VS_OUTPUT VertexShader_Tutorial_1(float4 inPos : POSITION )
{
   ...
}

9.2D3D9中使用effect

1.首先从effect file创建effect(编译),使用函数

D3DXCreateEffectFromFile( 
        pd3dDevice, 
        str, 
        NULL, // CONST D3DXMACRO* pDefines,
        NULL, // LPD3DXINCLUDE pInclude,
        dwShaderFlags, 
               NULL, // LPD3DXEFFECTPOOL pPool,
        &g_pEffect, 
        NULL );
 

dwShaderFlags

    • Skipping validation, 如果已知这是没有问题的 那么就跳过检查
    • Skipping optimization 有时开启优化会导致debug 困难,就可以跳过优化
    • Requesting debug information to be included in the shader so it can be debugged.

这个函数的调用实际上是在从文件编译出一个effect

你还可以利用工具fxc.exe离线的编译出一个effect,他会直接编出一个汇编的shader指令,这样在程序中就不用编译了。发布产品时这样做应该更好。

2.调用一个effect来render

ID3DXEffect::Begin set technique

ID3DXEffect::BeginPass set pass

ID3DXEffect::CommitChanges提交对当前pass的各种参数修改,要在draw之前调用

ID3DXEffect::EndPass

ID3DXEffect::End

一个典型调用

3  effect 的参数设置(指effect文件中定义的全局变量(uniform))

设置与获取

m_pEffect->SetValue

m_pEffect->GetValue

函数的第一个参数都是变量的名字

 
不同的effect 可以共享参数:如果一个effect变量定义为shared,并且多个effect创建的时候使用同一个pool(D3DXCreateEffectFromFile的第六个参数)就可以共享这个参数。
 
创建参数block,可以像使用render state的block那样 创建parament state,这时是通过创建Parameter Blocks的方式。把effect 的参数设置操作写在
m_pEffect->BeginParameterBlock();与m_pEffect->EndParameterBlock();
之间。得到的block可以用在effect 上

4 用户注释

用户可以在effect pass 或者某个变量上附加一个用户的注释。他其实就是一个string或numeric格式的变量。格式

 
texture Tex0 < string name = "tiger.bmp"; >;意味着给tex0 附加一个注释,告诉这个texture使用的纹理文件的路径。注释可以理解为用户在D3D层面去扩充effect 文件的定义。

ID3DXBaseEffect::GetAnnotation orID3DXBaseEffect::GetAnnotationByName可以获取

5 preshader技术

对于shader中的常量计算,D3D会将其提取出来,在shader执行之前,先由CPU计算,这样会提高GPU的效率,防止每个顶点或pixcel都重复这个同样的运算,使不使用preshader可一在编译时指定优化的flag,关闭使用参数D3DXSHADER_NO_PRESHADER。所以基于这个技术我们可以在shader中做常量矩阵运算,不用担心这个运算会在每个顶点处做一次。

9.3 语法备忘

9.3.1 语义

VS:

输入:

BINORMAL[n]

Binormal

float4

BLENDINDICES[n]

Blend indices

uint

BLENDWEIGHT[n]

Blend weights

float

COLOR[n]

Diffuse and specular color

float4

NORMAL[n]

Normal vector

float4

POSITION[n]

Vertex position in object space.

float4

POSITIONT

Transformed vertex position.

float4

PSIZE[n]

Point size

float

TANGENT[n]

Tangent

float4

TEXCOORD[n]

输出

COLOR[n]

Diffuse or specular color

float4

FOG

Vertex fog

float

POSITION[n]

Position of a vertex in homogenous space. Compute position in screen-space by dividing (x,y,z) by w. Every vertex shader must write out a parameter with this semantic.

float4

PSIZE

Point size

float

TESSFACTOR[n]

Tessellation factor

float

TEXCOORD[n]

Texture coordinates

float4

PS

输入:

COLOR[n]

Diffuse or specular color.

float4

TEXCOORD[n]

Texture coordinates

float4

VFACE

Floating-point scalar that indicates a back-facing primitive. A negative value faces backwards, while a positive value faces the camera.

float

VPOS

The pixel location (x,y) in screen space. To convert a Direct3D 9 shader (that uses this semantic) to a Direct3D 10 shader, seeDirect3D 9 VPOS and Direct3D 10 SV_Position)

float2

输出:

COLOR[n]

Output color

float4

DEPTH[n]

Output depth

float

9.3.2数据的访问方式

vector

bool bVector = false;int1 iVector = 1;float3 fVector = { 0.2f, 0.3f, 0.4f };double4 dVector = { 0.2, 0.3, 0.4, 0.5 };

vector <bool, 1> bVector = false;vector <int, 1> iVector = 1;vector <float, 3> fVector = { 0.2f, 0.3f, 0.4f };vector <double, 4> dVector = { 0.2, 0.3, 0.4, 0.5 };


// Given
float4 pos = float4(0,0,2,1); pos.z // value is 2
pos.b // value is 2

// Given
float4 pos = float4(0,0,2,1);
float2 temp; temp = pos.xy // valid
temp = pos.rg // valid temp = pos.xg // NOT VALID because the position and color sets were used.

float4 pos = float4(0,0,2,1);
float4 f_4D;
f_4D = pos; // write four components f_4D.xz = pos.xz; // write two components
f_4D.zx = pos.xz; // change the write order f_4D.xzyw = pos.w; // write one component to more than one component
f_4D.wzyx = pos;

matrix

A matrix can be initialized when it is declared:


float2x2 fMatrix = { 0.0f, 0.1, // row 1
2.1f, 2.2f // row 2
};

Or, the matrix type can be used to make the same declarations:


matrix <float, 2, 2> fMatrix = { 0.0f, 0.1, // row 1
2.1f, 2.2f // row 2
};
  • The zero-based row-column position:

    • _m00, _m01, _m02, _m03
    • _m10, _m11, _m12, _m13
    • _m20, _m21, _m22, _m23
    • _m30, _m31, _m32, _m33
  • The one-based row-column position:
    • _11, _12, _13, _14
    • _21, _22, _23, _24
    • _31, _32, _33, _34
    • _41, _42, _43, _44
    • [0][0], [0][1], [0][2], [0][3]
    • [1][0], [1][1], [1][2], [1][3]
    • [2][0], [2][1], [2][2], [2][3]
    • [3][0], [3][1], [3][2], [3][3]

However, array accessing can read a multi-component vector.


float2 temp;
float2x2 fMatrix;
temp = fMatrix[0] // read the first row

Just like vectors, naming sets can use one or more components from either naming set.


// Given
float2x2 fMatrix = { 1.0f, 1.1f, // row 1
2.0f, 2.1f // row 2
};
float2 temp; temp = fMatrix._m00_m11 // valid
temp = fMatrix._m11_m00 // valid
temp = fMatrix._11_22 // valid
temp = fMatrix._22_11 // valid

As with vectors, reading more than one matrix component is called swizzling. More than one component can be assigned, assuming only one name space is used. These are all valid assignments:


// Given these variables
float4x4 worldMatrix = float4( {0,0,0,0}, {1,1,1,1}, {2,2,2,2}, {3,3,3,3} );
float4x4 tempMatrix; tempMatrix._m00_m11 = worldMatrix._m00_m11; // multiple components
tempMatrix._m00_m11 = worldMatrix.m13_m23; tempMatrix._11_22_33 = worldMatrix._11_22_33; // any order on swizzles
tempMatrix._11_22_33 = worldMatrix._24_23_22;
9.3.3 定义shader类型

PixelShader = compile ShaderTarget ShaderFunction(...);

VertexShader = compile ShaderTarget ShaderFunction(...);

ShaderTarget :shade_model 例如vs_2_0

...就是shader中的uniform参数

9.4编译shader

在VS(2012以下)中直接DEBUG是不能发现shader 的语法错误的,这需要使用fxc工具

常用语法是

fxc /T fx_2_0 file.fx

Will compile the entire file with vs and ps 2.0.

fxc /T ps_2_0 /E PixelShaderFunction file.fx

Will compile PixelShaderFunction with ps 2.0.

9.5调试

可以使用dx sdk中带的pix

D3D9 effect (hlsl)(转)的更多相关文章

  1. 【转】Directx11 HelloWorld之HLSL的Effect框架的使用

    最近尝试用了下Directx下的Effect框架,作为一初学者初学者,说下为什么我们要使用Effect框架及其好处吧. 首先Effect最大好处的就是简单,使得编写Shader绘制的程序工作量大大下降 ...

  2. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...

  3. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果)          浮雕效果主要有两个参数:Amount和Wid ...

  4. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来 ...

  5. HLSL之镜面反射光照

    今天学习的是镜面的反射光照,其实一般在场景中基本环境光和漫反射光照已经可以表现出一个不错的照明了,今天的镜面反射光照其实仅仅适合于需要在表面添加抛光或者闪耀的物体上,例如金属.玻璃等等,同时也是基于之 ...

  6. hlsl 和cg 涉及 mul 左乘 右乘

    error: 1. mul' implicit truncation of vector type 2. matrixXXX: array dimensions of(unknown scope en ...

  7. 【转】HLSL基础

    原文地址http://blog.csdn.net/chpdirect1984/article/details/1911622 目录 前言 1.HLSL入门 1.1什么是着色器 1.2什么是HLSL 1 ...

  8. 【转载】Direct3D HLSL介绍(上)

    原文路径:http://www.csharpwin.com/csharpspace/3087.shtml 写过Direct3D程序的朋友们可能还记得,在以往,大家常为如何表现更多真实的材质(如玻璃.金 ...

  9. 一些WPF中的滤镜特效——Effect Library

    WPF支持类似PhotoShop的滤镜功能,称之为Effect.在.Net 4.0中,WPF就废弃了对BitMapEffect的支持,转向使用支持GPU加速的Effect类,例如,我们可以使用如下代码 ...

随机推荐

  1. json 删除、添加对象

    1. 定义json对象    var entryJson = []; 2. 删除.添加对象 entryJson.pop();     //删除最后一个对象   entryJson.push({ //往 ...

  2. MySQL5.6主从复制最佳实践

    MySQL5.6     主从复制的配置  环境 操作系统:CentOS-6.6-x86_64 MySQL 版本:mysql-5.6.26.tar.gz 主节点 IP:192.168.31.57    ...

  3. bzoj 1432 数学(找规律)

    我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那 两个线段所在的直线如图中左 那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每 加一对儿就多两条线段, ...

  4. 基于滑动窗口协议写的程序(UDP实现) .

    正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...

  5. Socket心跳包机制【转】

    转自:https://blog.csdn.net/xuyuefei1988/article/details/8279812 心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己 ...

  6. linux终端自定义设置

    2014年1月4日 19:21:16 1. ls命令显示文件列表时不再花花绿绿 vi ~/.bashrc alias ls='ls -a --color=never' alias ll='ls -lh ...

  7. windows下安装Apache

    2014年3月10日 13:22:53 选择vc9版本的Apache,这个时候了,大多PHP扩展或者PHP的windows版本已经很流行vc9编译的版本了,为了方便安装扩展,所以选择vc9版本 htt ...

  8. 安装numpy只需一步简单的方法

    因为最近在搞机器学习,涉及到python,因为我的python版本还是windoes下的2.7版本,在学习K临近算法的时候,需要安装numpy函数,下面就把自己的安装方法写下来 1:登录网址  htt ...

  9. Java 基本语法---Java运算符

    Java 基本语法---Java运算符 0. 概述 Java中的运算符主要分为以下几种: 算术运算符 赋值运算符 关系运算符 逻辑运算符 条件运算符 位运算符 其他运算符 1. 算术运算符 操作符 描 ...

  10. Oracle学习笔记:外连接(+)的用法

    Oracle中常用 left join 和 right join 来进行外连接,同时,oracle也支持 (+) 的特殊用法,也是表示外连接,并且总是放在非主表的一方. 例如: 左外连接: selec ...