Unity3d Shader篇(十五)— 激光扫描效果

文章目录

  • 前言
  • 一、什么是X射线或激光扫描效果?
    • 1. X射线或激光扫描效果原理
    • 2. X射线或激光扫描效果优缺点
        • 优点:
        • 缺点:
  • 二、使用步骤
    • 1. Shader 属性定义
    • 2. SubShader 设置
    • 3. 渲染 Pass
    • 4. 定义结构体和顶点着色器函数
    • 5. 片元着色器函数
  • 三、效果
  • 四、总结


前言

在图形渲染中,X射线或激光扫描效果常用于突出显示特定物体的轮廓或边缘。通过调整光线与表面的夹角,可以产生类似于医学X射线或科幻风格的扫描效果。本文将介绍如何使用Unity Shader编写实现X射线或激光扫描效果的Shader。


一、什么是X射线或激光扫描效果?

1. X射线或激光扫描效果原理

X射线或激光扫描效果是一种通过计算光线与物体表面的夹角来产生特殊视觉效果的渲染技术。当光线与表面垂直或接近垂直时,表面会呈现出更亮的效果,而当光线与表面较平行时,则会呈现出更暗的效果。这种效果常被用于突出显示物体的边缘或轮廓,使得物体看起来更加立体和有质感。

2. X射线或激光扫描效果优缺点

优点:

突出轮廓: X射线或激光扫描效果能够有效地突出物体的轮廓或边缘,使得物体在视觉上更加清晰和立体。

增强质感: 通过调整光线与表面的夹角,可以使物体表现出更丰富的质感和纹理,增强视觉效果。

广泛应用: X射线或激光扫描效果在医学、科学、游戏、艺术等领域都有广泛的应用,能够满足不同领域的需求。

缺点:

计算复杂度高: 实现X射线或激光扫描效果需要对光线与表面的交互进行复杂的计算,对硬件性能要求较高。

可能造成视觉混淆: 如果不恰当地使用X射线或激光扫描效果,可能会造成视觉混淆或干扰,影响用户体验。

需要精细调节: 要达到理想的效果,需要对X射线或激光扫描效果的参数进行精细调节,需要一定的经验和技巧。

二、使用步骤

1. Shader 属性定义

// 定义属性
Properties {

	_XRayColor("XRayColor",Color)=(1,1,1,1) // X射线颜色
	_XRayPower("XRayPower",Range(0.001,3))=1 // X射线强度
}

2. SubShader 设置

SubShader
{
    Tags
    {

        // 在其他不透明物体后面渲染
        "Queue"="Geometry+1000"
    }
    
    LOD 100 // 细节级别
}

3. 渲染 Pass

Pass
{
	Tags
    {
        //关闭阴影
        "ForceNoShadowCasting" = "true"
    }
    // 混合模式,指定如何将当前像素的颜色与已存在的颜色进行混合。
    // SrcAlpha表示使用源颜色的Alpha值作为混合因子,One表示使用目标颜色的Alpha值作为混合因子
    Blend SrcAlpha One
    // 深度测试模式,指定在绘制当前像素时如何与深度缓冲区中的值进行比较
    // Greater表示只有当前像素的深度值大于深度缓冲区中的值时,才进行绘制
    ZTest Greater
     // 深度写入模式,指定是否将当前像素的深度值写入深度缓冲区。Off表示不进行深度写入,即只进行深度测试而不修改深度缓冲区中的值
    ZWrite Off
    CGPROGRAM
    
    #pragma vertex vert
    #pragma fragment frag

    // 包含Unity CG库
    #include "UnityCG.cginc"
    // 包含光照CG库
    #include "Lighting.cginc"

    fixed4 _XRayColor; // X射线颜色
    float _XRayPower; // X射线强度


}

这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert#pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。

然后,我们包含了 UnityCG.cgincLighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。

4. 定义结构体和顶点着色器函数

// 定义结构体:从顶点到片元的数据传递
struct v2f {
	float4 vertex: SV_POSITION; // 顶点位置
	float3 viewDir : TEXCOORD0; // 视角方向
	float3 normal : TEXCOORD1; // 法线
};

// 顶点着色器函数
v2f vert(appdata_base v) {
	v2f o;
	o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间
	o.normal = v.normal; // 保存法线

	o.viewDir = ObjSpaceViewDir(v.vertex); // 计算视角方向
	return o;
}

