ps部分

ps_1_1,ps_1_2,ps_1_3,ps_1_4

总览

               
  Instruction Set            
               
  版本   指令槽 1_1 1_2 1_3 1_4
  ps 版本号 0 x x x x
  常数指令     1_1 1_2 1_3 1_4
  def - ps 定义常数 0 x x x x
  相位指令     1_1 1_2 1_3 1_4
  phase - ps 在相位1与相位2之间转换 0       x
  算法指令     1_1 1_2 1_3 1_4
  add - ps 两个向量相加 1 x x x x
  bem - ps 使用一个假的 bump environment-map 变换 2       x
  cmp - ps 以0为比较赋值   x x x
  cnd - ps 以0.5为比较赋值 1 x x x x
  dp3 - ps 三个分量点积 1 x x x x
  dp4 - ps 四个分量点积   x x x
  lrp - ps 线性插值 1 x x x x
  mad - ps 每个分量乘完了加 1 x x x x
  mov - ps 赋值 1 x x x x
  mul - ps 乘法 1 x x x x
  nop - ps 无运算 0 x x x x
  sub - ps 减法 1 x x x x
  图片指令     1_1 1_2 1_3 1_4
  tex - ps 对图片采样 1 x x x  
  texbem - ps 使用一个假的 bump environment-map 变换 1 x x x  
  texbeml - ps 使用一个经过亮度校正的假的 bump environment-map 变换 1+1² x x x  
  texcoord - ps 返回图片坐标为颜色 1 x x x  
  texcrd - ps 复制图片坐标为颜色 1       x
  texdepth - ps 计算深度值 1       x
  texdp3 - ps 贴图数据与贴图坐标之间的三个分量的点积 1   x x  
  texdp3tex - ps 三个分量点积并且查找1D图片 1   x x  
  texkill - ps 基于一个比较来取消像素的渲染 1 x x x x
  texld - ps_1_4 对图片采样 1       x
  texm3x2depth - ps 逐像素计算深度值用于深度测试 1     x  
  texm3x2pad - ps First row matrix multiply of a two-row matrix multiply 1 x x x  
  texm3x2tex - ps 最后一行与一个二行矩阵进行矩阵乘法 1 x x x  
  texm3x3 - ps 3x3矩阵相乘 1   x x  
  texm3x3pad - ps 第一行或者第二行与一个三行矩阵进行矩阵乘法,需要与 texm3x3 - ps, texm3x3spec - ps, texm3x3vspec - ps, 或 texm3x3tex - ps结合使用 1 x x x  
  texm3x3spec - ps 最后一行与一个三行矩阵进行矩阵乘法使用计算结果进行图片查找,可以用于镜面反射与环境贴图 1 x x x  
  texm3x3tex - ps 通过3x3 矩阵乘积的结果来查找图片 1 x x x  
  texm3x3vspec - ps 用一个3x3矩阵乘法的计算结果作为法向量,与一个非常量的视线方向向量进行图片查找,可以用于镜面反射与环境贴图 1 x x x  
  texreg2ar - ps 通过r和a通道作为uv来采样图片 1 x x x  
  texreg2gb - ps 通过g和b通道作为uv来采样图片 1 x x x  
  texreg2rgb - ps 通过r、g和b通道来采样图片 1   x x  
               

部分函数细节

bem

语法

bem dst.rg, src0, src1

算法

