高档着色语言基础,学习笔记

本笔记基于Microsoft® DirectX® 9 Programmable Graphics
Pipeline
那本书,英文倒霉的对象能够参见此笔记,如不尤其表达,本学习笔记连串皆参考与此书!

语言基础

分歧的寄存器有不一致的功用:

关键字

♦ 输入寄存器从极限缓冲中读取数据

(*号表示大小写敏感)

♦ 常量寄存器提供ALU总结供给采取的各个常量

asm*    bool    compile    const    decl*    do    double    else  
 extern    false    float    for

♦ 暂且寄存器存储shader计算用到的权且变量

half    if      in         inline   inout    int   matrix*   out    
pass*     return   sampler  pixelshader*

♦ 输出寄存器存放shader程序总计的结果

shared  static  string*    struct   texture* true  typedef   uniform
vector*   void     while    technique*

 

volatile        texture*   vertexshader*    

shader程序的布局

下边是虽为保留字但未使用的重要字:

二个汇编着色程序包罗不相同门类的授命,就如此外编制程序语言一样,一些发令必须在任何指令前出现。指令可被分为如下几部分:

auto    break    case    catch    char    class    compile    const  
 const_cast    continue    default    delete

♢ 版本证明

dynamic_cast     enum    explicit friend  goto     long       mutable
 namespace     new         operator   private

♢ 注释

protected        public  register reinterpret_cast short      signed  
sizeof        static_cast switch     template

♢ 常量

this    throw    try     typename union   unsigned using      virtual

♢ 输入寄存器申明

(怎么觉得像C++?GPU编制程序走着和CPU同样的征途,汇编->类C->类C++!?)

♢ 操作指令

数据类型

 

标量类型:

上边是一个例子:

bool–true或者false.

图片 1

int–3一位有记号整数.

 

half–15个人浮点值.

在各样着色程序中的第二条指令,必须是八个本子评释,那几个命令建议着色程序要汇编成的附和版本的代码。本例代码能够在帮助vs_1_1的硬件上运维.

float–3三人浮点值.

诠释能够出现在shader程序的别的地方,跟”//”和”;”以及”/*…*/”皆以注意标记,跟C语言风格类似.

double–63个人浮点值.

常量能够在程序中安装,也得以在shader代码中经过”def”评释.这一个常量依据只读形式被shader读取.每一个寄存器能够存放四个值.

向量类型:

输入寄存器,使用前务必用语义关联,因为shader要和输入的终极缓冲中的数据对应.例子中,v0和缓冲中的地点坐标绑定在一起.

vector–4维向量,个中每三个因素都以贰个float类型值.

比方常量和输入寄存器被声称后,就足以行使操作指令来编排shader程序.

vector<标量类型,维数>–3个怀有设维数的向量,种种成分是三个标量类型的类型.


例:

寄存器

float4 fVector0;

不等的寄存器有两样的用途.输入寄存器负责给ALU提供数据.运维时的数据流从巅峰缓冲传输进输入寄存器,输入寄存器在把数量提须要ALU.顶点shader的结果写进输出寄存器,然后,结果放回渲染管线以供图元处理.

float  fVector1[4];

别的的输入寄存器包蕴常量寄存器,存款和储蓄一时半刻值的近来寄存器等.下表展现了种种输入寄存器的种类:

vector fVector2;

图片 2

vector<float,4> fVector3;

输入寄存器表.(ps: n/a表示该版本下不可用)

定义bool类型的安慕希组:

a0:二个直接寄存器,能够由此它当一个目录来寻址常量寄存器.在vs_1_第11中学,唯有a0.x能够运用,在后来的版本中负有分量都可以访问.

bool3 bVector0;

aL:三个决定最大循环次数的整形计数器.

bool  bVector1[3];

b#:容纳callnz指令的可比条件.

vector<bool,3> bVector2;

c#:浮点通用寄存器.

走访向量:(可独立通过种种成分来做客,也可使用swizzle(请查阅shaderX1顶点着色器基础部分))

i#:整形常量寄存器,控制loop指令

float4 pos = {3.0f,5.0f,2.0f,1.0f};

p0:谓词寄存器,提供按每种分量实行流控制的效劳:即,当分量的值为真时该分量才开始展览点名的操作.

float value0 = pos[0]; // value0 = 3.0f;

r#:暂时寄存器,用于存取一时半刻总计结果,与常量寄存器的不等是,该寄存器是可读可写的,常量寄存器是只读的.

