Unity Shader片段着色器使用基础详解
作者:iukam 发布时间:2022-09-29 10:08:28
一、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语义进行填充。
来源:https://blog.csdn.net/qq_40120946/article/details/122074257
猜你喜欢
- 本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法。分享给大家供大家参考,具体如下:在使用ImageView时
- 一、单例模式的思想想整理一些 java 并发相关的知识,不知道从哪开始,想起了单例模式中要考虑的线程安全,就从单例模式开始吧。以前写过单例模
- 背景公司线上有个tomcat服务,里面合并部署了大概8个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这8个服
- 一、背景今天心血来潮,准备测试一下项目中 logback 的自动刷新功能,但是测试时发现并不生效。logback 的配置如下:<con
- 1. ThreadLocal详解JDK1.2版本起,Java就提供了java.lang.ThreadLocal,ThreadLocal为每个
- 一、问题由来项目开发中,由于实际需要将某一个功能模块抽取成了一个单独的服务,其他地方需要调用的时候,通过Spring提供的RestTempl
- 1.现象描述原来项目在Android studio 2.3一切正常,升级3.0之后报如下错误:Error:Cannot choose bet
- 前言Feign是Netflix开源的声明式HTTP客户端,致力于让编写http client更加简单,Feign可以通过声明接口自动构造请求
- 1. 日志框架的选择:(这两个框架,springBoot已经整合,无需引入jar包)2. 在resources目录下配置logback-sp
- 一、银行存取款1.前言毕竟谁不喜欢钱呢!(不是😅)我看谁不喜欢在知识的海洋中遨游😤!2.描述银行存取款的流程是人们非常熟悉的事情,用户可以在
- 目录1、如果类的方法没有返回值,该方法的返回值类型应当是abstract。()2、代码String str=”123456a”;int i=
- 本文实例讲述了C#实现Base64处理的加密解密,编码解码。分享给大家供大家参考,具体如下:using System;using Syste
- ResultSet 动态获取列名和值仅供自己方便查阅,无其他用途ResultSet result = null; //前边SQL查询结果,这
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- 1 概述Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java
- 本次数据请求使用postman, postman下载地址:https://www.getpostman.com/一、页面跳转1. 页面跳转@
- 今天给大家带来一个自定义的底部导航,我不会做动图,只能搞一张图片给大家看看,大家见谅这个就是自定义的tablayout底部搞好的样式了Tab
- 什么是耦合性耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、
- 前言上一篇讲了普通轮询、加权轮询的两种实现方式,重点讲了平滑加权轮询算法,并在文末留下了悬念:节点出现分配失败时降低有效权重值;成功时提高有
- 用DataFormatString格式化GridView在 GridView里面显示数据,要显示的数据有好多位小数,就想让它只显示两位小数,