2.3 HLSL常用函数
一、函数介绍
函数图像参考网站: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个函数
- tex2D(s,t)
- normalize(x)
- saturate(x)
- dot(x,y)
- 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);
}
相关文章:

2.3 HLSL常用函数
一、函数介绍 函数图像参考网站:Graphtoy 1.基本数学运算 函数 含义 示例图 min(a,b) 返回a、b中较小的数值 mul(a,b) 两数相乘用于矩阵计算 max(a,b) 返回a、b中较大的数值 abs(a) 返回a的绝对值 round(x) 返回与x最近的整数 sqrt(x) 返回x的…...

互联网的发展
概述 互联网是现代社会中举足轻重的一个领域,它的发展对于人类的生活和工作方式产生了深远的影响。互联网的发展经历了几个阶段,从初创阶段到如今的高度普及和深入应用,本文将详细介绍互联网的发展状况。 第一阶段:互联网的起源…...

STM32 CAN通讯实验程序
目录 STM32 CAN通讯实验 CAN硬件原理图 CAN外设原理图 TJA1050T硬件描述 实验线路图 回环实验 CAN头文件配置 CAN_GPIO_Config初始化 CAN初始化结构体 CAN筛选器结构体 接收中断优先级配置 接收中断函数 main文件 实验现象 补充 STM32 CAN通讯实验 CAN硬件原理图…...

Python代码片段之Django静态文件URL的配置
首先要说明这段python代码并不完整,而且我也没有做过测试,只是我在工作时参考了其中的一些个方法。这是我在找python相关源码资料里看到的一段代码,是Django静态文件URL配置代码片段2,代码中有些方法还是挺技巧的,做其…...

基于飞桨paddle的极简方案构建手写数字识别模型测试代码
基于飞桨paddle的极简方案构建手写数字识别模型测试代码 原始测试图片为255X252的图片 因为是极简方案采用的是线性回归模型,所以预测结果数字不一致 本次预测的数字是 [[3]] 测试结果: PS E:\project\python> & D:/Python39/python.exe e:/pro…...

soft ip与hard ip
ip分soft和hard两种,soft就是纯代码,买过来要自己综合自己pr。hard ip如mem和analog与工艺有关。 mem的lib和lef是memory compiler产生的,基于bitcell,是foundry给的。 我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起…...

MyBatisPlus从入门到精通-2
接着上一讲的Mp的分页功能 下面我们讲解条件查询功能和其他功能 解决一下日志输出和banner问题 每次卞就会输出这些日志 很不美观,现在我们关闭一下 这样建个xml,文件名为logback.xml 文件内容改成这样 配置了logback但是里面什么都没写就不会说有日…...

AI面试官:Asp.Net 中使用Log4Net (一)
AI面试官:Asp.Net 中使用Log4Net (一) 当面试涉及到使用log4net日志记录框架的相关问题时,通常会聚焦在如何在.NET或.NET Core应用程序中集成和使用log4net。以下是一些关于log4net的面试题目,以及相应的解答、案例和代码: 文章目…...

Selenium自动化元素定位方式与浏览器测试脚本
Selenium八大元素定位方法 Selenium可以驱动浏览器完成各种操作,比如模拟点击等。要想操作一个元素,首先应该识别这个元素。人有各种的特征(属性),我们可以通过其特征找到人,如通过身份证号、姓名、家庭住…...

人机交互与人机混合智能的区别
人机交互和人机融合智能是两个相关但不完全相同的概念: 人机交互是指人与计算机之间的信息交流和互动过程。它关注的是如何设计和实现用户友好的界面,以便人们能够方便、高效地与计算机进行沟通和操作。人机交互通常强调用户体验和界面设计,旨…...

【项目】轻量级HTTP服务器
文章目录 一、项目介绍二、前置知识2.1 URI、URL、URN2.2 CGI2.2.1 CGI的概念2.2.2 CGI模式的实现2.2.3 CGI的意义 三、项目设计3.1 日志的编写3.2 套接字编写3.3 HTTP服务器实现3.4 HTTP请求与响应结构3.5 EndPoint类的实现3.5.1 EndPoint的基本逻辑3.5.2 读取请求3.5.3 构建响…...

sketch如何在线打开?有没有什么软件可以辅助
Sketch 在线打开的方法有哪些?这个问题和我之前回答过的「Sketch 可以在线编辑吗?」是一样的答案,没有。很遗憾,Sketch 没有在线打开的方法,Sketch 也做不到可以在线编辑。那么,那些广告里出现的设计软件工…...

CSS Flex 笔记
1. Flexbox 术语 Flex 容器可以是<div> 等,对其设置属性:display: flex, justify-content 是沿主轴方向调整元素,align-items 是沿交叉轴对齐元素。 2. Cheatsheet 2.1 设置 Flex 容器,加粗的属性为默认值 2.1.1 align-it…...

