Unity Shader零基础入门1:纯色物体

2023-11-21 21:20

本文主要是介绍Unity Shader零基础入门1:纯色物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shader又叫着色器,控制着颜色的显示。即可以让模型显示出贴图的颜色,也可以显示出金属的光泽、通过法线贴图增加模型的细节等。

先在场景中新建一个物体,然后在工程面板新建一个材质,给物体换上这个材质,然后我们就可以在属性面板为这个物体更换shader了。系统自带了很多shader,它们有不同的显示效果,可以更换着试试看。

我们开始创建第一个shader。在工程面板中Create-Shader-Standard Surface Shader创建一个shader文件。

和c#脚本一样,创建后可以给shader一个新文件名。

之后双击该脚本即可打开。如果你没有修改过设置,一般会默认直接用vs打开和编辑。但我改成了vs code。如果你也准备用vs code,可以安装这几个我安装了的插件:

 

相对于c#,写shader时的辅助功能是非常不完善的。比如不会直接提示语法错误,需要运行才能知道是否有问题。用vs code等工具相对vs舒服点,但依然不能直接提示语法错误。这个只能自己适应一下了……

我们先了解一下Shader的基本结构:

首先是属性(Properties),里面填的就是需要直接在unity的面板中修改的内容。比如需要用哪张贴图、显示什么颜色。

然后是一个或多个子着色器(SubShader),但只有一个会执行。比如有的显卡可能不支持这个子着色器的内容,就会执行下一个能执行的内容。但如果是语法错误导致的不能执行,就一个也不能执行,模型会直接变成紫红色。

最后是备用方案(FallBack),填一个已经有的Shader即可。

//这里填的"本shader名称"是想在选择Shader时显示出的那个名称。名称并不要求与文件名相同。
//可以直接是shader名,也可以是 路径/shader名 的形式。
//这样可以将同类Shader放在同一个路径中(这里的路径只需要直接在这里填,不用去改文件的实际存放路径)。
Shader "本shader名称" {	//属性,不是必须有。里面写需要在面板中直接修改的内容,比如用哪个贴图、什么颜色。Properties {}//子着色器。有一个或多个。比如有的显卡可能不支持这个子着色器,就会选择下一个子着色器执行。SubShader {//一个子着色器一般一个Pass块,最少一个,允许多个。一个Pass块等于一个功能或一个方法。pass{CGPROGRAM//在CGPROGRAM与ENDCG中间用CG语言编写Shader代码。除了CG,其它写shader的语言主要有写OpenGL的GLSL,写DirectX 的HLSL。ENDCG}}//所有SubShader都不能使用时的应急方案。填一个已经有的Shader,就是面板中能看到的那些可以更换的Shader。FallBack "备用Shader名"
}

顶点函数与片元函数:

模型的表面是由一个个三角形组成的。三角形有3个顶点。首先由顶点函数处理模型各个三角形的顶点,确定位置等。然后将信息传递给片元函数。之后由片元函数得到每个像素的显示颜色。这两个函数就像c#脚本的start、UpDate等函数一样,是自动被系统调用的。片元函数的返回值就是显示的颜色。

语义:

通过 冒号+关键字 的形式,对某个变量进行解释。功能有将某个系统中的量赋值给这个变量、或将这个变量的内容作为系统的某个量,或解释这个变量是什么类型以便将这个变量用于存储相关类型的内容。先学2个:

变量:POSITION //将模型空间的顶点坐标赋值给该变量。

变量:SV_POSITION //将该变量作为片元函数中剪切空间下的顶点坐标。

比如以下这个函数,函数名为vert,参数为float4 类型的v,返回值也为float4类型。v:POSITION代表将模型空间的顶点坐标赋值给v。后面的这句:SV_POSITION代表将该函数的返回值作为片元函数中剪切空间下的顶点坐标。

float4 vert(float4 v:POSITION):SV_POSITION{

//函数内容

}

方向、位置的空间转换:

Shader中会用到模型空间、剪切空间、切线空间等不同的空间。经常需要将方向、位置在不同空间进行转换。好在已经有现成的方法用于将这些量在不同的空间中转换。使用一个系统提供的矩阵与这些量进行叉乘即可转换。方法为

转换后的量= mul(转换用的矩阵,转换前的量);

比如假设v是模型空间下的顶点坐标,需要转换到剪切空间下并将新值赋值给pos:

pos= mul(UNITY_MATRIX_MVP,v);//用UNITY_MATRIX_MVP即可得到此次从模型空间转换到剪切空间需要用的矩阵,先将这个记录下来,和语义一样,用多了就熟悉了。

删除shader中的原代码,改为如下代码

//路径与shader名为"Tutorial/01SolidColor"。可以填其它名称。
Shader "Tutorial/01SolidColor" {//这个Shader用不到属性SubShader{pass{CGPROGRAM//声明顶点函数名为vert#pragma vertex vert//声明片元函数名为frag#pragma fragment frag //顶点函数的内容float4 vert(float4 v:POSITION):SV_POSITION{//将模型空间下的顶点坐标转换到剪切空间float4 pos= mul(UNITY_MATRIX_MVP,v);//将剪切空间下的顶点坐标返回。返回值里是必须有这个值的。//这个值片元函数会用到,不过是系统自动使用的,不用我们去调用。return pos;}//片元函数的内容float4 frag():SV_TARGET{//片元函数的返回值就是相关像素显示的颜色。这里返回了一个float4的量。//这个量有4维,分别代表红绿蓝和阿尔法值,阿尔法值影响透明度。数字0-1。//了解色彩的就知道,红绿蓝一起显示就是白色。这里我们直接返回了一个白色。//这里可以修改为其它颜色,如float4(1,0,0,1),红色。但这里直接修改透明度是无效的。return float4(1,1,1,1);}ENDCG}}//备用方案Fallback "VertexLit"
}

注意有的句子后面是没有";"的。实际上主要是CGPROGRAM和ENDCG之间的CG代码才需要加";",且声明顶点和片元函数名时也没有";"。

之后在选择shader时就能选择我们新写的这个shader了:

选择这个Shader后,物体变成了纯白色:

 

 

这篇关于Unity Shader零基础入门1:纯色物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组