UE5 HLSL 详细学习笔记

news2024/11/29 22:56:16

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

还有什么语义呢?

HLSL核心函数:

float3 Pixels = Texture2DSample(Tex, TexSampler, myUV);
for(int i = 0; i < n; i++) {
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(offset, 0));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(-offset, 0));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(0, offset));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(0, -offset));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(offset, -offset));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(-offset, offset));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(offset, offset));
    Pixels += Texture2DSample(Tex, TexSampler, myUV + float2(-offset, -offset));
}
Pixels /= 8 + 1;

return Pixels;

模糊

float2 myUV = floor(uv * 20) / 20;
float3 Pixels = Texture2DSample(Tex, TexSampler, myUV);

return Pixels;

像素化

float2 PixelsUV = floor(UV * GridNumber) / GridNumber;
float X = frac(UV.x * GridNumber);
float Y = frac(UV.y * GridNumber);
if((X < (Outline / GridNumber) || X > 1 - (Outline / GridNumber)) || (Y < (Outline / GridNumber) || Y > 1 - (Outline / GridNumber))){
     return float3(0, 0 , 0);
}
float3 Pixels = Texture2DSample(Tex, TexSampler, PixelsUV);
float Offset = 1 / GridNumber;
for(int i = 0; i < AverBounds; i++){
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(i * Offset, 0));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(-Offset * i, 0));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(0, i * Offset));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(0, -Offset * i));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(Offset * i, Offset * i));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(Offset * i, -Offset * i));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(-Offset * i, Offset * i));
    Pixels += Texture2DSample(Tex, TexSampler, PixelsUV + float2(-Offset * i, -Offset * i));
}
Pixels /= 8 * AverBounds + 1;

return Pixels;

像素化 + 模糊

struct Ns{
    float Noise(float2 uv, float2 Random, float RandomSeed) {
        return frac(sin(dot(uv, Random)) * RandomSeed);
    }
};
Ns n;
uv = floor(uv * noiseNumber);
return n.Noise(uv, Random, RandomSeed) < 0.5 ? 1 : 0;

struct Ns{
    float Noise(float2 uv, float2 Random, float RandomSeed) {
        return frac(sin(dot(uv, Random)) * RandomSeed);
    }
};
Ns n;
uv = floor(uv * noiseNumber);
return n.Noise(uv, Random, RandomSeed);

噪点
原理主要是先对UV里面所有内容进行dot,一个是每个uv的长度和方向合在一起具有唯一性与一个点位进行点乘就有随机数,但是这个随机数有个问题就是相邻的可能颜色很像,而噪点是黑白随机分配,不是一部分聚集在一起呈黑色,其他呈白色

float accumdens = 0;
LocCamVec = normalize(mul(Parameters.CameraVector, (float3x3)LWCToFloat(GetPrimitiveData(Parameters).WorldToLocal)));
for(int i = 0; i < MaxSteps; i++){
    float cursample = PseudoVolumeTexture(Tex, TexSampler, saturate(CurPos) + sin(Time * CloudSpeed) *  CloudSpeedIntensity, XYFrames, NumFrames).r;
    accumdens += cursample * StepSize;
    CurPos += -LocCamVec * StepSize;
}
return accumdens;

RayMarching做体积效果


float3 RayOrigin = viewDir - WorldPos;
float3 RayStep = viewDir * StepSize;
for(int i = 0; i < 256; i++){
    float dist = length(RayOrigin - SphereCenter) - SphereRadius;
    if(dist < 0) {
        return float3(1, 0, 0);
    }
    RayOrigin += RayStep;
}
return float3(0, 0, 0);


首先reflect(i, n)函数是以i为入射向量,n为法线向量的反射向量    float3 Reflection = reflect(LightDir, normal);

float3 RayOrigin = 1 - (viewDir - WorldPos);
float3 LightDir = normalize(LightPos);
float3 RayStep = viewDir * -StepSize;
for(int i = 0; i < 256; i++){
    float3 normal = normalize(RayOrigin - SphereCenter);
    float Diffuse = max(dot(normal, LightDir), 0);
    float3 Reflection = reflect(LightDir, normal);
    float Specular = pow(max(dot(Reflection, -viewDir),0), 128);
    float dist = length(RayOrigin - SphereCenter) - SphereRadius;
    if(dist < 0.01) {
        return float3(1, 0, 0) * Diffuse + (Specular) * LightColor;
    }
    OpacityMask = 1;
    RayOrigin += RayStep;
}
OpacityMask = 0;
return float3(0, 0, 0);

