Shader的函数公式以及使用的场景

简介: Shader 是干什么的?它的作用可以先简单理解为对屏幕上的物体,进行颜色处理。而大家都知道,所有计算机,处理颜色的当然是显卡,也就是 GPU 。

Shader 是干什么的?

它的作用可以先简单理解为对屏幕上的物体,进行颜色处理。

而大家都知道,所有计算机,处理颜色的当然是显卡,也就是 GPU 。

所以我们写 Shader 的目的就是告诉 GPU ,我需要对物体的颜色,纹理,等方面,怎样处理,达到我们想要的效果。

UnityCG.cginc中一些常用的函数

//摄像机方向(视角方向)
float3 WorldSpaceViewDir(float4 v)      根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v)        模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
//光源方向
float3 WorldSpaceLightDir(float4 v)     模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v)    世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 ObjSpaceLightDir(float4 v)   模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
//方向转换
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间

什么是OpenGL、DirectX
shader可以认为是一种渲染命令 ,由opengl 或者dx进行解析,来控制渲染丰富多彩的图形

OpenGL 使用GLSL 编写shader
DirectX 使用HSSL 编写shader
英伟达 CG 编写shader(跨平台)

Unity Shader的分类
使用的是ShaderLab编写Unity中的Shader
1,表面着色器 Surface Shader
2,顶点/片元着色器 Vertex/Fragment Shader
3,固定函数着色器 Fixed Function Shader

Unityshader中属性的类型有哪些
_Color(“Color”,Color)=(1,1,1,1)
_Vector(“Vector”,Vector)=(1,2,3,4)
_Int(“Int”,Int)= 34234
_Float(“Float”,Float) = 4.5
_Range(“Range”,Range(1,11))=6
_2D(“Texture”,2D) = “red”{}
_Cube(“Cube”,Cube) = “white”{}
_3D(“Texure”,3D) = “black”{}

从应用程序传递到顶点函数的语义有哪些a2v
POSITION 顶点坐标(模型空间下的)
NORMAL 法线( 模型空间下)
TANGENT 切线(模型空间)
TEXCOORD0 ~n 纹理坐标
COLOR 顶点颜色

从顶点函数传递给片元函数的时候可以使用的语义
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个
COLOR1 可以传递一组值 4个
TEXCOORD0~7 传递纹理坐标

片元函数传递给系统
SV_Target 颜色值,显示到屏幕上的颜色

什么是光照模型
光照模型就是一个公式,使用这个公式来计算在某个点的光照效果

标准光照模型
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分
自发光
高光反射
Blinn光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和视野方向的夹角
Blinn-Phong光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是法线和x的夹角 x 是平行光和视野方向的平分线
漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向
环境光

Tags{ “LightMode”=”ForwardBase” }
只有定义了正确的LightMode才能得到一些Unity的内置光照变量

include “Lighting.cginc”

包含unity的内置的文件,才可以使用unity内置的一些变量

normalize() 用来把一个向量,单位化(原来方向保持不变,长度变为1)
max() 用来取得函数中最大的一个
dot 用来取得两个向量的点积
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0取得平行光的颜色
UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
UNITY_LIGHTMODEL_AMBIENT用来获取环境光

半兰伯特光照模型
Diffuse = 直射光颜色 *( cosθ *0.5 +0.5 )
兰伯特光照模型
Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向

shader中的各种空间坐标
http://blog.csdn.net/lyh916/article/details/50906272
什么是切线空间
http://blog.csdn.net/bonchoix/article/details/8619624

pixel = (normal+1)/2

normal = pixel*2 - 1

