2.3 HLSL常用函数

news2024/9/28 7:25:23

一、函数介绍

 

函数图像参考网站:Graphtoy

1.基本数学运算

函数

含义

示例图

min(a,b)

返回a、b中较小的数值

mul(a,b)

两数相乘用于矩阵计算

max(a,b)

返回a、b中较大的数值

abs(a)

返回a的绝对值

round(x)

返回与x最近的整数

sqrt(x)

返回x的平方根

rsqrt(x)

返回x平方根的倒数

degregee(x)

转换成弧度

redians(x)

将角度转为弧度制

noise(x)

噪声函数

2.幂指对与偏导数

函数

含义

示例图

pow(x,y)

x的y次幂,xy

ldexp(x,exp)

返回x与2的exp次方的乘积,x*2exp

exp(x)

返回以e为底的指数函数,ex

exp2(x)

返回以2为底的指数函数,2x

log(x)

返回x以e为底的对数,lnx

log10(x)

求以10为底的对数,log10x

log2(x)

求以2为底的对数,log2x

frexp(x,out exp)

把一个浮点数分解为尾数和指数,

x : 要分解的浮点数据

返回值: 返回尾数

x = 尾数*2指数

(如果x参数为0,则此函数的尾数和指数均返回0)

3.三角函数与双曲线函数

函数

含义

示例图

sin(x)

返回x的正弦值

cos(x)

返回x的余弦值

tan(x)

返回x的正切值

tan(y,x)

返回y/x的正切值

sincos(x, out s, out c)

返回x的正弦和余弦值

asin(x)

返回x的反正弦值

acos(x)

返回x的反余弦值

atan(x)

返回x的反正切值

atan2(y,x)

返回y/x的反正切值

sinh(x)

返回x的双曲正弦值,0.5*(ex-e-x)

cosh(x)

返回x的双曲余弦值

0.5*(ex-e-x)

tanh(x)

返回x的双曲正切值

4.数据范围

函数

含义

示例图

ceil(x)

返回>=x的最小整数

step(x,y)

x<=y为1,否则为0

floor(x)

返回小于或等于x的最大整数

saturate(x)

返回将x限制在0和1之间的值

clamp(x,min,max)

把x限制在[min,max]范围内,小于返回min,大于返回max

frac(x)

返回x的小数部分

fmord(a,b)

返回a/b的浮点部分

modf(x,out ip)

将值x分为小数和整数部分(各部分符号与x相同),ip返回整数部分,整体返回小数部分

lerp(a,b,s)

按照s在a到b之间差值

smoothstep(min,max,x)

如果x在[min,max]范围内,则返回介于0~1之间的平滑Hermite差值;使用smoothstep HLSL内在函数在两个值之间创建平滑过渡。例如,使用此功能平滑的混合两种颜色

5.类型判断类

函数

含义

all(x)

确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false(处理由浮点、整形、布尔型数据定义的标量,向量或者矩阵)

clip(x)

如果输入值小于0,则丢弃当前像素,常用语判定范围(不仅仅针对0,返回值为void),常用于测试alpha,如果每个分量代表到平面的距离,还可以用来模拟剪切平面

sign(x)

返回x的正负性,如果x小于0返回-1,如果x等于0返回0,如果x大于0返回1

isinf(x)

如果x参数为+INF或者-INF(无穷+无穷仍无穷,0x3f3f3f3f),返回true,否则返回false

isfinite(x)

判断x参数是有有界,有限的,与isinf(x)相反

isnan(x)

如果x参数为NAN(非数字),返回true,否则返回false

6.向量与矩阵类

函数

含义

length(v)

返回向量的长度

normalize(v)

向量归一化,x/length(x) 方向向量归一化

distance(a,b)

返回两个向量之间的距离,按理说应该为0,此处表示为根号下各分量之差的平方和

dot(a,b)

返回a和b这两个向量的标积/内积/数量积/点积(a在b上的投影长,a·b=|a||b|·cosθ)

cross(a,b)

返回a和b这两个向量的矢积/外积/向量积/叉积(返回值是个向量,而且与a、b都垂直,大小上|a×b| = |a| * |b| * sinθ)

determinant(m)

返回指定浮点矩阵的按行列方式计算的值

transpose(m)

返回矩阵m的转置矩阵

7.光线运算类

函数

含义

示例图

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)

8.1D纹理查找(几乎不会使用)

GPU在PS阶段是在屏幕空间XY坐标系中对每一个像素去对应的文立中查找对应的纹素确定像素的颜色。

《GPU 编程与CG语言之阳春白雪下里巴人》

函数

含义

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层的一维纹理查找

tex1Dproj(s,t)

把纹理当做一张幻灯片投影到场景中,先试用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询

