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

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.