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

本文主要是介绍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 Lambertsampler2D _MainTex;struct Input{float2 uv_MainTex;//直接获取viewDirfloat3 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动画讲解,后面应该会写这一方面。

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

这篇关于Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965422

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不