float value1 = pos.x;

s#:采集样品寄存器.当纹理被采集样品时纹素的色彩被写进采集样品寄存器中.

float value2 = pos.g;  // value2 = 5.0f;

v#:输入寄存器.顶点缓冲将数据传进顶点shder中先期阐明的输入寄存器中.

float2 vec0 = pos.xy;

读端口限制者一条指令同时能读多少个寄存器.具体详细的验证能够参考SDK.一般景色下超越读端口限制会重回一条错误信息.

float2 vec1 = pos.ry;  // 无效,要么用xyzw要么用rgba。

全体装备经过caps钦定他们的特征集.每个caps都包蕴在D3DCAPS9组织中.测试caps的大约途径是利用CMyD3DApplication::ConfirmDevices方法,该格局包括在SDK的例证中.

矩阵类型:

图片 3

float4x4 view_proj_matrix;

输出寄存器类型(ps:*代表介于0和财富数量的平头)

float4x4 texture_matrix0;

在所有vs_3_0前的版本中,oD0包涵漫反射值,oD1分包镜面反射值.oPos值必须保证被写入值.

float3x4 mat0;

在vs_3_0及其后,输出寄存器整合成11个o#寄存器.每个o#寄存器能够作为像素shader插值操效能的参数.其余,输出寄存器现在亟待注脚.该评释将语义绑定给寄存器,将顶点shader的输出绑定给像素shader的输入.

matrix<float, 3, 4> mat1;

♦ 全部11个4轻重寄存器中,必须有3个声称为地方寄存器.

矩阵类型的拜访,可因此下标如:

♦ 全部寄存器使用前务必注脚.

float fValue = view_proj_matrix[0][0];

在早起的shader模型中,唯有c#寄存器能够被索引.在vs_3_0中,v#和0#也足以用a0索引.

也得以行使如下形式访问:


_m00,_m01,_m02,_m03

操作指令

_m10,_m11,_m12,_m13

一声令下决定两件事:何时数据从寄存器传到ALU;ALU要对数码开始展览什么样操作.有以下集中类型的操作指令:

_m20,_m21,_m22,_m23

■ 预设指令

_m30,_m31,_m32,_m33

■ 算数指令

或者

■ 宏操作指令

_11,_12,_13,_14

■ 纹理指令

_21,_22,_23,_24

■ 流控制指令

_31,_32,_33,_34

预设指令用于注脚shader程序版本和常量.算术指令提供数学操作.宏指令提供高档的函数功能,比如叉乘和线性插值.纹理指令用于采集样品纹理,流控制指令控制什么指令被执行.

_41,_42,_43,_44

各样版本的shder协助1个最大数额的下令槽.假设超越那么些数据,指令会失效.随着版本的提高,指令槽的最大范围数量持续在提升.下表是各版本指令槽的最大指令容纳数目:

矩阵访问也可选拔数组访问格局:

vs_1_1        128

float2x2 fMat = {3.0f, 5.0f, //行1

vs_2_0        256

                 2.0f, 1.0f};//行2

vs_2_x        256

float value0 = fMat[0];    //value0 = 3.0f 那里产生了1个截断

vs_2_sw      无限

float value1 = fMat._m00;  //value1 = 3.0f

vs_3_0        512

float value2 = fMat._12;   //value2 = 1.0f

vs_3_sw      无限

float value3 = fMat[1][1]; //value3 = 1.0f

 

float2 vec0 = fMat.21_22;  //vec0 = {2.0f, 1.0f}

预设指令:用于开首化,比如注解shader版本,定义常量,注解寄存器.

float2 vec1 = fMat[1];     //vec1 = {2.0f, 1.0f}对应value0的取值

图片 4

修饰符

算数指令:提供数学生运动算.数目较多,可查看SDK.

宏指令:组合了某些算数指令,并且通过十分规优化,提议接纳.详细可查看SDK.

不能被着色器代码改变的变量为 const
类型。row_major和col_major类型用于钦点矩阵的布局。row_major注明矩阵的每行都存款和储蓄在一个常量寄存器中(cx,查阅shaderx1),如若按列存款和储蓄则采取col_major,它是私下认可的。

纹理指令:3.0的东西,一时用不到.

积存类型修饰符

流控制指令:提供分支总结,详情查阅SDK.

