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. Django操作数据库

    引入models的定义 from app.models import  myclass class  myclass():      aa =  models. CharField (max_leng ...

  2. 一步步学习ASP.NET MVC3 (2)——入门程序

    请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...

  3. 敏捷开发概述与路线(转自MBAlib)

    敏捷开发的概述 简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项 ...

  4. asp.net gridview 绑定图片字段,图片不显示

    在浏览器中查看,图片属性. 右键查看,若后面出现若干%20 可使用以下办法解决. 备份表数据,然后删除表,把图片路径字符串在数据库中应使用varchar()类型. 原因可以查看vchar()  var ...

  5. [JavaScript] 用html5 js实现浏览器全屏

    项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的 效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以 让页面中的图片,视频等全屏目前只有g ...

  6. JS数据类型&&typeof&&其他

    1. 5种基本数据类型: 1. String 2. Number 3. Boolean 4. Undefined 5. Null 2. 1种复杂数据类型:Object 3. 检测变量的数据类型:typ ...

  7. JAVA File常用的API介绍

    package coreJava; import java.io.File; import java.io.IOException; public class FileDemo { public st ...

  8. iOS 并发:NSOperation 与调度队列入门(1)

    一直以来,并发都被视为 iOS 开发中的「洪水猛兽」.许多开发者都将其视为危险地带,唯恐避之而不及.更有谣传认为,多线程代码应该尽力避免.笔者同意,如果你对并发的了解不够深入,就容易造成危险.但是,危 ...

  9. grab jpegs from v4l2 devices

    某些平台下opencv不能直接直接支持摄像头获取图片或视频,这是需要使用v4l2(video for linux 2) 测试v4l2是否可以读到摄像头的内容,最简单的办法就是读取一张截图. v4l2g ...

  10. Asynchronously with NSURLConnection

    NSString *urlAsString=@"http://www.apple.com"; NSURL *url=[NSURL URLWithString:urlAsString ...