GPU编程笔记(2)

 

2009-02-02 19:52

高级渲染语言基础

1:HLSL语法与C语法非常类似。
2:数据类型:bool   int (32位signed)    half(16位float)   float(32位float)   double(64位float)
3:变量声明:与C一样
4:类型修饰:可以使用const,与C++ 一样
                        row_major    行主序 col_major列主序
5:寄存器修饰符:static   extern
       uniform :只能使用API方法来改变它,并且它只在两次绘制间被改变.全局变量和输入的参数都可以定义成uniform,表示在shader执行期间值不变
       shared : 修饰全局Shader变量表明它在不同的效果中被共享。当一个变量被多个shader使用的时候,就使用shared来修饰,这样更新变量的时候,所有shader都会被更新.
HLSL中所有的变量都是值传递,不允许用指针或者引用传递。
6:向量:
(1) bool3 bVector ; float2   bVector={0.2,0.6};
(2)vector<float ,3> dVector={1.0, 23.3,3.5};在括号中指明类型和元素数  
(3)一个向量最多4个元素,每个都可以有两种命名集合来寻址。位置集合{x,y,z,w}颜色集合{r,g,b,a}
float4 pos=float4(0,0,2,1); pos.z=pos.b=2
可以一次读取多个元素,但命名集合不能混合使用。
float2 temp;  
temp=pos.rg :
temp=pos.xy:
(4)混合读取:
float4 pos=float4(0,0,2,1):
float2 f_2D :
float4 f_4D;
f_2D=pos.xy;
f_2D=pos.xx;
f_2D=pos.yx;
f_4D=pos:
f_4D.xz=pos.xz;
f_4D.zx=pos.xz:
f_4D.xzyw=pos.w;
7:矩阵:
float2*2 fMatrix={0.1f,0.4,3.0,2.0}
matrix<float,2,2>   fMatrix={0.1f,0.4,3.0,2.0}
这种基准:_m00   _11,支持混合读取,不能混合使用。
tempMatrix._m00_m11=worldMatrix._m13_m23;
fMatrix[0][0]支持数组读取。此法不能一次读取两个。
指定存放方式: #pragma   pack_matrix(row_major)
                    #pragma   pack_matrix(row_major)
                    列主序比行主序效率高。
float3*3 mat1, mat2;
float3*3 mat3=mat1*mat2; 逐个元素相乘
mat3=pos(mat1,mat2)矩阵向量间相乘。
8复杂数据类型:
(1)采样器:
     采样器包含采样状态。采样状态指定采样纹理,并控制纹理采样期间的纹理过滤。采样一幅纹理需要一幅纹理,一个采样器(带有采样状态),一个采样指令。
采样器可以在定义的同时初始化其纹理和采样状态,如下:
texture tex0;
sampler2D   s_2D=sampler_state
{
Texture=<tex0> ;
MinFilter=Linear://缩小过滤器过滤方式
MagFilter=Linear;//放大过滤器过滤方式
AddressU=Wrap;//U方向寻址方式
AddressV=Wrap;//V方向寻址方式
}
以上定义的是线性纹理过滤,自动重复纹理寻址方式
以下使用上面的纹理采样器s_2D采样一幅2D纹理:
//输入一个二元浮点数坐标,返回数据包含两个元素的色彩值r.g.
float2 sample_2D(float2 tex:TEXCOORD0):COLOR
{
return tex2D(s_2D,tex);
}
如果没有指定纹理采样状态,默认为线性过滤,重复寻址。
HLSL支持4种采样类型 sampler1D,sampler2D,sampler3D,samplerCUBE,
对应采样函数为tex1D,tex2D,tex3D tex1DCUBE。
(2)结构体:structure
成员不可以有初始化函数或者注释。不可以使用带范围的关键字static extern const,volatile
(3)字符串
在HLSL中,没有操作符接收字符串,但是,字符串参数和注释可以通过接口ID3DXEffect访问到。
(4)顶点渲染对象
顶点渲染对象:vertexshader,可以在汇编语言的顶点渲染被编译以后被赋值。也可以在HLSL顶点渲染之后赋值。
//HLSL
vertexshader vs=compile vs_2_0 vsmain() ;
//asm
vertexshader vs=
asm
{
vs_2_0
dcl_position v0
mov opos , v0
};
(5)像素渲染对象
pixelshader:可以在汇编语言的像素渲染被编译以后被赋值。也可以在HLSL像素渲染之后赋值。
//HLSL
pixelshader ps=compile ps_2_0 psmain();
//asm
pixelshader ps=
asm
{
ps_2_0
mov oc0 ,c0
};
(6)纹理
texture用于在效果中设置一个纹理到设备
texture tex0<string name="tiger.bmp";>;
texture tex0为声明,后面的为注释,注释是用户提供给效果使用的信息,被HLSL忽略。
9:表达式与运算符
%操作符当两边都是正数,或者都是负数时有定义,同时两边都是浮点数时也有定义,这与C不同。
投射:
提升投射:
float4   v ;
float f;
v=1;//v的四个元素都置成1
v=f;//v的四个元素都置成f
下降投射:
float4 c;
float3 a,b;
a=b*c;//c被转化为float3
10:语句与C相同
11:函数
(1)格式说明
float4    Light(float3 LightDir : TEXCOORD1 ,   uniform float4 LightColor,
                    float2 texcrd   : TEXCOORD0,     uniform   sampler   samp):COLOR
TEXCOORD0 ,TEXCOORD1是参数的语义,纹理为TEXCOORD0 ,其余未定义。
用uniform声明的常量不会在绘制期间发生改变。这些参数来源于渲染器全局变量。
COLOR为输出语义。
函数声明后还可以有注释
参数还可以用inout in out 标示当前参数是输入还是输出。
(2)顶点渲染器语义
(3)像素渲染器语义
(4)显示寄存器绑定
编译器会自动赋值寄存器到全局变量中,同样也可以把某些变量绑定到寄存器中。
sampler   Environment;
float4 k_S;
对于这3个全局变量,编译器会自动赋予Environment到采样寄存器中,把k_S赋值到常量寄存器中。为了强制编译器赋值到一个特殊的寄存器,可以使用register()语法
sampler   Environment :register(s1);
float4 k_S: register(cl2);
(5)内部函数
数学函数和采样函数,2006.4版本提供了80多个内部函数。
(6)构造函数
float3   upVector=float3(0,1,3);
12段落:
VertexFragment (PixelFragment) +段落名称+compile fragment+渲染器编译目标+渲染器函数名称
13:HLSL渲染的基本步骤:
编写渲染代码---检查硬件设备---编译渲染代码---创建渲染器---设置渲染器全局变量---使用渲染器
14:渲染器编译与调试
通过SDK提供4种工具编译:
fxc.exe               编译HLSL渲染器             flink.exe     联接HLSLw段落
vsa.exe             编译汇编顶点渲染器       psa.exe      编译汇编像素渲染器
4个工具位于sdk目录/Utilities/Bin/x86文件夹下
语法:   tool   [switches]   filename

15:渲染器后缀名vsh,psh, fx 分别表示顶点渲染哭文件,像素渲染器文件,混合渲染器文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值