拿到了反射向量,就计算反射和射向相机的向量的点积来计算当点的高光亮度,如果刚好射到相机,那么就高亮越亮,反之,越暗


struct NoiseRotate {
    float2 RotateUV(float2 uv, float Angle) {
        float2x2 RotateMatrix = float2x2(cos(Angle), sin(Angle), -sin(Angle), cos(Angle));
       return  mul(uv - 0.5, RotateMatrix) + 0.5;
    }
};

NoiseRotate NR;

UV = (UV - 0.5) * Size + 0.5;

float UsingAngle = pow(length(UV - 0.5), sin(time));
UsingAngle = sin(UsingAngle) * 10;
float noiseUV = sin(atan2(UV.x - 0.5, UV.y - 0.5)) * length(UV - 0.5);

float3 Image = Texture2DSample(Tex, TexSampler, NR.RotateUV(UV, UsingAngle + time));
return Image;


利用旋转矩阵实现RotateUV的函数

然后根据离中心位置的距离,旋转的角度不同,做出该效果

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

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

相关文章

js如何将对象转换成数组

方法一&#xff1a;Object.values(obj) 示例&#xff1a; var obj { name: 小明, age: 22 }; console.log( Object.values(obj) ); // [小明, 22] 方法二&#xff1a;for-in循环 示例&#xff1a; var obj { name: 小明, age: 22 }; var arr []; let objName []; for(l…

Spingbot项目配置mySQL或postgresSQL详解

1&#xff1a;postgresql库: yml文件 探索PostgreSQL&#xff1a;从基础到实践&#xff08;简单实例&#xff09; # PageHelper分页插件 pagehelper:helperDialect: postgresqlreasonable: truesupportMethodsArguments: trueparams: countcountSql# 数据源配置 spring:datas…

ArcGIS无法链接在线地图或错误: 代理服务器从远程服务器收到了错误地址(验证服务器是否正在运行)。

这几天我们分享了&#xff01; 谷歌卫星影像图归来&#xff01;ArcGIS直连&#xff01;快来获取_谷歌影像lyr-CSDN博客文章浏览阅读666次&#xff0c;点赞11次&#xff0c;收藏9次。大概。_谷歌影像lyrhttps://blog.csdn.net/kinghxj/article/details/137521877一套图源搞定&a…

LPA算法简介

1. 背景 标签传播算法(Label Propagation Algorithm)是一种基于图的半监督学习方法&#xff0c;其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。 2. 算法流程 1. 为每个节点随机的指定一个自己特有的标签&#xff1b; 2. 逐轮刷新所有节点的标签&#xff0…

音乐小程序|基于微信开发音乐小程序的系统设计与实现(源码+数据库+文档)

音乐小程序目录 基于微信开发音乐小程序的系统 一、前言 二、系统设计 三、系统功能设计 小程序端&#xff1a; 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

开箱即用之 windows装的MongoDB 服务无法开机自启

先把mongo服务手动停止 以管理员的身份打开黑窗口&#xff0c;并移除系统服务 进入mongod.exe文件所在目录 mongod.exe --remove --serviceName "MongoDB" 在你mongo的data目录下&#xff0c;移除两个文件 mongod.lock strage.bson 重新将服务加入开机自启的系…

测试使用Python GDAL 下载Mapbox瓦片地图及拼接

测试使用 Python GDAL 下载 Mapbox 瓦片地图及拼接 本教程将展示如何以编程方式从网络地图&#xff08;通常称为瓦片地图&#xff09;瓦片服务器下载地图图像&#xff0c;对其进行地理参考&#xff08;设置坐标系&#xff09;并将其保存为GeoTIFF。 Code import lib #!/usr…

2011-2022年上市公司新质生产力测算数据(含原始数据+计算代码+计算结果)

