当前位置: 首页 > article >正文

UE5 HLSL 学习笔记

half的取值范围是整形的-60000 到 60000,考虑带宽的情况下使用half

vector默认为float4

访问可以.xyzw,也可以.rgba,也可以[index],且顺序可以变,比如说.yzwx

矩阵的获取值的方式

第一个行代表获取第1行第0号元素

第二行代表获取第二行第三个元素

第三行代表获取第一行第二个元素

第四行代表获取第二行第二个元素和第二行第三个元素共同组成float2

第一行代表声明了一个2行3列的浮点数矩阵

第二行代表声明了一个3行3列的浮点数矩阵

第三行代表声明了一个4行4列的浮点数矩阵

这个代表一个4行4列的矩阵

加了static就可以不用给他外部输入赋值了

声明数组,声明十个vector类型的数组,声明10个float4类型的数组

C++的结构体可以直接在结构体里面float A = 4.3;这样初始化,但是HLSL不行

HLSL的强转:

一维变多维,将把一维的值复制到xyzw上

多维变一维,将把多维的x值给到一维

如果是浮点矩阵转整形,他会向下取整,10.8变成10

HLSL支持隐式转换

all的意思是bool数组里面所有变量都为true,返回值才为true,有一个为false都为false

any的意思是bool数组里面有一个为true,返回值就为true

clip里面的值如果小于0,则丢弃

discard丢弃像素,以上的含义为,假如cccccc值为1,则像素被丢弃

什么时候用【branch】什么时候用【flatten】?

branch:当分支内部内容比较简单的时候用

flatten:当分支内部内容比较复杂的使用

branch和flatten的区别:

branch如何runtime下,执行了if中的某个条件,执行完毕后会执行跳转指令,跳转指令会消耗性能,而flatten就是全部if else内部内容都编译好,当然编译好就会消耗一定的内存,但是不会执行跳转指令的消耗,这个使用取舍具体看项目

什么时候用【loop】?

当循环遍历的次数不确定的时候

比如说: 

[loop]
for(int i = 0; i < LoopTimes; i++)
{

}

这种LoopTimes需要传进来才知道的,就最好加一个【loop】,可以减少性能开销 

什么时候用【unroll】?

当遍历的次数是已知的

比如说:

[unroll]
for(int i = 0; i < 100; i++)
{

}

这时候可知循环体为100次

unroll就和[flatten]有点像,它会提前把循环体内的代码提前编译好,然后线性让它执行,因为提前编译过,执行的速度会更快,但是带来的是消耗更多的内存

countbits是计算一个数里面转成二进制过后,里面有几个1

cross叉乘的意思

ddx和ddy分别可以检测图像的x向的梯度和y向的梯度

ddx,左右两边颜色插值越大,返回值就越大

ddy,上下两边颜色插值越大,返回值就越大

通常可以做边缘检测算法


isnan可以判断里面是不是为空值,anyvalue/0就为空,返回值就为true


isfinite(value)可以判断value是不是无限制


isinf(value)是判断value是不是无穷大,正无穷和负无穷都为true


rcp(valule)是取value的倒数


rsqrt(value)是求value值根号分之1,比如4的根号为2,分之1就是为1/2


reflect(value)是计算value下入射向量和表面法线结合算出的出射向量的值


refract(value)是根据入射向量和法线向量和相对折射率计算出的折射出射向量


sign(value),当value小于0时,sign返回-1, 当value等于0时,sign范返回0,当value大于0时,返回1


mad(value1, value2, value3)的意识就是value1* value2+ value3的意思,但是它对这个算法做了性能优化,如果要用这样的算法,推荐使用mad函数,而不是自己写


radians(value)角度转化为弧度


判断矩阵可不可逆,若可逆,则返回值为1,若不可逆,则返回值为0

也可以通过determinant去计算三角形的面积


transpose是对矩阵进行转置(按照对角线翻转)


 

建立HLSL的枚举


一个字节8位,所以HLSL中的int1就是C++中的int8,uint2就是C++中的uint16,以此类推


在C++是不支持这种写法的

但是在HLSL中:

这样写就相当于把1给到结构体中的每个变量去了


groupshared:将一个变量标记为用于计算着色器的线程组共享内存



由于GPU的线程数量很多,在计算4*4的矩阵加法的时候,也可以开出16个线程去分别计算里面对应加出来的值


这里的POSITION是变量Position的语义,告诉寄存器,此变量的保存位置,通常语义用于着色器的输入和输出,以冒号“:”的方式进一步说明此变量,COLOR也类似

还有什么语义呢?


http://www.kler.cn/a/393782.html

相关文章:

  • 2411d,右值与移动
  • Windows C++ TCP/IP 两台电脑上互相传输字符串数据
  • 随时随地编码:香橙派Zero3上安装Code Server远程开发指南
  • LeetCode【0033】搜索旋转排序数组
  • HBase使用create创建表时报错ERROR: KeeperErrorCode = NoNode for /hbase/master
  • linux设置主机名
  • ISP——你可以从这里起步(二)
  • 基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解
  • 通俗易懂:什么是 Java 类加载?
  • 多叉树笔记
  • Linux 如何使用函数删除非空目录
  • Android11 修改系统语言
  • P10901 [蓝桥杯 2024 省 C] 封闭图形个数
  • scala创建图书信息类,包含三个属性:书名,作者,价格
  • Spring Boot框架:电商系统的快速开发
  • arcgis做buffer
  • 学习threejs,使用导入的模型生成粒子
  • 扫雷游戏代码分享(c基础)
  • 观察者模式 vs 不使用观察者模式:商品库存变化的通知
  • Spring框架之责任链模式 (Chain of Responsibility Pattern)
  • GDSC、CTRP数据库学习
  • ApiSmart-QWen2.5 coder vs GPT-4o 那个更强? ApiSmart 测评
  • 使用Java爬虫获取淘宝商品类目API返回值
  • Rust学习(一):初识Rust和Rust环境配置
  • Kafka Eagle 安装教程
  • ue5 蓝图学习(一)结构体的使用