跟C一样,变量可被声称为”static”也许”exter”n,那七个变量是排斥的。在全局域中,”static”标识符指明变量只可以被着色器而不可能被应用程序通过API来访问.全局域中任何非”static”类型的变量能够被应用程序通过API来修改.在局地域使用”static”表示变量包罗的数据在函数调用中维系不变.”exter”n标识符假设效果在全局域,表示该变量能够在着色器外部被API修改,全局域中变量的暗中同意类型为”extern”.”shared”修饰符表示钦命的全局域变量能够在分裂特效中国共产党享.假设对变量使用”uniform”修饰符,其值就被认为是在HLSL着色程序外设定(比如,使用Set*ShaderConstant*()函数).全局变量暗许已经宣称为”uniform”,但不富有const属性.


比如:

修饰符扩展:

extern float translucencyCoeff;

图片 5

const float gloss_bias;

修饰符不占用指令槽。

static float gloss_scale;

操作指令修饰符调整对数据的操作,_sat在多少写入到对象寄存器前把数据值夹值在0到1。前面包车型客车_pp修饰符指明允许采用低精度指令.但是有写指令不帮助_sat修饰符,比如frc和sincos,还有纹理指令,并且指标寄存器无法为o#.

float diffuse;

指标寄存器修饰符影响结果什么写入指标寄存器.尤其的,多少个写掩码控制目的写入的寄存器分量是哪些.别的,写掩码必须比照分量的顺序排列,不管有几个轻重须求写入.比如.rga和.xw是一蹴而就的掩码.没使用掩码表示多个轻重全写入.

变量translucencyCoeff和diffuse通过API设定,gloss_bias也得以通过API设定可是着色器程序无法更改.最后,gloss_scale不可能被API修改,可是能被着色器修改.

源寄存器修饰符在数码从源寄存器拷贝到ALU前修改数据.(源寄存器中的值不被改变.)源寄存器前的修饰符有负数,绝对值,绝对值后取负二种,在源寄存器后唯有模糊这一种.

类型转换

■ 负数修饰符:假若需求源数据的相反数,只须求在源寄存器前加五个”-“即可.

想要写简洁高效的着色程序,应该对HLSL的类型转换有所驾驭.上面包车型客车事例是把贰个标量增添到贰个4D向量中:

■ 相对值修饰符:保证结果是三个数的相对化值.

float4 vResult = 0.0f;// vResult = {0.0f, 0.0f, 0.0f, 0.0f};

■ 相对值后取负:先拿走相对值后对其取负.

只要从高维向低维转换,多余的数据会忽略.


混淆:控制被读取的源寄存器分量.混淆不影响源寄存器的数码,因为三个施用混淆修饰的源寄存器在命令操作前先被拷贝到贰个一时区域.

着色器输入


终端和像素着色器有两种类型的输入数据:varying和uniform.varying类型的输入注解那么些数据对每一个可进行的着色器程序是唯一的.对于极端着色器来说,varying数据(例如,地点,法向量等.)来自于极端流.uniform数据(例如,材料颜色,世界坐标系转换等)是在八个着色器执行中不变的.要是你熟知汇编形式,uniform数据是什么在常量寄存器中的数据,varying数据是如何存在于Vx恐怕Tx寄存器的数据.

顶点shader差别版本的不相同之处:

Uniform 输入

你应有利用什么版本的顶点shder?你需求静态流控制么?是或不是要协助纹理采集样品?大概你厌倦了编写制定低级的函数并且想利用较高级的宏指令来减轻工业作量并且提高质量.一般的话,尽量选拔高版本的shader,既能进步品质,又利于将你的shader转换到今后更尖端版本的shader程序.当然前提你的硬件须要接济.

HLSL中有二种办法钦命Uniform数据.一般是宣称三个大局变量.着色器中动用的别的全局变量都会造成该变量被投入到该着色器须求的uniform变量表中.第二个方法是在输入参数的评释处突显应用uniform修饰符,那同一会使该变量被添加到该着色器使用的uniform变量表中.上面是八个事例:

DirectX9接济以下多少个版本的着色器:

//声美赞臣(Meadjohnson)个大局的uniform变量

vs_1_1

//在常量表中登记为’UniformGlobal’

vs_2_0,vs_2_x,vs_2_sw

float4 UniformGlobal;

vs_3_0,vs_3_sw

//申明一(Wissu)个uniform参数

vs_1_1是最早的版本.它含有错有基本的寄存器类型:输入,输出,常量,权且和2个寻址寄存器.操作指令集带有全体骨干算术指令和差不离50%的宏指令.不协助流控制.