(Given n == dest register #)

dest.r = src0.r + D3DTSS_BUMPENVMAT00(stage n) * src1.r

+D3DTSS_BUMPENVMAT10(stage n) * src1.g

dest.g = src0.g + D3DTSS_BUMPENVMAT01(stage n) * src1.r

+D3DTSS_BUMPENVMAT11(stage n) * src1.g

cmp

语法

cmp dst, src0, src1, src2

如果src0>=0返回src1否则src2

算法

ps_1_4
def c0, -0.6, 0.6, 0, 0.6
def c1  0,0,0,0
def c2  1,1,1,1
 
mov r1, c1
mov r2, c2
 
cmp r0, c0, r1, r2   // r0 is assigned 1,0,0,0 based on the following:
 
// r0.x = c2.x because c0.x < 0
// r0.y = c1.y because c0.y >= 0
// r0.z = c1.z because c0.z >= 0
// r0.w = c1.w because c0.w >= 0

cnd

语法

cmp dst, src0, src1, src2

如果src0>0.5 返回src1否则src2

算法

在1_1到1_3版本,src0必须为r0.a(单通道)

// Version 1_1 to 1_3
if (r0.a > 0.5)
  dest = src1
else
  dest = src2
在1_4版本就可以每个通道分别比较值
for each component in src0
{
   if (src0.component > 0.5)
     dest.component = src1.component
   else
     dest.component = src2.component
}

示例

 
ps_1_4
def c0, -0.5, 0.5, 0, 0.6
def c1,  0,0,0,0
def c2,  1,1,1,1
 
cnd r1, c0, c1, c2   // r0 contains 1,1,1,0 because
// r1.x = c2.x because c0.x <= 0.5
// r1.y = c2.y because c0.y <= 0.5
// r1.z = c2.z because c0.z <= 0.5
// r1.w = c1.w because c0.w >  0.5

dp3

语法

dp3 dst, src0, src1

计算三个分量的点积

算法

dest.x = dest.y = dest.z = dest.w = 
  (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z);

dp4

语法

dp4 dst, src0, src1

计算四个分量的点积

算法

dest.x = dest.y = dest.z = dest.w = 
    (src0.x * src1.x) + (src0.y * src1.y) + 
    (src0.z * src1.z) + (src0.w * src1.w);
 

lrp

语法

lrp dst, src0, src1, src2

基于src0对src1与src2做线性插值运算

算法

dest = src0 * src1 + (1-src0) * src2
// which is the same as
dest = src2 + src0 * (src1 - src2)

mad

语法

mad dst, src0, src1, src2

做(src0 * src1) + src2处理

算法

dest.x = src0.x * src1.x + src2.x;
dest.y = src0.y * src1.y + src2.y;
dest.z = src0.z * src1.z + src2.z;
dest.w = src0.w * src1.w + src2.w;

mov

语法

mov dst, src

转移值处理

mul

语法

mul dst, src0, src1

乘法

算法

dest.x = src0.x * src1.x;
dest.y = src0.y * src1.y;
dest.z = src0.z * src1.z;
dest.w = src0.w * src1.w;

nop

语法

nop

执行无运算

sub

语法

sub dst, src0, src1

减法运算

算法

dest = src0 - src1

vs部分

vs1

总览

  Instruction Set            
               
  Name Description Instruction slots Setup Arithmetic New  
  add - vs 两个向量加法运算 1   x x  
  dcl_usage input (sm1, sm2, sm3 - vs asm) 声明输入向量寄存器 (see Registers - vs_1_1) 0 x   x  
  def - vs 定义常量 0 x   x  
  dp3 - vs 三个分量的点积运算 1   x x  
  dp4 - vs 四个分量的点积运算 1   x x  
  dst - vs 计算距离向量 1   x x  
  exp - vs 全精度的2的x次方计算 10   x x  
  exp - vs 半精度的2的x次方计算 1   x x  
  frc - vs 小数部分 3   x x  
  lit - vs 局部光计算 1   x x  
  log - vs 全精度的 log₂(x)计算 10   x x  
  logp - vs 半精度的 log₂(x)计算 1   x x  
  m3x2 - vs 3x2 乘法 2   x x  
  m3x3 - vs 3x3 乘法 3   x x  
  m3x4 - vs 3x4 乘法 4   x x  
  m4x3 - vs 4x3 乘法 3   x x  
  m4x4 - vs 4x4 乘法 4   x x  
  mad - vs 每个分量乘完了加 1   x x  
  max - vs 求最大值 1   x x  
  min - vs 求最小值 1   x x  
  mov - vs 赋值 1   x x  
  mul - vs 乘法 1   x x  
  nop - vs 无运算 1   x x  
  rcp - vs 倒数 1   x x  
  rsq - vs 平方根之后的倒数 1   x x  
  sge - vs 大于或等于比较,返回1或0 1   x x  
  slt - vs 小于比较,返回1或0 1   x x  
  sub - vs 减法 1   x x  
  vs 版本 0 x   x  
               

部分函数细节

dst

语法

dst dest, src0, src1

计算距离向量

src0为(ignored, d*d, d*d,ignored)

src1为(ignored, 1/d,ignored, 1/d)

最终得到的结果为(1, d, d*d, 1/d)

算法

dest.x = 1;

dest.y = src0.y * src1.y;

dest.z = src0.z;

dest.w = src1.w;

exp

语法

exp dst, src

算法

dest.x = dest.y = dest.z = dest.w = (float)pow(2, src.replicateSwizzleComponent);

frc

语法

frc dst, 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);