顶点位置变换: 将顶点从对象空间转换到裁剪空间,即将其位置从模型坐标系转换到屏幕坐标系,以便进行后续的投影和视口变换。

法线计算: 计算每个顶点的法线向量,用于后续的光照计算和视角计算。

视角方向计算: 计算每个顶点到观察者(摄像机)的方向向量,用于后续的光照和视角效果计算。

5. 片元着色器函数

// 片元着色器
fixed4 frag(v2f i): SV_Target {
	fixed3 viewDir = normalize(i.viewDir); // 视角方向单位化
	fixed3 normal = normalize(i.normal); // 法线单位化

	// 计算X射线效果
	float rim = 1 - dot(viewDir, normal); // 计算视角与法线的夹角余弦值
	return _XRayColor * pow(rim, 1 / _XRayPower); // 返回X射线颜色乘以rim的幂值
}

插值属性获取: 从顶点着色器中获取插值后的顶点属性,如法线向量、纹理坐标等。

光照计算: 根据顶点的法线向量和光照信息,计算每个像素的光照效果,包括漫反射、镜面反射等。

视角效果计算: 根据视角方向和表面法线的夹角,计算视角效果,如反射、折射等。

三、效果

在这里插入图片描述

四、总结

X射线或激光扫描效果是一种常用的渲染技术,通过模拟光线与物体表面的交互,产生特殊的视觉效果。

虚拟现实和增强现实应用: 在虚拟现实和增强现实应用中,X射线或激光扫描效果可以用于模拟扫描环境或物体的视觉效果,增强用户体验和沉浸感。

医学模拟和教育: 在医学模拟和教育领域,可以利用X射线或激光扫描效果来模拟医学影像学中的扫描过程,让学生或医护人员更直观地了解诊断过程和结果。

游戏开发: 在游戏开发中,X射线或激光扫描效果可以用于创造具有科幻或医疗主题的场景和道具,增加游戏的视觉吸引力和趣味性。

工业模拟和培训: 在工业模拟和培训领域,可以利用X射线或激光扫描效果来模拟工业设备的操作和检测过程,提高培训的真实感和效果。

艺术创作: 在数字艺术创作中,X射线或激光扫描效果可以用于创作具有科幻或奇幻风格的艺术作品,丰富作品的视觉效果和表现形式。

总的来说,Unity中实现的X射线或激光扫描效果可以应用于多个领域,包括虚拟现实、医学教育、游戏开发、工业模拟等,为相关领域的应用和创作提供了新的视觉体验和可能性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Labelme

文章目录 前言一、遇到问题二、排查问题1.分析问题2.验证问题2.1对比两者,格式是一致的,唯一不同之处是imagePath 不一样,labelme 生成的是图片的名称,不包含路径;而自动生成的是完整路径的图片名称。2.2再次思考两者的…

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启,重启es即可 ./bin/elasticsearch-pl…

【AI论文阅读笔记】ResNet残差网络

论文地址:https://arxiv.org/abs/1512.03385 摘要 重新定义了网络的学习方式 让网络直接学习输入信息与输出信息的差异(即残差) 比赛第一名1 介绍 不同级别的特征可以通过网络堆叠的方式来进行丰富 梯度爆炸、梯度消失解决办法:1.网络参数的初始标准化…

C++ 拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1. 引入 2. 拷贝构造的概念 3. 浅拷贝 4. 深拷贝 二. C运算符重载 1. 概念 2. 注意事项 3.举例 一. 拷贝构造函数 1. 引入 我们在创建对象时,能不能创建一个与原先对象一模一样的新对象呢?为了解决这个问题&#x…

C++——类和对象(2)

1. 类的6个默认成员函数 当一个类中什么都没有&#xff0c;编译器会帮类自动生成6个默认成员函数例如&#xff1a; class Date {}; 此篇文章主要围绕构造函数与析构函数进行讲解。 2. 构造函数 2.1 概念 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> usi…

如何零基础入门Prometheus

本公众号的精品教程《玩转Prometheus监控》是一套零基础的入门教程&#xff0c;基于多年实战经验编写而成&#xff0c;内容完整覆盖了产品的核心技术要点&#xff0c;适合想入门和进阶技术的朋友学习。 整个系列总共24篇课程&#xff0c;由基础知识开始&#xff0c;逐步进阶学…

复现文件上传漏洞