9.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除以透视值),然后使用投影纹理坐标进行查询

10.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除以透视值),然后使用投影纹理坐标进行查询

11.立体纹理查找

函数

含义

示例图

texCUBE(s,t)

返回纹理采样器s在vector t位置的颜色

texCUBE(s,t,ddx,ddy)

使用微分查询一维纹理t和ddxy均为vector

texCUBElod(s,t)

使用LOD查找纹理s在t.w位置的color4

texCUBEbias(s,t)

将t.w决定的某个MIP层偏置后的一维纹理查找

texCUBEgrad(s,t,ddx,ddy)

使用微分并制定MIP层的一维纹理查找

texCUBEproj(s,t)

把纹理当做一张幻灯片投影到场景中,先试用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询

参考链接:

Cg(C for Graphic)语言标准函数库之纹理映射函数,偏导函数,与调试函数_liu_lin_xm的博客-CSDN博客

Mipmap:

MipMap的LOD实现原理_tex2dgrad_jieniyimiao的博客-CSDN博客

Unity中关于 Mipmap_mipmaps_u010019717的博客-CSDN博客

2D:

tex2Dbias

3D:

Introduction To Textures in Direct3D 11 - Win32 apps | Microsoft Learn

Texture Coordinates (Direct3D 9) - Win32 apps | Microsoft Learn

3D Textures

立体纹理查找:

Cubic Environment Mapping (Direct3D 9) - Win32 apps | Microsoft Learn

作业:

写出你觉得最常用的5个函数

  1. tex2D(s,t)
  2. normalize(x)
  3. saturate(x)
  4. dot(x,y)
  5. lerp(x,y,t)

ddx、ddy的实际使用测试

1.锐化图像

 fixed4 frag (v2f i) : SV_Target
 {
   fixed4 col = tex2D(_MainTex, i.uv);
   col += ddx(col * _DDXIntensity)+ ddy(col * _DDYIntensity);
   return fixed4(col.rgb,1.0);
 }

右图为锐化intensity=1时

最后输出ddx(col * _DDXIntensity)+ ddy(col * _DDYIntensity)则可以看到锐化范围。

2.求面法线

struct appdata
{
  float4 vertex : POSITION;
  float2 uv : TEXCOORD0;
  float3 normal : TEXCOORD3;
};

struct v2f
{
  float2 uv : TEXCOORD0;
  UNITY_FOG_COORDS(1)
  float4 vertex : SV_POSITION;
  float3 pos : TEXCOORD1;
  float3 worldPos : TEXCOORD2;
  float3 worldNormal : TEXCOORD3;
};

sampler2D _MainTex;
float4 _MainTex_ST;
float _Intensity;
float _DDXIntensity;
float _DDYIntensity;

v2f vert (appdata v)
{
  v2f o;
  o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  o.vertex = UnityObjectToClipPos(v.vertex);
  o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
  o.worldNormal = mul(v.vertex,(float3x3)unity_WorldToObject).xyz;
  return o;
}

