Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器

  • 一、编译指令
    • 1.表面函数
    • 2.光照函数
    • 3.其他可选参数
  • 二、两个结构体
    • 1.Input 结构体:数据来源
    • 2.SurfaceOutput
  • 三、Unity背后做了什么
  • 四、表面着色器的缺点

一、编译指令

  • 作用:指明该表面着色器的 表面函数光照函数,并设置一些可选参数

#pragma surface surfaceFunction lightMode [optionalparams]:#pragma surface 用于指明该编译指令是用于定义表面着色器的,后面需要指明表面函数(surfaceFunction)和光照模型( lightMode),以及一些可选的参数

1.表面函数

surfaceFunction 用于定义对象的表面属性(反射率、光滑度、透明度等),通常是名为 surf 的函数(名字可以任意),格式是固定的

void surf(Input IN, inout SurfaceOutput o)
void surf(Input IN, inout SurfaceOutputStandard o)
void surf(Input IN, inout SurfaceOutputStandardSpecular o)
  • 输入结构体 InputIN 来设置表面属性,并存储在结构体 SurfaceOutput、SurfaceOutputStandard、SurfaceOutputStandardSpecular 中(都是Unity内置结构体),再传递给光照函数计算光照结果

2.光照函数

使用表面函数中设置的各种表面属性,来应用某些光照模型。Unity内置了基于物理的光照模型函数 Standard 和 StandardSpecular( UnityPBSLighting.cginc),以及简单的非基于物理的光照模型函数 Lambert 和 Blinn-Phong(Lighting.cginc)

  • 定义自己的光照函数
half4 Lighting<NAME> (SurfaceOutput s, half3 lightDir, half atten);
half4 Lighting<NAME> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);

3.其他可选参数

  • 自定义的修改函数顶点修改函数(vertex:VertexFunction)最后颜色修改函数(finalColor:ColorFunction)
    • 顶点修改函数:自定义顶点属性(顶点颜色传递给表面函数、修改顶点位置、实现顶点动画等)
    • 最后颜色修改函数:在颜色绘制到屏幕前,最后一次修改颜色值(实现自定义雾效等)
  • 阴影
    • addshadow:会为表面着色器生成一个阴影投射的Pass
    • fullforwardshadow:可以在前向渲染中支持所有光源类型的阴影
    • noshadow:禁用阴影
  • 透明度测试和透明度混合alphatestalpha
  • 光照:控制光照对物体的影响
    • noambient:不应用任何环境光照或光照探针
    • novertexlights不应用任何逐顶点光照
    • noforwardadd:去掉前向渲染中的额外Pass,只支持一个逐像素的平行光,其他光源会逐顶点或SH方法来计算
    • nolightmap、nofog等
  • 控制代码生成:可以控制只使用前向或者延迟(Unity会为表面着色器生成前向渲染路径和延迟渲染路径用的Pass)exclude_path:deferred、exclude_path:forward和exclude_path:prepass

二、两个结构体

1.Input 结构体:数据来源

在这里插入图片描述
还支持自定义变量,采样坐标必须以uv为前缀,比如 uv_MainTex

2.SurfaceOutput

SurfaceOutput、SurfaceOutputStandard、SurfaceOutputStandardSpecular 会作为表面函数的输出,光照函数的输入来进行光照计算

  • SurfaceSurfaceOutput
struct SurfaceOutput{fixed3 Albedo;fixed3 Normal;fixed3 Emission;half Specular;fixed Gloss;fixed Alpha;
};
  • SurfaceOutputStandard、SurfaceOutputStandardSpecular:用于基于物理的光照模型
struct SurfaceOutputStandard{fixed3 Albedo;fixed3 Normal; //tangent space normal half3 Emission;half Metallic; //0=non-metal,1=metalhalf Smoothness; //0=rough,1=smoothhalf Occlusion;fixed Alpha;
};
struct SurfaceOutputStandardSpecular{fixed3 Albedo;fixed3 Specular;fixed3 Normal; //tangent space normal half3 Emission;half Smoothness; //0=rough,1=smoothhalf Occlusion;fixed Alpha;
};