一、搭建upload-labs环境 将下载好的upload-labs的压缩包&#xff0c;将此压缩包解压到WWW中&#xff0c;并将名称修改为upload&#xff0c;同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入&#xff1a;127.0.0.1/upload进入靶场。 第一关 选择上传文件…

webpack5零基础入门-8清空前次打包文件与处理图标字体资源

1.配置output中的clean属性为true output: {/**文件输出路径 绝对路径*///__dirname 表示当前文件的文件夹目录path: path.resolve(__dirname, dist),//所有文件的输出目录/**文件名 */filename: static/js/dist.js,//入口文件输出文件名clean: true,//在打包前将path整个目录内…

【学习笔记】红队视角下的windows应急响应

1. 上线的方法 exe上线→开360晶核的情况比较困难 2&#xff09;白加黑 接下来的讲解就是基于白加黑上线&#xff0c;看如何应对应急 2. 演示 360环境启动 shell whoami →死 -beacon 如何去查杀 看外联&#xff1a; netstat -ano 提取IP 威胁情报api调用→查是否是恶意…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本&#xff0c;设置文本内容颜色 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用…

设备维修带来的无限价值——易点易动设备管理系统的优势

在化工工厂中&#xff0c;设备的正常运行是保障生产顺利进行的关键。然而&#xff0c;设备难免会出现故障和损坏&#xff0c;而及时有效的设备维修对于提高生产效率和降低成本至关重要。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其卓越的功能和…

TEASEL: A transformer-based speech-prefixed language model

文章目录 TEASEL&#xff1a;一种基于Transformer的语音前缀语言模型文章信息研究目的研究内容研究方法1.总体框图2.BERT-style Language Models&#xff08;基准模型&#xff09;3.Speech Module3.1Speech Temporal Encoder3.2Lightweight Attentive Aggregation (LAA) 4.训练…

前端实例:页面布局1(后端数据实现)

效果图 注&#xff1a;这里用到后端语言php&#xff08;页面是.php文件&#xff09;,提取纯html也可以用 inemployee_index.php <?php include(includes/session.inc); $Title _(内部员工首页); $ViewTopic 内部员工首页; $BookMark 内部员工首页; include(includes/…

vue3动态组件未渲染问题

渲染问题 component动态组件写法与vue2写法一致&#xff0c;代码如下&#xff1a; <component :is"componentName"/><script setup>import { ref } from vueimport account from ./user/account.vue// 组件名称const componentName ref(account)// 点击…

Linux arrch64系统架构 py文件运行时的编码问题解决

问题&#xff1a; 因为要测试一些东西&#xff0c;所以必须有中文数据来做支撑&#xff0c;之前用的架构是x86&#xff0c;现在一个服务器的架构为arrch64&#xff0c;下列编码都挨个都进行声明&#xff0c;但是无法解决问题&#xff0c;总是报错 # -*- coding: gbk -*- # -*…

数组的大小与元素的个数

一、数组的大小 数组一旦声明&#xff0c;大小就确定了&#xff0c;无论元素是否填充 以大括号声明的数组&#xff0c;数组大小和大括号中元素的数量是一致的 以双引号字符串声明的字符数组&#xff0c;数组大小比字符的个数多一个 sizeof(数组名)得到的是元素类型所占字节…

一行代码极速部署:打造面向开发者的流计算平台

作者&#xff1a;Yingjun Wu TL;DR. curl https://risingwave.com/sh | sh在2021年初&#xff0c;我创立了RisingWave&#xff0c;目标是推广流计算技术的普及。在过去的三年中&#xff0c;我不断的向市场布道RisingWave&#xff0c;希望RisingWave能够在流计算这一市场中占…

精简版 Obsidian 图床配置 PicGo+ gitee

精简版 Obsidian 图床配置 PicGo gitee 图床的作用 图床&#xff08;Image Hosting Service&#xff09;是一种在线服务&#xff0c;用于存储和托管用户上传的图片文件。用户可以将图片上传到图床服务器&#xff0c;并获得一个可访问的图片链接&#xff0c;然后可以在网页、博…

【Stable Diffusion】入门-01:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

谷歌的后量子密码学威胁模型

1. 引言 若现在不使用量子安全算法来加密数据&#xff0c;能够存储当前通信的攻击者最快十年内就能对其解密。这种先存储后解密的攻击是当前采用后量子密码学 (post-quantum cryptography&#xff0c;PQC) 背后的主要动机&#xff0c;但其他未来的量子计算威胁也需要一个深思熟…