fixed4 frag (v2f i) : SV_Target
{
  fixed3 col = tex2D(_MainTex, i.uv);
  //锐化
  //col += ddx(col * _DDXIntensity)+ ddy(col * _DDYIntensity);
  //求面法线
  col = normalize(cross(ddy(i.worldPos),ddx(i.worldPos))); 
  return fixed4(col,1.0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT【day4】

chat_QT服务器端&#xff1a; //.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList> //链表容器 #inc…

美团/华为/字节/滴滴等大厂真实面试面经

一、美团测试开发面经 一面&#xff0c;1小时 自我介绍 自已觉得最好的项目&#xff1f;主要做了什么&#xff1f;遇到的最大困难&#xff1f; 浏览器输入网址后发生了什么&#xff1f; 三次握手和四次挥手 http和https的区别 https的加密过程 知道哪些排序算法 快排的…

现在入行软测=49年入国军?三句话,让面试官再掏2K

还有一个月就步入金九银十&#xff0c;很多软测人吐槽因为疫情&#xff0c;公司都在裁员&#xff0c;别说跳槽涨薪&#xff0c;能保住现在的工作就不错了。 但也有那么一批人&#xff0c;凭借自己口才与实力拿到年薪近50W的offer。面试是初见1小时就要相互了解优缺点的过程&am…

工作10年的老码农手把手教你如何3分钟看懂IT技术管理!速收藏!

老陈是谁&#xff1f; 一个码龄十年的老码农&#xff0c;从刚毕业开始被代码折磨的死去活来&#xff0c;到公司里“被迫”成为多线技术栈的“工程师”&#xff0c;这几年又从IT技术转向做IT管理。 基本可以说从一个坑跳到了另一个坑&#xff0c;虽然坑多水深&#xff0c;但是…

【Golang】Golang进阶系列教程--Golang中文件目录操作的实现

文章目录 一、文件二、文件目录三、文件目录操作3.1、读取文件3.1.1、方法一 (file.Read())3.1.2、方法二 (bufio读取文件)3.1.3、方法三 (ioutil 读取方法) 3.2、写入文件3.2.1、方法一3.2.2、方法二3.2.3、方法三 (ioutil写入文件) 3.3、复制文件3.3.1、方法一3.3.2、方法二 …

AI人工智能未来在哪里?2023年新兴产业人工智能有哪些就业前景?

AI人工智能未来在哪里&#xff1f;2023年新兴产业人工智能有哪些就业前景&#xff1f; 随着科技的不断发展&#xff0c;人工智能技术也在不断地进步。在数字化时代&#xff0c;人工智能技术已经渗透到了我们生活的各个方面。2023年为止中国产业80%已经实现半自动化&#xff0c;…

element 级联 父传子

html代码例子 父组件 <el-cascaderstyle"width: 100%"change"unitIdChange":options"unitOptions"filterablev-model"formInline.unitId":props"unitProps"/></el-form-item>//改变级联传值到这个组件里面<r…

自动化测试如何做?搭建接口自动化框架从0到1实战(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 传统软件测试行业…

C#时间轴曲线图形编辑器开发1-基本功能

目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 &#xff08;1&#xff09;界面布置 &#xff08;2&#xff09;显示面板代码 &#xff08;3&#xff09; 面板水平方向、竖直方向移动功能实现 &#xff08;4&#xff09;面板放…

kotlin 编写一个简单的天气预报app(三)

使用eventbus替换broadcast 将从Broadcast切换到EventBus有以下几个好处&#xff1a; 解耦性&#xff1a;通过使用EventBus&#xff0c;您可以实现组件之间的解耦。传统的Broadcast机制需要发送方和接收方明确知道对方的存在&#xff0c;并且需要在代码中设置Intent过滤器和广…

Mnist分类与气温预测任务

目录 传统机器学习与深度学习的特征工程特征向量pytorch实现minist代码解析归一化损失函数计算图Mnist分类获取Mnist数据集&#xff0c;预处理&#xff0c;输出一张图像面向工具包编程使用TensorDataset和DataLoader来简化数据预处理计算验证集准确率 气温预测回归构建神经网络…

网页版五子棋项目演示

项目源码&#xff1a;五子棋游戏 演示使用的用户名&#xff1a;zyz 密码:123 注册页面&#xff1a; 登录页面&#xff1a; 游戏大厅页面&#xff1a; 未匹配&#xff1a; 匹配中&#xff1a; 游戏房间页面&#xff1a; 对方落子&#xff1a; 己方落子&#xff1a; 对…

5.6 Java递归讲解

5.6 Java递归讲解 A方法调用B方法&#xff0c;我们很容易理解递归就是&#xff1a;A方法调用A方法&#xff01;就是自己调用自己利用递归可以实现通过简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0…

Redis的五大数据类型介绍

、简介 Redis的五大数据类型也称五大数据对象&#xff1b;前面介绍过6大数据结构&#xff0c;Redis并没有直接使用这些结构来实现键值对数据库&#xff0c;而是使用这些结构构建了一个对象系统redisObject&#xff1b;这个对象系统包含了五大数据对象&#xff0c;字符串对象&am…

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录 GDI对象画笔和画刷来开发控件梯形边框的按钮控件CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp: 实现文件 矩形边框的三态按钮控件 CToolTipCtrl开发动…

linux服务器安装redis

一、安装下载 下载安装参考文章 下载安装包地址&#xff1a;https://download.redis.io/releases/ 亲测有效&#xff0c;但是启动的步骤有一些问题 安装完成&#xff01;&#xff01;&#xff01; 二、启动 有三种启动方式 默认启动指定配置启动开机自启 说明&#xff1a…

CentOS下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…

【Lua学习笔记】Lua进阶——Table(4)继承,封装,多态

文章目录 封装继承多态 封装 // 定义基类 Object {}//由于表的特性&#xff0c;该句就相当于定义基类变量 Object.id 1//该句相当于定义方法&#xff0c;Object可以视为定义的对象&#xff0c;Test可以视为方法名 //我们知道Object是一个表&#xff0c;但是抽象地看&#xff…

为什么要有虚拟内存?

操作系统是通过内存分段和内存分页的方式管理虚拟内存地址和物理内存地址之间的关系 内存分段 程序是由若干个逻辑分段组成的&#xff0c;代码分段、数据分段、栈段、堆段组成&#xff0c;不同的段有不同的属性&#xff0c;所以就用分段的形式分离开。 分段机制下的虚拟内存…

【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】

4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…