lit

语法

lit dst, src

src的各部分为

src.x = N*L        ; The dot product between normal and direction to light
src.y = N*H        ; The dot product between normal and half vector
src.z = ignored    ; This value is ignored
src.w = exponent   ; The value must be between -128.0 and 128.0

算法

dest.x = 1;
dest.y = 0;
dest.z = 0;
dest.w = 1;
 
float power = src.w;
const float MAXPOWER = 127.9961f;
if (power < -MAXPOWER)
    power = -MAXPOWER;          // Fits into 8.8 fixed point format
else if (power > MAXPOWER)
    power = MAXPOWER;          // Fits into 8.8 fixed point format
 
if (src.x > 0)
{
    dest.y = src.x;//diffuse
    if (src.y > 0)
    {
        // Allowed approximation is EXP(power * LOG(src.y))
        dest.z = (float)(pow(src.y, power));//specular
    }
}

log

语法

log dst, src

算法

float v = abs(src);
if (v != 0)
{
    dest.x = dest.y = dest.z = dest.w = 
        (float)(log(v)/log(2));  
}
else
{
    dest.x = dest.y = dest.z = dest.w = -FLT_MAX;
}

logp

语法

logp dst, src

算法

float f = abs(src);
if (f != 0)
    dest.x = dest.y = dest.z = dest.w = (float)(log(f)/log(2));
else
    dest.x = dest.y = dest.z = dest.w = -FLT_MAX;   

m3x2

语法

m3x2 dst, src0, src1

算法

dest.x = (src0.x * src1.x) + (src0.x * src1.y) + (src0.x * src1.z);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z);

m3x3

语法

m3x3 dst,src0, src1

算法

dest.x = (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z);
dest.z = (src0.x * src3.x) + (src0.y * src3.y) + (src0.z * src3.z);

m3x4

语法

m3x4 dst, src0, src1

算法

dest.x = (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z);
dest.z = (src0.x * src3.x) + (src0.y * src3.y) + (src0.z * src3.z);
dest.w = (src0.x * src4.x) + (src0.y * src4.y) + (src0.z * src4.z);

m4x3

语法

m4x3dst, src0, src1

算法

 
dest.x = (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + (src0.w * src1.w);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z) + (src0.w * src2.w);
dest.z = (src0.x * src3.x) + (src0.y * src3.y) + (src0.z * src3.z) + (src0.w * src3.w);

m4x4

语法

m4x4 dst, src0, src1

算法

dest.x = (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + 
               (src0.w * src1.w);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z) + 
               (src0.w * src2.w);
dest.z = (src0.x * src3.x) + (src0.y * src3.y) + (src0.z * src3.z) + 
               (src0.w * src3.w);
dest.w = (src0.x * src4.x) + (src0.y * src4.y) + (src0.z * src4.z) + 
               (src0.w * src4.w);

max

语法

max dst, src0, src1

算法

dest.x=(src0.x >= src1.x) ? src0.x : src1.x;
dest.y=(src0.y >= src1.y) ? src0.y : src1.y;
dest.z=(src0.z >= src1.z) ? src0.z : src1.z;
dest.w=(src0.w >= src1.w) ? src0.w : src1.w;