三、Unity背后做了什么

Unity背后会为表面着色器生成真正的一个包含多个Pass(针对不同渲染路径的)的顶点/片元着色器。会为前向渲染路径生成LightMode为ForwardBase和ForwardAdd的Pass;为延迟渲染路径生成LightMode为Deferred的Pass;为了给光照映射和动态全局光照提取表面信息,Unity会生成LightMode为Meta的Pass

  • Unity对ForwardBase的Pass的自动生成过程如下:
    在这里插入图片描述
  • 1.Unity会分析代码,据此生成顶点着色器的输出——v2f_surf结构体。Unity会分析我们在自定义函数中使用的变量,如果需要,就会在v2f_surf中生成相应的变量。有时在Input中定义了某些变量,但后面并没有使用时,v2f_surf不会生成
  • 2.生成顶点着色器
  • 3.生成片元着色器:使用v2f_surf来填充Input

四、表面着色器的缺点

  • 在表面着色器上完成的,都可以在顶点/片元着色器中重现,但反之不成立
  • 性能较差:失去了对各种优化和各种特效实现的控制
  • 无法完成自定义的渲染效果:玻璃等

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Chrome 浏览器在链接上点右键的快捷键

如今&#xff0c;越来越多的软件都懒得设个快捷键&#xff0c;就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

一款异次元小清新风格的响应式wordpress个人博客主题

一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题&#xff0c;整体布局简洁大方&#xff0c;针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净&#xff0c;简单且响应迅速的博客主题&#x…

iOS开发设计模式篇第一篇MVC设计模式

目录 1. 引言 2.概念 1.Model 1.职责 2.实现 3.和Controller通信 1.Contrller直接访问Model 2.通过委托(Delegate)模式 3.通知 4.KVO 4.设计的建议 2.View 1.职责 2.实现 3.和Controller通信 1. 目标-动作&#xff08;Target-Action&#xff09;模式 2…

Jolt路线图

1. 引言 a16z crypto团队2024年7月更新了其Jolt路线图&#xff1a; 主要分为3大维度&#xff1a; 1&#xff09;链上验证维度&#xff1a; 1.1&#xff09;Zeromorph&#xff1a;见Aztec Labs团队2023年论文 Zeromorph: Zero-Knowledge Multilinear-Evaluation Proofs from…

什么是PCB流锡槽焊盘/C型焊盘,如何设计?-捷配笔记

在PCB进行机器组装器件时&#xff08;如波峰焊&#xff09;&#xff0c;为了防止部分需要二次焊接的元器件的焊盘堵孔&#xff0c;就需要在PCB焊盘上面开个过锡槽&#xff0c;以便过波峰焊时&#xff0c;这些焊锡会流掉。开流锡槽就是在焊盘裸铜&#xff08;敷锡&#xff09;部…

【MySQL进阶之路 | 高级篇】事务的ACID特性

1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一&#xff0c;当我们有了事务就会让数据库始终保持一致性&#xff0c;同时我们还能通过事务的机制恢复到某个时间点&#xff0c;这样可以保证给已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 基本概念 事务&…

微前端--single-spa

微前端 使用微前端的挑战&#xff1a; 子应用切换&#xff0c;应用相互隔离&#xff0c;互补干扰&#xff0c;子应用之前的通信&#xff0c;多个子应用并存&#xff0c;用户状态的存储&#xff0c;免登。 常用技术方案 路由分发式微前端 通过http服务的反向代理 http {serv…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法&#xff1a;我们得榨干这本书的知识。 带着问题 为了更好的学习&#xff0c;我们最好带着问题去探索。 第一&#xff1a;核心问题与基础知识 如上图&#xff1a;这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理&#xff1a;…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第5节-设置刻度、刻度标签和网格

