Shader "Unlit/MathTest"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 5.0
#include "UnityCG.cginc"
// [InterlockedOutput(0, "dest", "groupshared")] // Or [InterlockedOutput(0, "dest", "uav")] for UAVs.
float4 test;
struct appdata
{
float4 posMs : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 posCs : SV_POSITION;
float4 value : TEXCROOD0;
};
v2f vert (appdata v)
{
v2f o;
/*------------------------------------------------------------------------------------------------------------------------------*/
//if只能进行单个标量值的比较,
/*------------------------------------------------------------------------------------------------------------------------------*/
//曲线函数
acos(UNITY_PI); // 返回反余弦函数值 acos(x) = π - acos(-x) 定义域:[-1,1] 值域是:[0,π] 意义:给定原式y的值可以找到x的值
atan(UNITY_PI); // 返回反正切函数值 值域是:[-π/2, π/2]
atan2(1, 0); // 返回反正切函数值 它返回的是从原点到给定点的角度,以弧度为单位 计算时比atan稳定
asin(UNITY_PI); // 返回反正弦函数值 定义域:[-π/2, π/2]
tanh(1.0f); // 双曲正切
sinh(1.0f); // 双曲正弦
cosh(1.0f); // 双曲余弦
//特殊需求
bool allBack = all(float4(1,0,1,0)); // 判断是否所有部件都是0 返回一个布尔值 这里就返回false 可传入标量(int,float,bool)、向量、矩阵
bool anyBack = any(float4(0,1,0,1)); // 判断是否所有部件都不为0 返回一个布尔值 这里就返回false 可传入标量(int,float,bool)、向量、矩阵
faceforward(float3(1,0,0), float3(0,1,0), float3(0,0,1)); // 三个参数法线向量、光照方向、物体的法线向量 这个函数通常用于在渲染过程中调整面的朝向,以确保光照效果正确。例如,当光线从背面照射物体时,物体的法线向量可能指向观察者的反方向。这时返回值为面法线向量的反方向,否则返回面法线向量
firstbithigh(3); // 输入整数,返回二进制左数第一位,他貌似是原码而不是补码的位置,是反过来的,所以对于有符号整数如果是负数,第一位是0
firstbitlow(3); // 就是返回原码最后一位
lit(0.2, 0.4, 0.6); // 标准化曲面法线和光向量的点积、半角矢量和曲面法线的点积、镜面反射指数 传入三个值,返回照明系数矢量(环境光、漫反射、镜面反射、1)
reflect(float3(1,1,1), float3(1,-1,2.5f)); // 计算反射向量 传入入射向量和表面法向量计算反射向量
refract(float3(1,1,1), float3(1,-1,2.5f), 0.5f); // 计算折射向量 传入入射方向、表面法线、折射率
//基本运算
abs(10); // 返回绝对值
ceil(1.5f); // 向上取整
floor(1.5f); // 向下取整
clamp(1.2f, 1.0f, 2.0f); // 限制在[1.0f, 2.0f]
degrees(UNITY_PI); // 弧度转角度
radians(30); // 角度转弧度
distance(float2(0,0), float2(3,5)); // 计算向量间距离
exp(5); // 求e的多少次幂
pow(5,2); // 5的2次方
int integer, decimal; decimal = modf(5,integer); // 提取整数小数部分
frac(3.5f); // 取小数
fmod(5.3f,2); // 取余运算
float mantissa,exponent; mantissa = frexp(4.5f, exponent); // 求尾数和整数,计算为 4.5 = mantissa * 2^exp 尾数mantissa是不大于1的正数
ldexp(15,3); // 返回15*2的3次幂的值
lerp(2,4,0.5f); // 线性插值
log(2); // e的对数
log10(100); // 10的对数 2
mul(4,5); // 乘 可以传入向量、矩阵
pow(2,4); // 2的4次方
rcp(2); // 计算倒数(近似值) 可传入向量、矩阵,返回一致的格式
round(1.2f); // 四舍五入
rsqrt(4); // 平方根的倒数 sqrt函数,计算平方根
saturate(0.2f); // 限制为0到1,传入向量和矩阵就是每个位置都限制为0到1
sign(-1); // 返回符号 -1 0 1
smoothstep(0.2,0.4,0.5f); //小于左返回0,大于右返回1,否则返回输入值 step函数
trunc(4.2f); // 丢弃小数
//向量或矩阵
dot(float3(0,0,1), float3(1,1,0)); // 点乘结果
cross(float3(0,0,1), float3(1,1,0)); // 叉乘结果
determinant(float4x4(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)); // 输入矩阵 返回计算行列式值
length(float3(0,0,1)); // 返回向量长度
transpose(float2x2(1,2,3,4));// 返回矩阵的转置
//逻辑
if(true){}else{} // 注意if只能判断标量,向量和矩阵不可以
for(int i = 0; i < 10; i++){}
isfinite(float2(1.0f, 1.2f)); // 浮点数是否为有限数 可以传向量、矩阵 传向量就返回向量阵型的bool
isinf(float2x2(2,1,4,5)); // 浮点数是否为无穷大
//格式或问题处理
float4 d3ToUnbyteColorBack = D3DCOLORtoUBYTE4(float4(1,1,2,3)); // 将 D3DCOLOR 值转换为 UBYTE4 类型。D3DCOLOR 是 Direct3D 中用于表示颜色的数据类型,而 UBYTE4 是用于表示四个无符号字节的向量类型。
//asdouble、asfloat、asin、asint、asuint、 // 进行转换,强转会出问题时使用
// abort(); // 手动报错 没有返回值
DeviceMemoryBarrier(); // 同步GPU设备上的内存操作的方法。它用于在执行多个计算任务时,确保内存操作的正确顺序和一致性
//f16tof32、f32tof16 16是uint,32是float
//Interlocked; // InterlockedAdd、And、Max、Min....等等 原子操作 多线程
GetRenderTargetSampleCount(); // 查询渲染目标(Render Target)的采样数量.当你设置一个渲染目标(例如一个纹理或帧缓冲区)为多重采样(Multisampling)时,这个函数可以告诉你这个渲染目标有多少个采样点 返回uint
GetRenderTargetSamplePosition(0); // 查询渲染目标的采样位置的,输入多重采样时采样点的编号,返回采样点在渲染目标上的(x,y)坐标
//模型版本不支持线程操作,需要更高。需要Shader Model 5,#pragma target 5.0并不满足
//AllMemoryBarrier(); // 可以确保在执行下一步渲染操作之前,所有线程都完成了对共享内存的访问。这样可以避免不同线程同时修改同一内存位置而产生的数据竞争问题
//AllMemoryBarrierWithGroupSync(); // 不仅确保所有线程都完成了对共享内存的访问,还确保所有线程都完成了对同步点的等待
// DeviceMemoryBarrierWithGroupSync(); //阻止组中所有线程的执行,直到完成所有设备内存访问并且组中的所有线程都到达此调用为止
//GroupMemoryBarrier();
//GroupMemoryBarrierWithGroupSync();
/*------------------------------------------------------------------------------------------------------------------------------*/
o.uv = v.uv;
o.posCs = UnityObjectToClipPos(v.posMs);
o.value = float4(1,1,1,1);
return o;
}
sampler1D temp;
fixed4 frag (v2f i) : SV_Target
{
// only supported in pixel shaders.
clip(1); // 如果值小于0就丢弃像素
float2 uvRespectToX = ddx(i.uv); // 计算纹理在屏幕空间x轴上的偏导(在X方向的变化率,大于0增加小于0减少,数值反映坡度,相当于二元函数z=f(x,y)相对于x的倒数) 返回的xy相当于纹理x值在屏幕空间x轴上的偏导和纹理y值在屏幕空间x轴上的偏导
float2 uvRespectToY = ddy(i.uv); // 偏导反映变化趋势
ddx_coarse(i.uv); ddy_coarse(i.uv); // 低精度
ddx_fine(i.uv); ddy_fine(i.uv);// 高精度
fwidth(i.uv); // 其实就是abs(ddx(x)) + abs(ddy(x))
tex1D(temp, 1.0f); // 想要在顶点着色器中使用必须要使用tex1Dlod(指定mip) 还有tex1Dbias,偏置后采样、tex1Dgrad渐变选择mip采样、tex1Dproj使用投影分割采样。 还有texcube
return i.value;
// return float4(i.uv, 0, 1) ;
}
ENDCG
}
}
}