//在常量表中登记为’$UniformParam’

vs_2_0添加一些新的算术指令诸如:abs,crs和一部分宏操作指令如lrp,nrm,pow,sgn,sincos等.但是最大的立异是协理静态流控制指令,诸如:if-else-endif,call,loop,
rep.shader第一回能够选拔流控制决定运维分支.为了支持该功用,扩充了布尔和整形寄存器.

float4 main(uniform float4 UniformParam):POSITION

vs_2_x引入了动态流控制,诸如:break_comp,break_pred,if_comp,if_pred.断言同样被引进指令的执行.

{

vs_2_sw是纯软件版本的shader,速度相当的慢,不做过多介绍.

    return UniformGlobal*UniformParam;

vs_3_0,输出寄存器简化成一连串型的寄存器:o#.由此输出寄存器要求申明相应语义连接像素shader.vs_3_0同样匡助断言的动态流控制但不必要像_2_0那样设置caps的评释位.vs_3_0同样支持纹理采样并决定顶点流连串,使用户能够在流重置后照旧有决定能力.

}

vs_3_sw是_3_0的软件版本,非常慢,不多说了.

着色器使用的uniform变量和应用程序通过constant
table(常量表)互相交流起来.常量表是叁个符号表,它定义了在着色器执行前,uniform变量怎么着被着色器加载进常量寄存器.参数中的uniform数据在簿记时前边加了”$”是为了预防和本地方的uniform变量名字争辨.常量表蕴含全部着色器中运用的uniform数据利用的常量寄存器地址.该表也含有类型音信和默许值.常量表被编写翻译器生成并根据收缩的二进制格局存款和储蓄.在运维时表达该表的API将会在前边章节介绍.

varying 输入

varying数据用于标记输入参数,注解其颇具输入关联语义.全部高层着色器输入都无法不持有varying恐怕uniform其一的质量,不然将编写翻译战败.

输加入关贸总协定组织联表示贰个用于连接给定着色器的输入和前一阶段的渲染管线的输出的名字.比如,在终端着色器中输加入关贸总协定组织联POSITION0用于钦命顶点缓冲中的地方数据应该链接到什么地点。

  
 像素和终端着色器具有差异的输加入关贸总协定组织联语义,那取决于图形管线中差别的着色单元。顶点着色器输入语义描述从极限缓冲中加载的单顶点消息转化成能够被顶点着色器使用的花样(比如,地方,法向量,文科理科坐标,颜色,切线,二分向量等。)。那几个输入语义直接照射到D3DDECLUSAGE枚举组合中,UsageIndex用于描述顶点缓冲中的顶点成分。

  
 像素着色器输加入关贸总协定协会联描述光栅化单元提供的各样像素的信息。关联数据是近年来图元的各样终端通过终点着色器运算的输出值间的插值运算结果。基本的像素着色输入关联将颜色和纹理坐标信息链接到输入参数。

  
 有三种办法讲输加入关贸总协定组织联分配到着色器输入中,第叁个艺术是在在输入参数注明后附加”:”分号和事关名称.第两种方法是概念二个构造体.上边是多个事例:

//使用关联绑定声Bellamy个输入结构

struct InStruct

{

    float4 Pos1 : POSITION1

};

//将Pos变量申明为含有地点的多寡

float4 main(float4 Pos: POSITION0, InStruct In) : POSITION

{

    return Pos*In.Pos1;

}

//将Col变量表明为含有颜色(COLOKoleos0)插值的参数

float4 mainPS(float4 Col : COLOR0):COLOR

{

    return Col;

}

上边是终点着色器的输加入关贸总协定组织联

关联符                 描述

POSITIONn              位置

BLENDWEIGHTn           混合宽

BLENDINDICESn          混合索引

NO奔驰G级MALn                标准向量

PSIZEn                 点大小

COLORn                 颜色

TEX总老董普拉多Dn              纹理坐标

TANGENTn               切线

BINORMALn              副法线

TESSFACTO锐界n            细分因子

上边是像素着色器输加入关贸总协定组织联

关联符                 描述

COLORn                 颜色

TEX首席执行官奥迪Q7Dn              纹理坐标

(n是一个可选的整形变量.)

着色器输出

  
 顶点和像素着色器提供的数额供其后的图片管线使用.输出关联用于钦赐着色器发生的多少如何链接给下一阶段的输入.举例来说,顶点着色器的出口关联将顶点着色程序运算获得的结果链接到像素着色器的输加入关贸总协定协会联上.

  
 顶点着色器输出关联用于将着色器连接到像素着色器和光栅阶段.POSITION输出是各种终端必须输出给光栅器而不揭示给像素着色器的数量,