相关文章
|
数据采集 人工智能 搜索推荐
AI战略丨构建高效新一代 AI 应用:从技术选型到落地实践
从概念构想走向高效应用,新一代 AI 应用的落地过程涉及多重技术关键。
|
1月前
|
网络协议 Unix iOS开发
Wireshark 4.6.0 发布 - 网络协议分析器
Wireshark 4.6.0 发布 - 网络协议分析器
428 0
Wireshark 4.6.0 发布 - 网络协议分析器
|
7月前
|
JSON 数据挖掘 API
深入研究:京东店铺所有商品API详解
本文介绍了一款强大的工具——京东店铺所有商品API,它可以帮助用户批量获取指定京东店铺的商品详细信息。通过传入店铺ID,API可返回包括商品名称、价格、库存、销量等在内的多维度数据,响应格式为JSON。文章还提供了Python调用示例,利用`requests`库完成签名生成与数据请求,助力商家管理店铺、开发者构建应用及数据分析人员挖掘商业价值,极大提升电商运营效率。
241 16
|
6月前
|
人工智能 安全 Go
Go语言中 Mutex 的实现原理
本文深入解析了 Go 中 `sync.Mutex` 的实现原理及其工作机制。`Mutex`(互斥锁)是并发编程中的基础同步机制,用于保护共享资源不被多个 Goroutine 同时访问。Go 的 `sync.Mutex` 通过轻量级的结构体实现,包含 `state` 和 `sema` 两个字段,分别用于表示锁状态和管理 Goroutine 的阻塞与唤醒。 文章详细分析了锁的获取(`Lock()`)和释放(`Unlock()`)过程,包括快速路径和慢速路径的实现逻辑。在慢速路径中,介绍了自旋锁优化、饥饿模式以及信号量机制的应用,确保高效且公平地管理锁竞争。
167 6
|
9月前
|
机器学习/深度学习 人工智能 缓存
探秘 DeepSeek:那些你必须了解的事
DeepSeek是一家由中国幻方量化支持的创新型AI公司,专注于开发高性能、低成本的大语言模型。其独特的技术路径打破了参数规模、能耗成本和认知可靠性之间的“三元悖论”,实现了在单张显卡上运行170亿参数模型的突破。DeepSeek通过开源策略和高性价比模型(如DeepSeek-R1),大幅降低了AI应用门槛,推动了全球开发者社区的发展。其应用场景广泛覆盖教育、医疗、金融等领域,显著提升了工作效率和服务质量。DeepSeek的成功不仅在于技术创新,更在于其开放合作的理念,正引领AI行业的新变革。
1478 9
探秘 DeepSeek:那些你必须了解的事
|
9月前
一文彻底搞定电容元件
电容元件是电路中储存电荷的基本组件,通常用“C”表示,单位为法拉(F),常见单位有微法(μF)、纳法(nF)和皮法(pF)。电容具有“通交流,隔直流”的特性,主要用于储能、滤波、耦合与隔直等。根据安装方式可分为固定电容、可变电容和微调电容。其主要参数包括电容值、额定电压和损耗因数。电容广泛应用于电源滤波、信号处理及脉冲电路等领域。
824 0
|
API
如何在公众号里制作微信报名表
微信万能表单不仅可以制作各种报名单,也可以用作问卷调查,商品发布,登记汇总等,可以根据自己需求,来添加组件,比如姓名、手机号、性别、报名的时间、报名的图片等,因为微信报名表涉及的用途比较广泛,所以很多商家在做微信公众号报名表的时候,针对性不会太强,没有什么局限性,应用还是起来比较方便的
576 12
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT的名字由
【10月更文挑战第13天】
473 0
|
存储 编译器
C51汇编程序
C51汇编程序
316 5
|
关系型数据库 MySQL 数据库
LinkStack:优雅的外观,强大的功能,完美地融合了书签管理与分享
发现有趣GitHub项目LinkStack,它创建了一个个性化页面,用于分享多个链接,类似Linktree,但更灵活,允许用户自托管。项目已获2k星。通过Docker Compose部署简单,包括创建docker-compose.yml文件,启动服务,复制持久化目录并挂载。配置涉及语言选择、数据库设置、账号创建和系统配置。支持添加、删除链接,自定义主题,以及上传背景图。LinkStack是管理多链接的有效工具,有望进一步发展。
431 2