ASM顶点渲染指令

abs dest, src 对src向量求绝对值并存入dest中
add dest, src0, src1 将src0向量+src1向量并存入dest中
call label 调用label标识的子程序
callnz label, booleanRegister 即if( booleanRegister ) { 调用label标识的子程序 }
crs dest, src0, src1 将向量src0与向量src1进行叉积并存入dest中,dest.x = src0,ysrc1.z - src0.zsrc1.y; dest.y = src0,zsrc1.x - src0.xsrc1.z; dest.z = src0,xsrc1.y - src0.ysrc1.x;
def dest, value 定义寄存器常量存入dest中,必须位于渲染指令的起始处
defb dest, booleanValue 定义一个bool常量存入dest中
defi dest, integerValue 定义一个int常量存入dest中
dp3 dest, src0, src1 三维向量点乘,将向量src0与向量src1点乘并存入向量dest中,dest.x = dest.y = dest.z = dest.w = (src0.xsrc1.x) + (src0.ysrc1.y) + (src0.zsrc1.z);
dp4 dest, src0, src1 四维向量点乘,将向量src0与向量src1点乘并存入向量dest中,dest.w = (src0.x
src1.x) + (src0.ysrc1.y) + (src0.zsrc1.z) + (src0.wsrc1.w); dest.x = dest.y = dest.z = unused;
dst dest, src0, src1 即dest.x = 1; dest.y = src0.y * src1.y; dest.z = src0.x; dest.w = src1.w;
if…else…endif 不用解释了吧。。
loop aL, integerRegister 程序流程循环控制指令,与endloop成对出现。aL为程序循环控制器,integerRegister为存放输入的循环条件的寄存器。循环计数器最大值为integerRegister.x,循环计数器初始值为integerRegister.y,循环计数器增量为integerRegister.z
endloop 参见loop
rep integerRegister 循环控制指令,与endrep成对出现,integerRegister为存放输入的循环条件的寄存器,integerRegister.x指明循环此时。
endrep 参见rep
exp dest, src 计算指数,dest.x = dest.y = dest.z = dest.w = (float)pow(2, src0,w);
expp dest. src float w = src.w; float v = (float)floor(src.w); dest.x = (float)pow(2, v); dest.y = w-v; float tmp = (float)pow(2, v); DWORD tmpd =
(DOWORD)&tmp & 0xffffff00; dest.z = (float)&tmpd; dest.w = 1;
frc dest. src 计算小数部分,dest.x = src.x - (float)floor(src.x); dest.y = src.y - (float)floor(src.y); dest.z = src.z - (float)floor(src.z); dest.w = src.w - (float)floor(src.w);
label l(n) 子程序标识符(对下一句指令),l(n)为制定的标识符,n是从0~15的整数
lit dest, src 计算光照指令,比较复杂,可参考相关文献
log dest, src 计算对数,dest.x = dest.y = dest.z = dest.w = log2(x);
logp dest, src dest.x = dest.y = dest.z = dest.w = log2(x); 局部精度
lrp dest, src0, src1, src2 对向量src1和向量src2使用向量src0进行线性插值,结果存入dest,dest.x = src0.x
(src1.x-src2.x)+src2.x; dest.y = src0.y*(src1.y-src2.y)+src2.y; dest.z = src0.z*(src1.z-src2.z)+src2.z; dest.w = src0.w*(src1.w-src2.w)+src2.w;
m32 dest, src0, src1 向量与矩阵相乘,dest = src0src1; src1为23矩阵
m3
3 dest, src0, src1 向量与矩阵相乘,dest = src0src1; src1为33矩阵
m34 dest, src0, src1 向量与矩阵相乘,dest = src0src1; src1为43矩阵
m4
3 dest, src0, src1 向量与矩阵相乘,dest = src0src1; src1为34矩阵
m44 dest, src0, src1 向量与矩阵相乘,dest = src0src1; src1为44矩阵
mad dest, src0, src1, src2 向量相乘并相加,dest.x = src0.x
src1.x+src2.x; dest.y = src0.ysrc1.y+src2.y; dest.z = src0.zsrc1.z+src2.z; dest.w = src0.w*src1.w+src2.w;
max dest, src0, src1 求最大值,dext.x = (src0.x>=src1.x) ? src0.x : src1.x; dext.y = (src0.y>=src1.y) ? src0.y : src1.y; dext.z = (src0.z>=src1.z) ? src0.z : src1.z; dext.w = (src0.w>=src1.w) ? src0.w : src1.w;
min dest, src0, src1 求最小值,可见max
mov dest, src 寄存器赋值指令:如果dest是一个整数寄存器,则src.w取整后赋值给dest,否则dest = src
mova a0, src 将浮点寄存器src的值取整后赋值给地址寄存器a0
mul dest, src0, src1 将向量src0与向量src1相乘并存入dest中
Nop 空指令
nrm dest, src 单位化向量src并存入dest中
pow dest, src0[.x/.y/.z/.w], src1[.x/.y/.z/.w] 求指数 dest = abs((src0)src1次方),src0和src1必须指定一个元素x或y或z或w
rcp dest, src[.x/.y/.z/.w] 求倒数,dest = 1/src.x或dest = 1/src.y或dest = 1/src.z或dest = 1/src.w
rsq dest, src 求平方根的倒数,dest = 1/sqrt(src.x)或dest = 1/sqrt(src.y)或dest = 1/sqrt(src.z)或dest = 1/sqrt(src.w)
sge dest, src0, src1 比较src0是否大于src1,dest.x = (src0.x>=src1.x) ? 1.0f : 0.0f; dest.y = (src0.y>=src1.y) ? 1.0f : 0.0f; dest.z = (src0.z>=src1.z) ? 1.0f : 0.0f; dest.w = (src0.w>=src1.w) ? 1.0f : 0.0f;
slt dest, src0, src1 比较src0是否小于src1,见sge
sgn dest, src0, src1 计算src0的符号:
for each component in src0
{
if( src0.component < 0 )
dest.component = -1;
else
if( src0.component == 0 )
dest.component = 0;
else
dest.component = 1;
}
注意:这里的src0和src1为临时寄存器
sincos dest[.x/.y/.xy], src0[.x/.y/.z/.w], src1, src2 求sin和cos值,dest必须是一个临时寄存器,src1和src2必须是常量寄存器
sub dest, src0, src1 将向量src0减去向量src1并存入dest中

猜你喜欢

转载自blog.csdn.net/qq_31042143/article/details/113772309