TEX老板索罗德Dn和COLOXC90n表示输出用于像素着色器进行插值.

  
 像素着色器输出关联将其出口颜色绑定给正确的渲染目的.颜色输出被三番五次到阿尔法混合阶段.DEPTH输出关联用于转移近日光栅化地点的对象深度值.输出涉及语义同输加入关贸总协定组织联的扬言相同.

上面是终端着色器的输出关联

关联符                描述

POSITION              位置

PSIZE                 点大小

FOG                   顶点雾

COLORn                颜色

TEX老板ENVISIONDn             纹理坐标

下边是像素着色器输出关联

关联符                描述

COLOHavaln                渲染目的n的颜料

DEPTH                 深度值

例:

//注解具有关联绑定的输出结构

struct OutStruct

{

float2 Tex2 : TEXCOORD2

};

//表明Tex为出口参数,其蕴藉文科理科坐标数据

float4 main(out float2 Tex0: TEXCOORD0, out OutStruct Out) : POSITON

{

    Tex0 = float2(1.0, 0.0);

    out.Tex2 = float2(0.1, 0.2);

    return float4(0.5, 0.5, 0.5, 1);

}

//注明包罗颜色插值的Col变量

float4 mainPS(out float4 Col1 : COLOR1) : COLOR

{

    Col1 = float4(0.0, 0.0, 0.0, 0.0);

    return float4(1.0, 0.9722, 0.3333334, 0);

}

struct PS_OUT

{

    float4 Color:COLOR;

    float4 Depth:DEPTH;

};

//三种艺术从像素着色器输出

PSOUT PSFunc1(){…}

void PSFunc2(out float4 Color:COLOR,out float Depth:DEPTH){…}

void PDFunc3(out PS_OUT Out)

{…}

多个着色器例子

float4x4 view_proj_matrix;

float4 view_position;

float4 light0;

float4 light1;

float4 light2;

struct VS_OUTPUT

{

    float4 Pos    :POSITION;

    float3 view   :TEXCOORD0;

    float3 Normal :TEXCOORD1;

    float3 Light1 :TEXCOORD2;

    float3 Light2 :TEXCOORD3;

    float3 Light3 :TEXCOORD4;

};

VS_OUTPUT main(float4 inPos:POSITION, float3 inNorm:NORMAL)

{

    VS_OUTPUT out = (VS_OUTPUT) 0;

    out.Pos = mul(view_proj_matrix, inPos);

    out.Normal = inNorm;

    out.View = normalize(view_position – inPos);

    out.Light1 = normalize(light0 – inPos);

    out.Light2 = normalize(light1 – inPos);

    out.Light3 = normalize(light2 – inPos);

    return out;

}

  
 那一个极限着色器在初阶申明多少个全局域的变量,他们都隐式的注脚为uniform,因而他们得以被API和着色器访问.接着大家看到一个VS_OUTPUT结构体,由组织体定义可见顶点着色器除了除数一个4D职分消息,还将出口四个3D纹理坐标新闻.以往来看main函数,由二个4D向量作为职责输入,一个3D向量作为法向量输入.inPos通过mul函数操作,然而inNorm并不曾被使用.最终,经过干函数运算的数码将会在多方面形中进行插值.

  
 上面笔者来开端工编织译下那几个文件.首先,我们将方面代码复制进3个文件文件视同一律命名为NPLacrosseMetallic.vhl.然后在命令行输入如下命令:

“fxc -nologo -T vs_1_1 -Fc -Vd NPRMetallic.vhl”.

      因为那些终端着色器不供给流控制,大家选择vs_1_1编写翻译目的.

出口如下:

    //

// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

//

//   fxc -nologo -T vs_1_1 -Fc -Vd j:\NPRMetallic.vhl

//

//

// Parameters:

//

//   float4 light0;

//   float4 light1;

//   float4 light2;

//   float4 view_position;

//   float4x4 view_proj_matrix;

//

//

// Registers:

//

//   Name             Reg   Size

//   —————- —– —-

//   view_proj_matrix c0       4

//   view_position    c4       1

//   light0           c5       1

//   light1           c6       1

//   light2           c7       1

