我们已经知道可以使用vertex shader替换固定功能的顶点处理,pixel shader则用来替换固定功能的像素处理。多个纹理阶段串联可以完全被pixel shader所替换。specular addition,雾化以及frame buffer处理则不会受pixel shader的影响。
使用固定功能像素处理,应用程序需要为每个texture stage设置状态,并且尝试在多纹理串联的受限数据流里执行per-pixel处理。使用pixel shader,你只要写一个很小的程序,从纹理里面采样,然后组合采样值产生一个新的颜色,将这个颜色值传递到Frame buffer, 做进一步的处理。
在DirectX 9.0C里面Direct3D有几种不同的pixel shader 架构版本。我们将看看每个版本的寄存器模型,指令模型和指令集。跟vertex shader一样,pixel shader也是使用的是一组Token,每个指令一个Token。大部分应用程序不会直接构建TOKEN数组,将会使用D3DX将文本指令编译成TOKEN数组。
Pixel Shader Architecture
pixel shader的架构图
在所有的版本里面里面pixel shader的架构基本都类似,指令集和寄存器文件有所不一样。Pixel shader 必须执行两项任务:描述纹理是怎么寻址采样以及怎么组合采样值产生新的颜色值。
Pixel Shader的架构版本
各个版本feature区别列表:
Feature | 1.0 | 1.1 | 1.2 | 1.3 | Phase 1 | 1.4 | Phase 2 |
Arithmetic Instructions | 8 | 8 | 8 | 8 | 8 | 8 | |
Texture Address instructions | 4 | 4 | 4 | 4 | 6 | 6 | |
Total Instructions | 8 | 12 | 12 | 12 | 14 | 14 | |
Constant registers(cn) | 8 | 8 | 8 | 8 | 8 | ||
temporary registers(rn) | 2 | 2 | 2 | 2 | 6 | ||
texture registers(tn) | 4 | 4 | 4 | 4 | 6 | ||
color registers(vn) | 2 | 2 | 2 | 2 | 0 | 2 |
各个版本可用指令列表:
Instruction | Syntax | Meaning | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 |
add | d,s0,s1 | component addition | YES | YES | YES | YES | YES |
bem | d.rg,s0,s1 | bump enviroment map | YES | ||||
cmp | d,s0,s1,s2 | compare to 0.0 | YES | YES | YES | ||
cnd | d,s0,s1,s2 | compare to 0.5 | YES | YES | YES | YES | YES |
def | d,v0,v1,v2,v3 | constant definition | YES | YES | YES | YES | YES |
dp3 | d,s0,s1 | dot product | YES | YES | YES | YES | YES |
dp4 | d,s0,s1 | dot product | YES | YES | YES | ||
lrp | d,s0,s1,s2 | linear interpolation | YES | YES | YES | YES | YES |
mad | d,s0,s1,s2 | multiply and add | YES | YESS | YES | YES | YES |
mov | d,s | register copy | YES | YES | YES | YES | YES |
mul | d,s0,s1 | component multiply | YES | YES | YES | YES | YES |
nop | no operation | YES | YES | YES | YES | YES | |
phase | instruction phase | YES | |||||
ps | .major.minor | shader version | YES | YES | YES | YES | YES |
sub | d,s0,s1 | component subtraction | YES | YES | YES | YES | YES |
tex | d | sample texture | YES | YES | YES | YES | |
texbem | d,s | bump enviroment map | YES | YES | YES | YES | |
texbeml | d,s | bumpmap with luminance | YES | YES | YES | YES | |
texcoord | d | texture is coordinate | YES | YES | YES | YES | |
texcrd | d,s | texture is coordinate | YES | ||||
texdepth | d | compute pixel depth | YES | ||||
texdp3 | d,s | texture dot product | YES | YES | |||
texdp3tex | d,s | dot product with lookup | YES | YES | |||
texkill | s | kill source pixel< |