图形 2.3 HLSL常用函数介绍
一、基本数学运算
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) 噪声函数
数学公式输入可视化:Graphtoy
将uv的坐标作为x传入,随机的返回一个[0,1]的值,就会得到一张噪声图
二、幂指对函数
三、三角函数和双曲线函数
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
fmord(x,y) 返回x对y取余的余数
frac(x) 取x的小数部分
modf(x,out ip) 将x分为小数和整数部分(输出的ip为整数部分,返回值为小数部分)
lerp(x,y,s)按照s在x到y之间插值,返回x * 1(1 - s) + y * s
smoothstep(min,max,x) 如果x在[min,max]范围内,就返回介于[0,1]之间的平滑Hermite插值,使用smoothstep在两个值直接创建平滑过渡
eg,平滑地混合两种颜色
五、类型判断类
all(x) 确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false(处理由浮点型、整型、布尔型数据定义的标量、向量或者矩阵)
clip(x) 如果输入值小于零,则丢弃当前像素 常用于判定范围(不仅仅针对0,返回值为void)
常用于测试alpha,如果每个分量代表到平面的距离,还可以用来模拟剪切平面
sign(x) 返回x的正负性 如果x小于零返回-1,如果x等于零返回0,如果x大于零返回1
isinf(x) 如果x参数为+ INF或-INF(无穷+无穷仍无穷,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) 点积
cross(a,b) 叉积
具体点积叉积应用可参考GAME101线代部分笔记、TA百人计划1.21的作业
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)
为BlingPhong光照模型(看到这部分了这个应该清楚,参考GAMES101着色部分)
faceforward(n,i,ng) 得到面向视图方向的曲面法向量输入输出为同元向量,返回-n*sign(dot(i,ng))(normal,light,normal)
八、纹理查找
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层的一维纹理查找
tex1Dproj(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) 使用投影方式的立方体纹理查找。
写出你觉得最常用的5个函数
pow(x,y) x的y次幂
mul函数 用于矩阵的相乘
dot函数 点积
normalize(v) 向量归一化
reflect(i,n) 以i为入射向量n为法线方向的反射光
ddx ddy的实际使用测试
相关资料
微积分本质
【官方双语】微积分的本质 - 01 -_哔哩哔哩_bilibili
微积分的本质 - 02 - 导数的悖论
【官方双语】微积分的本质 - 02 - 导数的悖论_哔哩哔哩_bilibili
理解偏导数、梯度、方向导数
理解偏导数、梯度、方向导数_小白一直白-CSDN博客_梯度和偏导数的关系
ddx, ddy 这两条指令用于对指定的寄存器,求其值在临近像素上的变化率,因为纹理坐标的梯度可以用来确定纹理当前被缩放的程度,可用该值来计算Mip层,另外它也可以用来计算Texel的跨越Size,由此求得正确的过滤宽度,从而纠正通常的线性过滤在远处由于过滤宽度错误而产生的失真。
偏导函数(Derivative Functions)
(GPU 编程与 CG 语言之阳春白雪下里巴人)
偏导函数的用法很容易让人困惑,因为找不到非常信息的解释说明,当我查
找这两个函数的中文资料时,给出的解释通常都是“ddx:返回关于屏幕坐标 x 轴
的偏导数;ddy:返回关于屏幕坐标 y 轴的偏导数”。这个简单且单纯的解释完全
可以让人陷入长时间的迷惑中,并进而怀疑自己的智商。于是我查找Cg Refernece
Manual 中关于 ddx 函数的定义(ddy 函数的定义与之类似),原文是“returns
approximate partial derivative with respect to window-space X”。看来是典型的上梁
不正下梁歪。学习一个函数,最重要的是明白其输入\输出参数的意义,以及有
何作用。下面我们带着问题来学习这两个函数:
函数 ddx 和 ddy 是做什么用的,即对输入参数进行了哪些处理?
函数 ddx 和 ddy 的输入参数的意义?是纹理坐标,还是颜色值?
函数 ddx 和 ddy 输出量表达了何种含义?
下面这段话引自某个论坛上的技术讨论贴,作者不详:
上面这句话的意思是,如果函数 ddx 的参数为 myVar,该参数对应的像素点记为p(i,j),则 ddx(myVar)的值为“像素点 p(i+1,j)的值减去 myVar”。同理,ddy(myVar)的值为“像素点 p(i,j+1)的值减去 myVar”。如果函数 ddx 和 ddy 的输入参数为常数,则函数返回值永远为 0。
这里面存在像素点所对应数据的类型问题。从前面的知识可知,传入片段程序的顶点属性一般有:屏幕坐标空间的顶点齐次坐标、纹理坐标、法向量、光照颜色等。假设传递给 ddx\ddy 函数的参数 myVar 是纹理坐标,则,ddx(myVar)的值为,纹理上像素点的纹理颜色值减去 myVar 对应的纹理颜色值。
现在我们可以回答上面的三个问题:
函数 ddx 和 ddy 用于求取相邻像素间某属性的差值;
函数 ddx 和 ddy 的输入参数通常是纹理坐标;
函数 ddx 和 ddy 返回相邻像素键的属性差值;
现代的 GPU 中提供了计算 partial derivative 的指令(通常被称为梯度指令或者偏导数指令,DDX 或 DDY),Cg 中所对应的函数为 ddx()和ddy()(注:glsl 和 hlsl 中也有该函数)。按照屏幕相关空间 x 或 y 计算偏导数,对纹理滤镜以及抗锯齿等非常有用(注:也可以用于 TXD 纹理查找的参数计算)。学过高等数学应该知道,偏导数的物理含义是:在某一个方向上的变化快慢。所以 ddx 求的是 X 方向上,相邻两个像素的某属性值的变化量;ddy 球的是 Y方向上,相邻两个像素的某属性值的变化量。正是由于 ddx 和 ddy 指令是作用于像素级的,所以 ddx 和 ddy 函数只被片段程序所支持。当在纹理查询函数中使用 ddx 和 ddy 是可以进行图形过滤。所谓图像过滤,一个比较简单的定义是:对于给定的输入图像 A,要创建新的图像 B,把源图像A 变换到目标图像 B 的操作就是图像滤波。最一般的变换是调整图像大小、锐化、变化颜色,以及模糊图像等。复杂的过滤有赖于知道究竟需要过滤多少纹理。像 GeForce 那样的现代 GPU 提供的偏导函数可以帮助我们。
C for Graphic:ddx/ddy
C for Graphic:ddx/ddy_羊羊的博客-CSDN博客
ddx函数是右边的像素值-左边的像素值,ddy函数是上面的像素值-下面的像素值(那么片段以2x2为单位栅格化就好理解了,毕竟按照ddx/ddy算法的前置条件就需要横纵像素长度大于2)。结合图像就是ddx(p0UV) = p1RGBA-p0RGBA,ddy(p0UV) = p2RGBA-p0RGBA。但是我们前面看到的ddx/ddx函数的入参和出参分量是一致的(输入uv返回float2,输入color返回float4),所以ddx(p0RGBA)=p1RGBA-p0RGBA,ddy(p0RGBA)=p2RGBA-p0RGBA才对
GAMES101-现代计算机图形学入门-闫令琪
GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
代码测试
cg shader
边缘查找(输出变化率)
Shader "VS/TestDDXYShader"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Range("ddxpow",Range(0,100)) = 0.2}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;float _Range;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);col = ddx(col) + ddy(col) * _Range;return col;}ENDCG}}
}
边缘锐化(输出变化率加颜色)
只改了一个加号
图形 2.3 HLSL常用函数介绍相关推荐
- HLSL常用函数介绍
基本数学运算 max(a,b)返回较大的那个 min(a,b)返回较小的那个 mul(a,b)两变量相乘,常用于矩阵运算 abs(a)返回a的绝对值 round(x)返回与x最近的整数 sqrt(x) ...
- 【技术美术图形部分】2.3 HLSL常用函数
--介绍HLSL常用函数,API的使用. 想要成为合格的技术美术,一定要具备Shader开发能力,满足性能的需求,无论是技术美术的哪一个方向,HLSL都是需要点满的技能点. 参考 微软官方HLSL库: ...
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...
- php spl函数,PHP SPL标准库中的常用函数介绍
这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三 ...
- R语言使用psych包进行主成分分析PCA和探索性因子分析EFA的常用函数介绍:principal、fa、fa.parallel、factor.plot、fa.diagram、scree
R语言使用psych包进行主成分分析PCA和探索性因子分析EFA的常用函数介绍:principal.fa.fa.parallel.factor.plot.fa.diagram.scree 目录
- oracle常用函数number,Oracle 常用函数介绍
Oracle常用函数介绍,包括日期函数.类型转换函数 常用日期函数 1.add_months()函数可以得到指定日期之前或之后n个月的日期 date_value:=add_months(date_va ...
- Pandas入门之常用函数介绍
一.Pandas简介 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. pan ...
- (转)postgis常用函数介绍(一)
http://blog.csdn.net/gisshixisheng/article/details/47701237 概述: 在进行地理信息系统开发的过程中,常用的空间数据库有esri的sde,po ...
- mysql ceil,MySQL常用函数介绍
前言: MySQL数据库中提供了很丰富的函数,比如我们常用的聚合函数,日期及字符串处理函数等.SELECT语句及其条件表达式都可以使用这些函数,函数可以帮助用户更加方便的处理表中的数据,使MySQL数 ...
最新文章
- c语言平年表示方法,C语言平年闰年问题
- c++异常处理的基本思想
- 【渝粤题库】国家开放大学2021春1425调剂学(本)题目
- 项目管理中的特殊———例外管理
- fullpage常用配置
- 《计算机网络》学习笔记 ·002【物理层】
- 节选转载:你敢向代码库中添加Boost你就等着被开除吧
- hdu 1072 Nightmare BFS搜索(可重走)
- 翱翔云天的SAP技术课程体系
- gis 数据框裁剪_【更新80篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- Eclipse官方下载步骤
- 文章的DOI号是神马
- Vue2.0源码解析 - 知其然知其所以然之Vue.use
- 详解项目管理中任务、成本、产品三者的关系
- [Scrapy使用技巧] 如何在scrapy中捕获并处理各种异常
- 无法更改edge浏览器启动页(主页)\新标签页
- GitBook建立本地Book及导入别人Book
- 笔记 | Java 虚拟机
- Bugku 杂项 中国菜刀
- 硬盘坏道早知道,原来NAS还有这些工具可以预知硬盘状态