Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录

前言

 一、表面着色器的补充介绍

二、案例viewDir详解

1.viewDir是什么

2.viewDir的作用

3.使用viewDir写shader


前言

注意观察的小伙伴会发现,这组教程前半部分我们在编写着色器的时候,用的是顶点着色器和片元着色器的组合。

SubShader
    {
            CGPROGRAM
            #pragma vertex vert      //顶点着色器
            #pragma fragment frag    //片元着色器
 
            #include"UnityCG.cginc"
 
            //顶点着色器方法
            appdata_base vert(appdata_base v)
            {
            return v;
            }
             
            //片元着色器方法
            float4 frag(appdata_base v):SV_TARGET
            {
            }
            ENDCG
    }

最近的两个教程,用的是表面着色器

    SubShader
    {
        CGPROGRAM
        #pragma surface surf Standard
        //给表面着色器配的输入结构体
        struct Input
        {

        }; 
        //表面着色器
        void surf (Input IN, inout SurfaceOutputStandard o)
        {

        }
        ENDCG
    }

以上就是内置着色器最常用的两种自定义组合。


如果你还发现了,表面着色器会比顶点着色器用起来简单一点。

unity官方也是这么说的:表面着色器是一种代码生成方法,与使用低级顶点/像素着色器程序顶点/像素着色器程序相比,可以更轻松地编写光照着色器。


 一、表面着色器的补充介绍

前面写的表面着色器,都是从Unity的资源里拿东西,然后直接输出出去,其实,表面着色器本身,也提供了一些可以让你取用的数据。

以下是官方说明,我知道你们可能看不懂,你们可以随便逛逛,现在知道有这么个东西先。

        struct Input
        {
            float3 viewDir      //包含视图方向,用于计算视差效果、边缘光照等等。
            具有 COLOR 语义的 float4 - 包含插值的每顶点颜色。
            float4 screenPos    //包含反射或屏幕空间效果的屏幕空间位置。请注意,这不适合 GrabPass;您需要使用 ComputeGrabScreenPos 函数自己计算自定义 UV。
            float3 worldPos     //包含世界空间位置。
            float3 worldRefl    //在_表面着色器不写入 o.Normal_ 的情况下,包含世界反射矢量。有关示例,请参阅反光漫射 (Reflect-Diffuse) 着色器。
            float3 worldNormal  // 在_表面着色器不写入 o.Normal_ 的情况下,包含世界法线矢量。
            float3 worldRefl;   // INTERNAL_DATA - 在_表面着色器写入 o.Normal_ 的情况下,包含世界反射矢量。要获得基于每像素法线贴图的反射矢量,请使用 WorldReflectionVector (IN, o.Normal)。有关示例,请参阅反光凹凸 (Reflect-Bumped) 着色器。
            float3 worldNormal; // INTERNAL_DATA - 在_表面着色器写入 o.Normal_ 的情况下,包含世界法线矢量。要获得基于每像素法线贴图的法线矢量,请使用 WorldNormalVector (IN, o.Normal)。
        };

这里需要学到的知识点是,不同于顶点着色器需要用语义去获取数据,表面着色器当你创建了对应的Input结构体,就可以直接获取到一些数据。当你看见写“包含”,就说明,你满足他的条件以后,这个数就是直接有数据的,如果没有条件,就是写在Input里就直接有数据。

二、案例viewDir详解

这次就讲一个viewDir,这个比较常用。

数学知识部分,我就直接略过,如果没太懂,到时候查阅这文章就可以了。

Unity | Shader基础知识番外(向量数学知识速成)_shader 叉乘-CSDN博客


1.viewDir是什么

viewDir的直接翻译是视图直线,可以暂时理解为射到人眼中的向量(如图1所示)。

图1 反射光线

 图中的小女孩,如果把眼睛转个方向,就看不见书本了。眼睛看见的那个方向的向量,就是视图viewDir。

2.viewDir的作用

如果我们想写一个球,你面对它的时候才能看见它的颜色,否则看不见。(如图2所示)

图2 只有面对我们才能看见的图
3.使用viewDir写shader

 viewDir是一个向量,当它和法线向量点乘时:

答案>0 在该点的正对面

答案=0 和该点成90度

答案<0 和该点大于90度(在这个情况下,一般就是看不见了)

Shader "Custom/009"
{
    Properties
    {
    //放图片进入
    _MainTex("MainTex",2D)="white"{} 
    }

    SubShader
    {

    CGPROGRAM
    #pragma surface surf Lambert

    sampler2D _MainTex;

    struct Input
    {
        float2 uv_MainTex;
        //直接获取viewDir
        float3 viewDir;
    };

    void surf(Input IN,inout SurfaceOutput o)
    {
                    //点乘在shader里的写法
        half dotp =dot(IN.viewDir,o.Normal);
                                               //如果大于0才会显示颜色,否则是黑色
        o.Albedo =tex2D(_MainTex,IN.uv_MainTex).rgb*dotp;
    }

    ENDCG
    }
}

三、作者的话

shader系列暂时告一段落,如果有粉丝宝宝问,我也会更新相关内容,有粉丝建议我更新Dotween动画讲解,后面应该会写这一方面。

大家有什么建议可以评论,可以发私信,我会根据大家的意见去更新文章,非常感谢大家的喜爱。

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

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

相关文章

Java转Kotlin

Kotlin 是一种静态编程语言 2011JetBrains开始开发Kotlin&#xff0c;用于多平台应用&#xff08;能脱离虚拟机&#xff0c;直接编译成可以在win,mac,linux运行的二进制代码&#xff09; 2017获得谷歌官方支持 语法简洁&#xff08;减少了大量的样板代码&#xff0c;语法糖&…