//

    vs_1_1

    dcl_position v0

    dcl_normal v1

    mul r0, v0.y, c1

    mad r0, c0, v0.x, r0

    mad r0, c2, v0.z, r0

    mad oPos, c3, v0.w, r0

    add r0, -v0, c4

    dp4 r0.w, r0, r0

    rsq r0.w, r0.w

    mul oT0.xyz, r0.w, r0

    add r0, -v0, c5

    dp4 r0.w, r0, r0

    rsq r0.w, r0.w

    mul oT2.xyz, r0.w, r0

    add r0, -v0, c6

    dp4 r0.w, r0, r0

    rsq r0.w, r0.w

    mul oT3.xyz, r0.w, r0

    add r0, -v0, c7

    dp4 r0.w, r0, r0

    rsq r0.w, r0.w

    mul oT4.xyz, r0.w, r0

    mov oT1.xyz, v1

// approximately 21 instruction slots used

代码上方是极端着色器的输入参数,那个参数供给通过API来设定以使着色器符合规律工作.下边2个局地是硬件寄存器的分配.租后是汇编指令,一共21条.以往无要求伊始读到尾,但应当注意dcl_position,dcl_normal七个语句,他们意味着那main函数的四个参数.别的注意输出结果放在oPos,oT0~4那么些输出寄存器中.

明日大家要求运用终端着色器把几何体变换来剪裁空间并定义这个将会在多边形插值用用到的值.上边大家来拓展像素着色:

float4 Material;

sampler Outline;

float4 main(float3 View:TEXCOORD0, float3 Normal:TEXCOORD1, float3
Light1:TEXCOORD2, float3 Light2:TEXCOORD3,float3 Light3:TEXCOORD4):COLOR

{

    //标准化输入向量

    float3 norm = normalize(Normal);

    float4 outline = tex1D(Outline, 1 – dot(norm, normalize(View)));

    float lighting = (dot (normalize(Light1), norm)*0.5 + 0.5) +

                            (dot (normalize(Light2), norm)*0.5 + 0.5) +

                            (dot (normalize(Light3), norm)*0.5 + 0.5) ;

return outline*Material*lighting;

}

使用“fxc -nologo -T ps_2_0 -Fc -Vd NPRMetallic.phl”编译

发生的代码如下:

 

//

// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

//

//   fxc -nologo -T ps_2_0 -Fc -Vd J:\shader\NPRMetallic.phl

//

//

// Parameters:

//

//   float4 Material;

//   sampler2D Outline;

//

//

// Registers:

//

//   Name         Reg   Size

//   ———— —– —-

//   Material     c0       1

//   Outline      s0       1

//

    ps_2_0

    def c1, 1, 0.5, 0, 0

    dcl t0.xyz

    dcl t1.xyz

    dcl t2.xyz

    dcl t3.xyz

    dcl t4.xyz

    dcl_2d s0

    nrm r0.xyz, t2

    nrm r1.xyz, t1

    dp3 r1.w, r0, r1

    mad r1.w, r1.w, c1.y, c1.y

    nrm r0.xyz, t3

    dp3 r0.x, r0, r1

    mad r1.w, r0.x, c1.y, r1.w

    add r1.w, r1.w, c1.y

    nrm r0.xyz, t4

    dp3 r0.x, r0, r1

    mad r1.w, r0.x, c1.y, r1.w

    add r1.w, r1.w, c1.y

    nrm r0.xyz, t0

    dp3 r0.x, r1, r0

    add r0.xy, -r0.x, c1.x

    texld r0, r0, s0

    mul r0, r0, c0

    mul r0, r1.w, r0

    mov oC0, r0

// approximately 29 instruction slots used (1 texture, 28 arithmetic)

跟顶点着色器相同,伊始全局域的变量需求选择API来设置.

  
 在ps_2_0指令后,有3个def指令.这么些命令是汇编指令流中的肆意指令,他定义了ALU运算使用到的常数.这种常数一般是HLSL着色器中出现的字面值,比如以下代码段:

1 – dot (norm, normalize(view)

dot (nomalze(Light1), norm)*0.5 + 0.5

在常量定义之后,有多少个3d纹理坐标表明,型如dcl
tn.xyz.那几个是main函数参数的输加入关贸总协定组织联。紧接着是2个采集样品器注明:dcl_2d
s0,表明0号采集样品器绑定了一个2D纹理.texld申明纹理坐标惟有个中二个因素必要处理.

 

参考:ShaderX2.-.Introductions.and.Tutorials.with.DirectX9, Wolfgang
Engel.(2004)