TA百人计划学习笔记 HLSL常用函数

  • HLSL是什么
    • 高级着色器语言(即 HLSL,缩写自High Level Shader Language或High-Level Shading Language),是由微软拥有及开发的一种着色器语言
  • 相关查询
  • 目录
  • 基本数学运算
    • max(a,b)
      • 返回较大的
    • min(a,b)
      • 返回较小的
    • mul(a,b)
      • 两向量相乘,常用于矩阵运算
    • abs(a)
      • 返回a的绝对值
    • round(x)
      • 返回与x最近的整数
    • sqrt(x)
      • 返回x的平方根
    • rsqrt(x)
      • 返回x的平方根的倒数
    • degrees(x)
      • 将弧度转化为角度
    • redians(x)
      • 将角度转化为弧度
    • noise(x)
      • 定义
        • 噪声函数
          • 将uv的坐标作为x传入,随机的返回一个[0,1]的值
      • 举例
  • 幂指对函数与偏导数
    • pow(x,y)
      • x的y次幂(x、y都可以是自变量或具体数)
    • exp(x)
      • 返回以e为底的指数函数
    • exp2(value x)
      • 返回以2为底,x为指数的幂
    • ldexp(x,exp)
      • 返回与2的exp次方的乘积
    • log(x)
      • 返回指定值的以e为底数的对数
    • log10(x)
      • 求以10为底的对数
    • log2(x)
      • 求以2为底数的对数
    • frexp(x,out exp)
      • 把浮点数分解为尾数和指数,x的返回值是尾数(x=ret*2^exp),exp参数返回的是指数
      • 是按照计算机存储浮点数的方式分解的
        • eg:1.2这个数,是分为两部分的,尾数为12,指数为0.1
        • out关键字:exp也会作为一个返回值传出,也就是说这个函数有两个返回值。
        • 如果x参数为0,则此函数的尾数和指数均返回0
  • 三角函数和双曲线函数
    • sin(x)、cos(x)、tan(x)
      • 三角函数(弧度制:1°=π/180 rad)
    • asin(x)、acos(x)、atan(x)
      • 反三角函数
    • sincos(x,out s,out c)
      • 返回x的正弦和余弦
    • tan(y,x)
      • 返回y/x的正切
    • atan2(y,x)
      • 返回y/x的反正切
  • 数据范围类
    • ceil(x)
      • 返回>=x的最小整数(向上取整)
    • floor(x)
      • 返回<=x的最大整数(向下取整)
    • step(x,y)
      • x<=y返回1(真),否则返回0
    • saturate(x)
      • 返回将x钳制到[0,1]范围之间的值
    • clamp(x,min,max)
      • 将x限制在[min,max]范围的值,比min小返回min,比max大返回max
    • fmod(x,y)
      • 返回x对y取余的余数
    • frac(x)
      • 取x的小数部分
    • modf(x,out ip)
      • 将x分为小数和整数部分(输出的ip为整数部分,返回值为小数部分)
    • lerp(x,y,s)
      • 按照s在x到y之间插值,返回
    • smoothstep(min,max,x)
      • 如果x在[min,max]范围内,就返回介于[0,1]之间的平滑Hermite插值,使用smoothstep在两个值直接创建平滑过渡
      • eg,平滑地混合两种颜色
  • 类型判断类
    • all(x)
      • 确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false(处理由浮点型、整型、布尔型数据定义的标量、向量或者矩阵)
    • clip(x)
      • 如果输入值小于零,则丢弃当前像素 常用于判定范围(不仅仅针对0,返回值为void)
      • 常用于Alpha Test,如果每个分量代表到平面的距离,还可以用来模拟剪切平面
    • sign(x)
      • 返回x的正负性
        • 如果x小于零返回-1
        • 如果x等于零返回0
        • 如果x大于零返回1
    • isinf(x)
      • 如果x参数为+ ∞或-∞(无穷+无穷仍无穷,0x3f3f3f3f),返回true,否则返回False
    • isfinite(x)
      • 判断x参数是有限,即有界的,与isinf(x)相反
    • isnan(x)
      • 如果x参数为NAN(非数字),返回true,否则返回false
  • 向量和矩阵类
    • length(v)
      • 返回向量的长度
    • normalize(v)
      • 向量归一化,x/length(x) 方向向量归一化
    • distance(a,b)
      • 返回两个向量之间的距离,不平行的两个向量应该为0,此处表示为根号下各分量之差的平方和
    • dot(a,b)
      • 点积
      • a 在 b 上的投影长,a·b = |a|·|b|·cos0
    • cross(a,b)
      • 叉积/矢积/向量积
      • 返回值是个向量,而且与 a、b 都垂直,大小上 |a x b| = |a| * |b| * sin0
    • determinant(m)
      • 返回指定浮点矩阵的按行列式方式计算的值
    • transpose(m)
      • 返回矩阵m的转置矩阵
  • 光线运算类
    • reflect(i,n)
      • 以i为入射向量n为法线方向的反射光
    • refract(i,n,ri)
      • 以i为入射向量n为法线方向,ri为折射率的折射光
    • lit(n_dot_l,n_dot_h,m)
      • 输入标量(normal,light,半角向量h,镜面反射系数m)
      • 返回光照向量(环境光,漫反射光,镜面高光反射,1)
    • faceforward(n,i,ng)
      • 得到面向视图方向的曲面法向量输入输出为同元向量,返回-n*sign(dot(i,ng))(normal,light,normal)
  • 纹理查找
    • 定义
      • 纹理查找就是GPU在片元处理阶段中在屏幕空间的XY坐标系中对每一个像素对应的纹理查找对应的纹素来确定像素的颜色;
    • 分类
      • 1D纹理查找(几乎不用)
        • tex1D(s, t)
          • 普通一维纹理查找 返回纹理采样器s在标量t位置的color4
        • tex1D(s,t,ddx,ddy)
          • 使用微分查询一维纹理, t和ddxy均为vector
        • tex1Dlod(s, t)
          • 使用LOD查找纹理s在t.w位置的color4
        • tex1Dbias(s, t)
          • 将t.w决定的某个MIP层偏置后的一维纹理查找
        • tex1Dgrad(s,t,ddx,ddy)
          • 使用微分并指定MIP层的一维纹理查找
        • ex1Dproj(s, t)
          • 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询
      • 2D纹理查找
        • tex2D(s, t)
          • 普通二维纹理查找 返回纹理采样器s在vector t位置的颜色
        • tex2D(s,t,ddx,ddy)
          • 使用微分查询二维纹理,t和ddxy均为vector
        • tex2Dlod(s, t)
          • 使用LOD查找纹理s在t.w位置的color4
        • tex2Dbias(s, t)
          • 将t.w决定的某个MIP层偏置后的二维纹理查找
        • tex2Dgrad(s,t,ddx,ddy)
          • 使用微分并指定MIP层的二维纹理查找
        • tex2Dproj(s, t)
          • 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查
      • 3D纹理查找
        • tex3D(s, t)
          • 普通三维纹理查找 返回纹理采样器s在vector t位置的颜色
        • tex3D(s,t,ddx,ddy)
          • 使用微分查询三维纹理, t和ddxy均为vector
        • tex3Dlod(s, t)
          • 使用LOD查找纹理s在t.w位置的color4
        • tex3Dbias(s, t)
          • 将t.w决定的某个MIP层偏置后的三维纹理查找
        • tex3Dgrad(s,t,ddx,ddy)
          • 使用微分并指定MIP层的三维纹理查找
        • tex3Dproj(s, t)
          • 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询
      • 立体纹理查找
        • texCUBE(s,t)
          • 返回纹理采样器s在vector t位置的颜色
        • texCUBE(s,t,ddx,ddy)
          • 使用微分查询立方体维纹理 ,t和ddxy均为vector
        • texCUBEDload(s,t)
          • 使用LOD查找纹理s在t.w位置的color4
        • texCUBEbias(s,t)
          • 将t.w决定的某个MIP层偏置后的立方体纹理查找
        • texCUBEgrad(s,t,ddx,ddy)
          • 使用微分并指定MIP层的立方体纹理查找
        • texCUBEproj(s,t)
          • 使用投影方式的立方体纹理查找
      • 备注
        • lod:查找时使用mipmap图
        • bias:查找mipmap图后在使用偏置
        • grad:使用微分并指定mipmap层的查找
    • 相关概念
      • 偏导函数
        • 偏导数的物理含义
          • 在某一个方向上的变化。
        • ddx ddy定义
          • ddx 求的是 X 方向上,相邻两个像素的某属性值的变化量(即差值);ddy 求的是 Y 方向上,相邻两个像素的某属性值的变化量。
            • 如果函数 ddx 和 ddy 的输入参数为常数,则函数返回值永远为 0。
            • 函数 ddx 和 ddy 的输入参数通常是纹理坐标;
          • 由于 ddx 和 ddy 指令是作用于像素级的,所以 ddx 和 ddy 函数只被片段程序所支持
        • mipmap在选择到底用哪一层mipmap的level时,靠的就是偏导数。
      • 纹理查找中使用偏导函数
        •  
          • 当在纹理查询函数中使用 ddx 和 ddy 主要是为了进行图形过滤。简单的说,就是为了限制屏幕上相邻的连续2个像素值的插值。ddx用来限制X坐标上的像素值插值,ddy用来限制Y坐标上的像素值插值
          • 当我们所限定的 ddx 与 ddy 差值很大时,相邻的像素点会与这个差值进行比较,只有大于的时候才会拿出来,渲染到屏幕上,因此限制的差值越大,所拿出的像素点越少,图也就越来越模糊。
      • 在纹理查找应用于投影
        • 在光源照射不是直线的时候,需要使用对应的算法才能更好的计算出投影采样效果
  • 资料
    • 任务
      • 写5个常用的函数
      • ddxddy的实际使用测试
  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shader(着色器)是用于在图形渲染过程中处理和操作像素数据的一种程序。学习Shader需要一定的编程基础,特别是对C++、OpenGL或DirectX等图形编程框架的熟悉。以下是一个关于学习Shader的计划: 1. 学习基本概念: - 了解计算机图形学的基本概念,如顶点、纹理、光照等。 - 学习Shader的基本组成部分,包括顶点着色器(Vertex Shader)、片段着色器(Fragment Shader)和几何着色器(Geometry Shader)。 2. 选择合适的编程语言和图形编程框架: - 根据个人喜好和项目需求,选择C++、C#或HLSL(High Level Shading Language)作为编写Shader的编程语言。 - 学习所选编程语言的基本语法和图形编程框架的使用方法。 3. 学习Shader语言: - 熟悉所选编程语言的Shader库,了解常用的Shader函数和结构。 - 学习编写基本的顶点着色器和片段着色器,掌握如何描述图形渲染的过程。 4. 学习高级Shader技术: - 学习纹理贴图、光照模型、阴影技术等高级Shader技术。 - 掌握如何使用多个着色器(如几何着色器和光栅化着色器)组合在一起实现复杂的渲染效果。 5. 实践项目: - 参与开源项目或自己创建项目,将所学的Shader知识应用到实际项目中。 - 通过不断地实践和优化,提高自己的Shader编程能力。 6. 深入学习: - 阅读相关书籍和教程,了解更多关于Shader的高级技术和实现方法。 - 参加线上或线下的技术社区,与其他开发者交流学习经验,共同进步。 总之,学习Shader需要时间和耐心,通过不断地学习和实践,你将能够掌握这一技能并在图形渲染领域取得突破。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值