Unity Shader片段着色器使用基础详解

 更新时间:2023年05月05日 10:59:02   作者:iukam  
顶点-片段着色器是Unity Shader中最基础的着色器类型,用于控制3D模型的渲染效果。通过顶点着色器计算模型的顶点位置和法线方向,再通过片段着色器计算模型表面的颜色、光照、阴影等效果
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一、Unity Shader基础

1、创建和使用Shader

在Unity中Shader一般由两种用途:

  • 指定给材质,用于物理渲染;
  • 指定给脚本,用于图像处理,比如后期处理(Post Processing);

2、Unity渲染管线Shader的编写方式

  • 顶点-片段着色器(Vertex and Fragment Shader);
  • 表面着色器(Surface Shader);
  • 固定函数着色器(Fixed Function Shader,目前逐渐被抛弃);

二、CG语法基础

1、编译指令

CG常用的编译指令:

(1) 编译目标等级

CG代码编译到不同的Shader Models中,要适应对应的GPU平台,否则会出现一些Shader在GPU上无法运行。

声明编译目标的级别#pragma target name也可以使用#pragma require feature指令直接声明某个特定的功能。

#pragma target 3.5  //目标等级3.5
#pragma require geometry tessellation  //需要几何体细分功能

(2) 渲染平台

Unity具有跨平台的特性,它支持很多渲染API,例如Direct3D、Opengl。默认情况下,Unity会为所有支持的平台编译一份Shader程序,但需要指定编译某些平台或不编译某些平台。

使用示例:

#pragma only_renderers d3d11  //目标只编译Direct3D 11/12 平台
#pragma exclude_renderers glcore //不编译 OpenGL 3.x/4.x

2、着色器函数

一个基本的Shader示例:

Shader "Custom/Simplest  Shader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            void vert (in float4 vertex : POSITION,
                    out float4 position : SV_POSITION)
            {
                position = UnityObjectToClipPos(vertex);
            }
            void frag (in float4 vertex : SV_POSITION,
                    out fixed4 color : SV_TARGET)
            {
                color = fixed4(1, 0, 0, 1);
            }
            ENDCG
        }
    }
}

在Shader中,顶点-片元着色器主要通过顶点函数和片元函数来实现的。

(1) 无返回值函数

上述Shader中的顶点函数和片元函数使用的是无返回值的函数,通过out关键字将变量输出。

语法结构如下:

 void name(in 参数,out 参数)
 {
 	//函数体
 }

void:函数以void开头,表示返回值为空;

name:定义函数名称;

in:输入参数,语法为:in+数据类型+名称,一个函数可以有多个输入,关键词 in 可省略。

out:输出参数,语法为:out+数据类型+名称,一个函数可以有多个输出。

(2) 有返回值的函数

语法结构如下:

 type name(in 参数)
 {
 	//函数体
 	return 返回值;
 }

3、语义

CG语言编写着色器函数时,函数的输入参数和输出参数都需要填充一个语义(Semantic)来表示它们要传递的数据信息。

语义可以执行大量繁琐的操作,使用户能够避免直接于GPU底层进行交流。

参数后被冒号隔开并且全部大写的关键词就是语义。

(1) 顶点这着色器的输入语义

顶点数据是以输入参数的方式传递给顶点函数的,每一个输入的参数都需要填充一个语义,用于表示所传递的数据。

注意:

当顶点信息包含的元素少于顶点着色器输入所需要的元素时,缺少的部分会被0填充, w分量会被1填充; 如:输入语义TEXCOOED0被声明为float4类型,那么顶点着色器最终获取到的数据为 ( x , y , 0 , 1 ) (x,y,0,1) (x,y,0,1)

(2) 顶点这着色器输出和片元着色器输入语义

在整个渲染流水线中,顶点着色器最重要的的一项人物就是需要输出顶点在裁剪空间中的坐标,这样GPU就可以知道顶点在屏幕上的栅格化位置以及深度值。在顶点函数中这个输出参数值需要使用float4类型的SV_POSITION语义填充。

顶点着色器产生的输出值将会在三角形便利阶段经过插值计算,最终作为像素值输入到片元着色器。

换句话说,顶点着色器的输出就是片元着色器的输入。

片元着色器会自动获取顶点着色器输出的裁切空间顶点坐标,所以片元函数输入的SV_POSITION可以省略。

注意:

与顶点函数的输入语义不同,TEXCOORDn不再特指模型的UV坐标,COLORn也不在特指顶点颜色。它们使用范围更广,可以用于声明任何符合要求的数据。

(3) 片元着色器输出语义

片元着色器通常只会输出一个fixed4类型的颜色信息,输出的值会存储到渲染目标(Render Target),输出参数使用SV_TARGET语义进行填充。

到此这篇关于Unity Shader片段着色器使用基础详解的文章就介绍到这了,更多相关Unity Shader片段着色器内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 利用C#实现最基本的小说爬虫示例代码

    利用C#实现最基本的小说爬虫示例代码

    最近在学习c#,碰巧遇到个小说站不错,就索性当个练习,所以这篇文章主要给大家介绍了关于利用C#实现最基本的小说爬虫的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • c#友好显示日期 c#日期datetime使用方法

    c#友好显示日期 c#日期datetime使用方法

    c# datetime根据日期显示几秒前、几分前、几天前、几月前、几年前等格式
    2014-01-01
  • C#中Invoke的用法讲解

    C#中Invoke的用法讲解

    这篇文章主要介绍了C#中Invoke的用法讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C#实现的4种常用数据校验方法小结(CRC校验,LRC校验,BCC校验,累加和校验)

    C#实现的4种常用数据校验方法小结(CRC校验,LRC校验,BCC校验,累加和校验)

    本文主要介绍了C#实现的4种常用数据校验方法小结(CRC校验,LRC校验,BCC校验,累加和校验),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C#/VB.NET读取条码类型及条码在图片中的坐标位置实例

    C#/VB.NET读取条码类型及条码在图片中的坐标位置实例

    我们在创建条形码时,如果以图片的方式将创建好的条码保存到指定文件夹路径,可以在程序中直接加载图片使用;已生成的条码图片,需要通过读取图片中的条码信息,如条码类型、条码绘制区域在图片中的四个顶点坐标位置等,可参考本文中的方法
    2023-10-10
  • c# 两个数组比较,将重复部分去掉,返回不重复部分的实现

    c# 两个数组比较,将重复部分去掉,返回不重复部分的实现

    下面小编就为大家带来一篇c# 两个数组比较,将重复部分去掉,返回不重复部分的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C# jpg缩略图函数代码

    C# jpg缩略图函数代码

    生成jpg缩略图字节,本人的小软件中需要用到的功能,所以自己做了一个函数,和大家分享 为什么要生成字节而不是文件,这是为了方便后续处理啦^_^
    2011-06-06
  • C#高性能动态获取对象属性值的步骤

    C#高性能动态获取对象属性值的步骤

    这篇文章主要介绍了C#高性能动态获取对象属性值的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#判断密码强度的方法

    C#判断密码强度的方法

    这篇文章主要介绍了C#判断密码强度的方法,较为详细的分析了C#判断密码强度的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# OpenCvSharp实现去除字母后面的杂线

    C# OpenCvSharp实现去除字母后面的杂线

    这篇文章主要为大家详细介绍了C#如何使用OpenCvSharp实现去除字母后面的杂线效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11

最新评论

?


http://www.vxiaotou.com