微信公众号&#xff1a;御风研墨 关注可了解更多。问题或建议&#xff0c;请公众号留言 文章目录 设置刻度、刻度标签和网格应用背景准备工作操作步骤工作原理补充说明最后 设置刻度、刻度标签和网格 应用背景 在数据可视化中&#xff0c;合理设置刻度、刻度标签和网格是提高…

【BUG】已解决:libpng warning: iccp: known incorrect sRGB profile

已解决&#xff1a;libpng warning: iccp: known incorrect sRGB profile 目录 已解决&#xff1a;libpng warning: iccp: known incorrect sRGB profile 【常见模块错误】 错误原因&#xff1a; 原因分析 解决方案 具体步骤 欢迎来到英杰社区https://bbs.csdn.net/topics…

MySQL第四次作业

&#xff08;一&#xff09;建立数据库及表 &#xff08;二&#xff09;处理表 1.修改student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint 2.为Course表中Cno 课程号字段设置索引,并查看索引 3.为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引…

python每日学习12:pandas库的用法(1)

python每日学习12&#xff1a;pandas库的用法&#xff08;1&#xff09; 安装 pip install pandas设定系统环境 import pandas as pd #设定自由列表输出最多为 10 行 pd.options.display.max_rows 10 # 显示当前 Pandas 版本号 pd.__version__进入jupyter notebook 页面 在终端…

乐室预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息管理&#xff0c;乐室信息管理&#xff0c;乐器分类管理&#xff0c;乐器管理&#xff0c;乐器知识管理&#xff0c;用户管理&#xff0c;用户预约管理&#xff0c;取消预约管理&#xff0c;用…

Rust代码答疑报错|Python一对一辅导答疑

Question 你好&#xff0c;我是悦创。 学员答疑&#xff1a; https://code.bornforthis.cn/?id4e72084d-1eaf-44ed-8067-744671491574https://code.bornforthis.cn/?id664ff169-41d6-409f-a05b-02ed42279759 问题代码&#xff1a; // You can bring module paths into sc…

MongoDB文档整理

过往mongodb文档&#xff1a; https://blog.csdn.net/qq_46921028/article/details/123361633https://blog.csdn.net/qq_46921028/article/details/131136935https://blog.csdn.net/qq_46921028/article/details/139247847 1. MongoDB前瞻 1、MongoDB概述&#xff1a; MongoDB是…

分享从零开始学习网络设备配置--任务6.1 实现计算机的安全接入

项目描述 随着网络技术的发展和应用范围的不断扩大&#xff0c;网络已经成为人们日常生活中必不可少的一部分。园区网作为给终端用户提供网络接入和基础服务的应用环境&#xff0c;其存在的网络安全隐患不断显现出来&#xff0c;如非人为的或自然力造成的故障、事故&#xff1b…

手写RPC-令牌桶限流算法实现,以及常见限流算法

为什么需要服务限流、降级 分布式架构下&#xff0c;不同服务之间频繁调用&#xff0c;对于某个具体的服务而言&#xff0c;可能会面临高并发场景。在这样的情况下&#xff0c;提供服务的每个服务节点就都可能由于访问量过大而引起一系列问题&#xff0c;比如业务处理耗时过长、…

px4ctrl里calculateControl的代码解析

px4ctrl的代码里将目标加速度转成飞控的rpy的calculateControl代码 LinearControl::LinearControl(Parameter_t &param) : param_(param) {resetThrustMapping(); } quadrotor_msgs::Px4ctrlDebug LinearControl::calculateControl(const Desired_State_t &des,const …

【Apache Doris】数据副本问题排查指南

【Apache Doris】数据副本问题排查指南 一、问题现象二、问题定位三、问题处理 本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。 一、问题现象 问题日志 查询报错 Failed to initialize storage reader, tablet{tablet_id}.xxx.xxx问题说明 查…