2011-2022年上市公司新质生产力测算数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2011-2022年 2、来源&#xff1a;原始数据整理自csmar、wind 3、指标&#xff1a;证券代码、证券简称、统计截止日期、报表类型、营业收入、研发费用、资产减…

一起Talk Android吧(第五百五十七回:如何获取文件读写权限)

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 内容总结各位看官们大家好,上一回中分享了一个Retrofit使用错误的案例,本章回中将介绍 如何获取文件读写权限。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概念介绍 我们在本章回中说的文本读写权限是指读写手机中的…

说说你对树的理解?相关的操作有哪些?

一、是什么 在计算机领域&#xff0c;树形数据结构是一类重要的非线性数据结构&#xff0c;可以表示数据之间一对多的关系。以树与二叉树最为常用&#xff0c;直观看来&#xff0c;树是以分支关系定义的层次结构 二叉树满足以下两个条件&#xff1a; 本身是有序树树中包含的…

在Linux系统中设定延迟任务

一、在系统中设定延迟任务要求如下&#xff1a; 要求&#xff1a; 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…

OpenAI Token计算方式

如果用 ChatGPT API 去做问答的话是需要付费的&#xff0c;OpenAI 的收费方式是通过 token 数量进行收费&#xff0c;API 价格根据不同模型有所不同&#xff0c;可以看到 GPT4 最贵&#xff0c;GPT3.5 最便宜。这让我想起以前用 Aliyun 中台&#xff0c;每个 SQL 都有个运行价格…

部署Zabbix5.0

一.部署zabbix客户端 端口号10050 zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。 zabbix 服务端 zabbix_server 默认使用 10051 端口&#xff0c;客户端 zabbix_agent2 默认使用 10050 端口。 1.1.关闭防火墙和selinux安全模块 systemctl disable --now fir…

数据库工具解析之 OceanBase 数据库导出工具

背景 大多数的数据库都配备了自己研发的导入导出工具&#xff0c;对于不同的使用者来说&#xff0c;这些工具能够发挥不一样的作用。例如&#xff1a;DBA可以使用导数工具进行逻辑备份恢复&#xff0c;开发者可以使用导数工具完成系统间的数据交换。这篇文章主要是为OceanBase…

Linux——操作系统与进程基本概念

Linux——操作系统与进程基本概念 文章目录 Linux——操作系统与进程基本概念一、冯诺依曼体系结构二、操作系统2.1 OS层次图2.2 操作系统的作用2.3 管理的理解 三、进程3.1 进程的概念3.2 描述进程—PCB3.3 PCB的内容3.3.1 查看进程3.3.2 标识符3.3.3 状态3.3.4 程序计数器3.3…

react中关于类式组件和函数组件对props、state、ref的使用

文章中有很多蓝色字体为扩展链接&#xff0c;可以补充查看。 常用命令使用规则 组件编写方式: 1.函数式 function MyButton() { //直接return 标签体return (<>……</>); }2.类 class MyButton extends React.Component { //在render方法中&#xff0c;return…

matlab关于COE文件之读取操作

平台&#xff1a;matlab2021b 场景&#xff1a;在使用fir滤波器后&#xff0c;我们使用matlab生成coe文件后。在xilinx新建IP的后&#xff0c;数据流经过FIR的IP核后数据位宽变宽。这时候我们需要对数据进行截位。这时候需要读取coe文件求和后&#xff0c;计算我们需要截位的位…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

数据加密、文档加密为什么都选择安企神软件

数据加密、文档加密为什么都选择安企神软件 免费试用安企神 在数据加密和文件加密领域&#xff0c;有众多优秀的软件&#xff0c;他们功能各异、价格不同、效果也大相径庭&#xff0c;经过对比使用、用户口碑和技术网站评判&#xff0c;安企神在各方面都稳坐第一把交易。其原…

笔记强训 || NC313 两个数组的交集 || 哈希表/去重+排序+遍历查找+插入ret

题目解析 两个不同整数数组&#xff0c;其中两个数组均是无序且有多个重复项。找到两个数组中的公共元素并返回。此时&#xff0c;需要注意&#xff0c;返回值中并没有重复项&#xff0c;也就是如果数据均一致&#xff0c;返回一个数字即可。 算法原理 思路 就是将一个数组…