【Python深度学习(第二版)(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

服务器端口怎么查,服务器端口查看方法详解

服务器端口是网络通信的关键组件&#xff0c;对于网络管理员和系统管理员来说&#xff0c;了解和掌握如何查看服务器端口是非常重要的。接下来介绍两种常用的方法来查看服务器端口。 方法一&#xff1a;使用命令提示符&#xff08;CMD&#xff09; 1. 首先&#xff0c;点击电脑…

JavaScript百炼成仙自学笔记——12

函数七重关之五&#xff08;自执行函数&#xff09; 什么时候用它&#xff1f; 很多时候&#xff0c;我们只想执行一个函数&#xff0c;却无所谓这个函数叫什么名字。那么这种情况下就可以考虑使用自执行函数。 {function(){console.log(123);} }(); 这就是一个简单的自执行的…

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中&#xff0c;除了对视频本身的编辑和修改&#xff0c;元数据的管理和修改同样重要。元数据&#xff0c;如标题、艺术家、专辑封面等&#xff0c;不仅提供了视频文件的基本信息&#xff0c;还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

dumpsys meminfo 流程中细节

源码基于&#xff1a;Android U 参考&#xff1a; dumpsys meminfo 详解(R) dumpsys meminfo 详解(U) 1. 命令入口 MemBinder frameworks/base/services/core/java/com/android/server/am/AMS.javastatic class MemBinder extends Binder {ActivityManagerService mActivity…

原型模式和建造者模式

1、原型模式 1.1 概念 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 1.2 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。 具体原型类&#xff1a;实现抽…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

二.Django--创建多个APP路由映射

目录 1-创建项目 2-创建多个APP 3-注册APP 4-创建"前端页面"并做路由映射 各个APP里面的views.py写视图函数等等 1-创建项目 django-admin startproject 项目名 django-admin startproject my_project 2-创建多个APP python manage.py startapp app名 pyth…

HttpCilent进行Post请求form-data接口,服务方接收不到参数

结论先行 生成分隔标识boundary在HttpPost中设置Header时带上boundary创建MultipartEntity时需要设置boundary 实现代码如下 /*** param url 调用接口的地址* param paramMap 调用接口传入的方法体参数*/ public static String postDataByFormData(String url, Map<Strin…

【参赛总结】第二届云原生编程挑战赛-冷热读写场景的RocketMQ存储系统设计 - Nico

关联比赛: 2021第二届云原生编程挑战赛1&#xff1a;针对冷热读写场景的RocketMQ存储系统设计 引子 在一个浑浑噩噩的下午&#xff0c;百无聊赖的我像往常一样点开了划水交流群&#xff0c;细细品味着老哥们关于量子力学的讨论。嬉戏间&#xff0c;平常水不拉几的群友张三忽…

【毕业设计】基于SSM的运动用品商城的设计与实现

1.项目介绍 在这个日益数字化和信息化的时代&#xff0c;随着人们购物习惯的转变&#xff0c;传统的实体商店已经无法满足人们日益增长的在线购物需求。因此&#xff0c;基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的运动用品商城项目应运而生&#xff0…

OpenGL 入门(二)—— 渲染摄像头采集的预览画面

本篇主要内容&#xff1a; 将摄像头采集到的图像通过 OpenGL 绘制到屏幕上FBO 离屏渲染 在开始上述流程前&#xff0c;我们有必要对 SurfaceTexture 做一个简单了解&#xff0c;因为 OpenGL 需要通过它获取要绘制的图像。 1、认识 SurfaceTexture SurfaceTexture 是 Androi…

【XR806开发板试用】XR806与鸿蒙,创建任务,串口转发TCPServer收到的数据

很荣幸获得评测开发板的机会&#xff0c;XR806的程序资料做的还是挺不错的。 目标&#xff1a; 1、学习用鸿蒙创建2个任务&#xff1b; 2、创建TCP Server收发数据。 任务ledThread&#xff1a;LED每秒亮灭一次&#xff0c;代表程序在运行。 任务MainThread&#xff1a;创建TCP…

Leetcode—377. 组合总和 Ⅳ【中等】

2024每日刷题&#xff08;124&#xff09; Leetcode—377. 组合总和 Ⅳ 算法思想 实现代码 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned long long>dp(target 1);dp[0] 1;for(int i 1; i < target;…

echarts柱状图实现左右横向对比

实现效果如上图 其实是两组数据&#xff0c;其中一组数据改为负数&#xff0c;然后 在展示的时候&#xff0c;在将负数取反 第一处修改坐标轴 xAxis: [{type: value,axisLabel: {formatter: function (value) {if (value < 0) {return -value;}else{return value;}}}}], 第…

如何修改图片大小?调整图片大小的几个方法介绍

当我们在不同的应用场景中使用图片的时候&#xff0c;常常会需要去调整图片尺寸来适应不同的要求&#xff0c;还有图片体积大小也会有要求&#xff0c;这时候就需要用到我们今天分享的这款图片在线处理工具了&#xff0c;不管是图片改大小或者图片压缩它都能快速解决&#xff0…

LVGL移植到STM32F4

1、LVGL简介 LittlevGL是一个免费的开源图形库&#xff0c;提供了创建嵌入式GUI所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 1.1、LVGL特点 强大的构建模组&#xff1a;按钮、图表、列表、滑块、图像等先进的图形&#xff1a;动画、反锯齿…

【热门话题】ElementUI 快速入门指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ElementUI 快速入门指南环境准备安装 ElementUI创建 Vue 项目安装 ElementUI 基…

自然语言(NLP)

It’s time for us to learn how to analyse natural language documents, using Natural Language Processing (NLP). We’ll be focusing on the Hugging Face ecosystem, especially the Transformers library, and the vast collection of pretrained NLP models. Our proj…