Markdown常用标签及其用途-有示例
Markdown常用标签及其用途 Markdown是一种轻量级标记语言,具有简洁易读的特点。下面是一些常用的Markdown标签以及它们的用途,并附带一些示例: 标题 用于创建不同级别的标题,可通过添加一到六个#符号来表示不同级别的标题。 #…...
25.1 Knife4j-Swagger的增强插件
1.Knife4j概述 Knife4j是一款基于Swagger UI的增强插件,它可以为Spring Boot项目生成美观且易于使用的API文档界面。它是Swagger UI的增强版,提供了更多的功能和定制选项,使API文档更加易读和易于理解。 2.Knife4j使用 Knife4j 集Swagger2…...

用flask run代替flask run --debug
安装python-dotenv依赖。 在项目根目录下新建.flaskenv文件,并作如下配置: FLASK_ENVdevelopment FLASK_DEBUG1...

python_day14_综合案例
文件内容 导包配置 import jsonfrom pyspark import SparkContext, SparkConf import osos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" os.environ["HADOOP_HOME"] "D:/dev/hadoop-3.0.0" conf SparkC…...

【算法题】2779. 数组的最大美丽值
题目: 给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。 在一步操作中,你可以执行下述指令: 在范围 [0, nums.length - 1] 中选择一个 此前没有选过 的下标 i 。 将 nums[i] 替换为范围 [nums[i] - k, nums[i] k] 内的任一整…...

文件上传之PHP
别怕,我会一直陪着你 一.知识二.实例1.phtml, <?简单过滤2.前端验证, phtml3 \.htaccess 一.知识 绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht 二.实例 1.phtml, <?简单过滤 (1)一句话木马 故意使用了post和get用来迷惑人 https://127.0.0.1/shy.php?POS…...

人脸检测实战-insightface
目录 简介 一、InsightFace介绍 二、安装 三、快速体验 四、代码实战 1、人脸检测 2、人脸识别 五、代码及示例图片链接 简介 目前github有非常多的人脸识别开源项目,下面列出几个常用的开源项目: 1、deepface 2、CompreFace 3、face_recogn…...

Linux工具【1】(编辑器vim、编译器gcc与g++)
vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用(g类似)预编译编译汇编链接静态库与动态库 总结 引言 vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…...

基于Java+SpringBoot+vue前后端分离古典舞在线交流平台设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

MQ - 闲聊MQ一二事儿 (Kafka、RocketMQ 、Pulsar )
文章目录 MQ的发展史阶段一:追求解耦阶段二:追求吞吐量与一致性阶段三:追求平台化 MQ的通用架构主题topic、生产者producer、消费者consumer分区partition MQ 存储KafkaGood Design ---> 磁盘顺序写盘Poor Impact---> topic 数量不能过…...

Qt中的 QIODevice类(包含:随机访问、顺序访问设备)
QIODevice类 一、简介 QIODevice用于对输入输出设备进行管理,是Qt中所有I/O设备的基接口类。为支持读写数据块的设备(如QFile、QBuffer和QTcpSocket)提供了通用实现和抽象接口。 输入设备有2种类型: 一种是随机访问设备,QFile(文件)和QBuff…...

【JavaScript 07】函数声明 地位平等 函数提升 属性方法 作用域 参数 arguments对象 闭包 IIFE立即调用函数表达式 eval命令
函数 1 概述1.1 声明1.2 重复声明 1.3 圆括号/return/recursion1.4 一等公民1.5 函数提升 2 函数属性与方法2.1 name属性2.2 length属性2.3 toString() 3 函数作用域3.1 概念3.2 函数内部变量提升3.3 函数本身作用域 4 参数4.1 概念4.2 省略4.3 传递4.4 同名4.5 arguments 对象…...

MyBatis源码分析_ResultSetHandler(7)
目录 1. 传统JDBC 2. Mybatis访问数据库 2.1 Statement访问数据库 2.2 火枪手 ResultSetHandler 出现 3. ResultSetHandler处理结果集 3.1 首先就是进入 handleResultSets 方法 3.2 handleResultSet 方法根据映射规则(resultMap)对结果集进行转化…...

Unittest加载执行用例的方法总结
前言 说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目,不同项目的大小及用例的多少自己选择加载方式。今天我们就简单的说说…...

使用预训练的2D扩散模型改进3D成像
扩散模型已经成为一种新的生成高质量样本的生成模型,也被作为有效的逆问题求解器。然而,由于生成过程仍然处于相同的高维(即与数据维相同)空间中,极高的内存和计算成本导致模型尚未扩展到3D逆问题。在本文中࿰…...

微服务测试是什么?
微服务测试是一种特殊的测试类型,因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤: 【B站最通俗易懂】Python接口自动化测试从入门到精通,超详细的进阶教程,看完这套视频就够了 1. 确定系统架构 了解微服务架构对…...

《现代C++教程》笔记(5-7)
文章目录 5 智能指针与内存管理5.1 RAII与引用计数5.2 std::shared_ptr5.3 std::unique_ptr5.4 std::weak_ptr 6 正则表达式7 并行与并发7.1 并行基础7.2 互斥量与临界区7.3 期物7.4 条件变量7.5 原子操作与内存模型 5 智能指针与内存管理 5.1 RAII与引用计数 在传统 C 中&am…...