min

语法

min dst, src0, src1

算法

dest.x=(src0.x < src1.x) ? src0.x : src1.x;
dest.y=(src0.y < src1.y) ? src0.y : src1.y;
dest.z=(src0.z < src1.z) ? src0.z : src1.z;
dest.w=(src0.w < src1.w) ? src0.w : src1.w;

rcp

语法

rcp dst, src

算法

float f = src0;
if(f == 0.0f)
{
    f = FLT_MAX;
}
else 
{
    if(f != 1.0)
    {
        f = 1/f;
    }
}
 
dest = f;

rsq

语法

rsq dst, src

算法

float f = abs(src0);
if (f == 0)
    f = FLT_MAX
else
{
    if (f != 1.0)
        f = 1.0/(float)sqrt(f);
}
 
dest.z = dest.y = dest.z = dest.w = f;

sge

语法

sge dst, src0, src1

src0大于等于 src1返回1否则为0

算法

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

语法

slt dst, src0, src1

src0小于 src1返回1否则为0

算法

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;

库: https://msdn.microsoft.com/en-us/library/bb219840(v=vs.85).aspx

--wolf96 2017/1/1

Asm Shader Reference --- Shader Model 1 part的更多相关文章

  1. Asm Shader Reference --- Shader Model 2.x part

    ps部分 概览   Instruction Set                                       Name Description Instruction slots S ...

  2. Asm Shader Reference --- Shader Model 2.0 part

    ps部分 ps_2_0 概览   Instruction Set                                   Name Description Instruction slot ...

  3. Asm Shader Reference --- Shader Model 3.0 part

    ps部分 概览   Instruction Set                                       Name Description Instruction slots S ...

  4. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  5. Create a Basic Shader in Shader Forge

    [Create a Basic Shader in Shader Forge] 1.打开ShaderForge.Window-> Shader Forge.(打开速度较慢) 2.通过NewSha ...

  6. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  7. UnityShader之固定管线Fixed Function Shader【Shader资料3】

    Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或 ...

  8. 【Unity Shader】Shader基础

    目录 Chapter3 Unity Shader 基础 Chapter3 Unity Shader 基础 概述 在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效 ...

  9. Unity5中新的Shader体系简析

    一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...

随机推荐

  1. 关于Active控件的电子签名 转

    关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...

  2. 51nod贪心算法入门-----独木舟问题

    独木舟问题 n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 分析:按照 ...

  3. fsockopen

    fsockopen — 打开一个网络连接或者一个Unix套接字连接 说明 resource fsockopen ( string $hostname [, int $port = -1 [, int  ...

  4. 说说对C语言指针的理解

    指针困扰了一些学习编程的人,或许你的老师会告诉你,指针比较难理解. 我当时被老师的话唬住所以学习指针那章的时候都没心情听课.(说得像讲别的内容时我听了似的,开玩笑) 导致了学习链表的时候各种卧槽. * ...

  5. TypeScript学习指南--目录索引

    关于TypeScript: TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程. TypeS ...

  6. appcache checking update

    <!DOCTYPE html> <html manifest="a.appcache"> <head> <title></ti ...

  7. 用原生JavaScript实现图片瀑布流的浏览效果

    学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...

  8. python 常用模块(转载)

    转载地址:http://codeweblog.com/python-%e5%b8%b8%e7%94%a8%e6%a8%a1%e5%9d%97/ adodb:我们领导推荐的数据库连接组件bsddb3:B ...

  9. ubuntu下的文本查看相关命令

    文本查看 1.cat命令(查看文本内容) 使用时三种常用模式 (1)cat 文本名 直接查看文本内容 (2)cat 文本名 -n 直接查看文本内容,但为文本中所有行编号 (3)cat 文本名 -b 直 ...

  10. 随机产生字母a--z, A-Z 的任意组合

    VERSION 1.0    引自: http://www.coderanch.com/t/134491/Security/generating-secure-tokens package demo; ...