Unity(三) Shader着色器初探

news2024/11/26 13:39:03

学习3D开发技术的时候无可避免的要接触到Shader,那么Shader是个什么概念呢?其实对于开发同事来说还是比较难理解的,一般来说Shader是服务于图形渲染的一类技术,开发人员可以通过其shader语言来自定义显卡渲染页面的算法,从而达到按照自己的想法来渲染出目标效果。

1. Unity Shader

不同的图形API会对应不同的Shader语言,感兴趣的可以去了解下更多这方面的内容。Unity目前开发阶段基于Windows平台开发和运行,一般采用Direct3D或OpenGL,如需要兼容其他平台可在打包的时候选取对应平台如安卓、IOS等,并关注切换后是否存在”粉色“的情况,如出现模型表面为”粉色“,一般是Shader出现不兼容错误,需要修复。

在编码之前我们需要先来了解下Unity常见的几种Shader:

1. Surface Shaders 表面着色器

        Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。

2. Vertex/Fragment Shaders 顶点/片段着色器(重要)

        一般的顶点+片段着色器的工作原理如下图所示

a. 顶点处理(顶点着色器)

        主要执行坐标转换和逐顶点光照的任务,坐标转换是将顶点坐标从模型空间转换到齐次裁剪空间中,可以使用UnityObjectToClipPos()函数来实现。

b. 图元处理

        在裁剪空间中进行裁剪(Clipping)、背面剔除(Back-Face Culling)、屏幕映射(ScreenMapping)等操作。为的是剔除不需要的顶点/面,并做好三维坐标到二维屏幕坐标的转换。

c. 光栅化

        是将变换到屏幕空间的图元离散化为片元的过程。

d. 片段处理(片段着色器)

        (1). 纹理贴图 - Textures

        纹理贴图也称为纹理映射,是将图像信息映射到三角形网格上的技术,以此来增加物体表面的细节,令物体更具有真实感。

        (2). 光照计算 - Lighting

        光照由直接光和间接光组成,计算光照最常用的就是phong模型了,它是一个经验模型,参数信息都是经验得到的,并没有实际的物理意义,所以利用Phong模型会出现违背物理规则的时候。

漫反射Difuse + 镜面发射Specular + 环境光Ambient = Phong

         (3). 混合与测试

        输出合并(Output-Merger):在DirectX中,该阶段被称为输出合并阶段,而OpenGL将其称为逐片元操作(Per-Fragment Operations),从称呼中就可以看出,这个阶段主要是对每一个片元进行一些输出合并操作,包括Alpha测试、模板测试、深度测试和混合等,它的主要任务是决定片元的可见性,对通过测试的片元颜色进行混合

        Alpha测试:通过片元数据,可以获取该片元的alpha值,如果alpha值小于某个数的话,则直接将该片元丢弃,不进行渲染

        模板测试:GPU会首先读取模板缓冲区中该片元位置的模板值,然后将该值和读取到的参考值进行比较,例如小于时舍弃该片元,或者大于等于时舍弃该片元。

        深度测试:近处的物体会遮挡远处的物体,这种效果我们可以通过深度测试来模拟实现。

        混合:对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的

e. 帧缓存

        可以简单理解为一个临时画布,GPU渲染完成的信息会存放在帧缓存区,等待使用,上述各种测试也是在帧缓冲区进行的

以下这个图更容易理解:

自己理解简而言之就是:

描点(坐标变换)-> 

连线(三角面)->

形成格子(光栅化)->

上色(纹理、光照、) ->

后期处理(测试、混合)

2. 几个和Shader相关的概念

(1)网格(Mesh)

        网格Mesh是GameObject的3D骨架,它是有顶点(Vertex)定义的一个2D多边形,这些顶点是3D空间中存储为XYZ坐标。网格还包括法线,Shader通过法线让面看起来更光滑。

(2)贴图、纹理(Maps、textures)

        纹理(Texture):2D 图像文件,它像一张纸一样环绕GameObject,以设置网格中的颜色、镜面反射或金属度、物理纹理和其他属性。图像文件的数据被组织为通道(RGB/RGBA)。

        底图纹理(Base Map Texture):一个常规 RGB 或 RGBA 彩色图像文件,用于定义对象表面的漫反射(即颜色)

        平铺纹理(Tiled Texture):平铺纹理的纹理设计为围绕任何网格平铺。每个文件中的地图就像地板上的瓷砖一样简单地重复

        UV贴图:对于像球体这样的基元和像我们的块这样的简单形状,纹理贴图在哪些点与对象的网格对齐并不重要。但是在角色模型等详细对象上,纹理贴图与网格的对齐非常重要

        Alpha裁剪(Alpha Clip):根据Mesh网格填充纹理,避免大量计算。(也可用于溶解效果、消失/出现效果)

        凹凸贴图(Bump Texture):使用凹凸贴图,着色器将表面细节的外观添加到网格中,而无需实际添加多边形。这种技术对性能更好。使用法线贴图和高度贴图(normal maps and height maps)

        法线贴图:通过设置顶点位置,使着色器创建表面上的片段(像素)面向不同方向的错觉。

        高度贴图:设置网格中每个像素的相对高度

        遮挡贴图(Occlusion Map):遮挡贴图为这些遮挡区域添加阴影。

        发射贴图(Emission Map):制作发光效果的贴图

(2)反射

        环境光遮蔽AO(Occlusion):大部分情况下,AO通过构造一个发射光线的半(hemisphere)来计算。半球上表面布满朝各个方向发射的光线,然后判断这些光线是否与其它的物体相交。如果光线到达背景或者天空,那么就增加这个光线发出点的表面亮度,如果与其他物体相交,则不用。(靠得非常近的物体之间的阴影效果会非常明显)

        漫反射(Base map):

        1. 反照率(Albedo):描述了漫反射的测量。它通常指定为常规颜色,表示为红色、绿色和蓝色的三个值(RGB 值)。RGB 值可以转换为色调、饱和度和亮度(亮度)的值。反照率颜色的亮度对应于漫反射的量,色调和饱和度描述了从表面逸出的光的质量。

        2. 地图(Map):地图可以是纯色的,也可以用 2D 图像指定以增加表面的变化。

        镜面反射(Specular):镜面反射作为材料的一种属性,是一种指定表面看起来像金属的方法。您可以使用两种工作流程来指定材质中的金属外观——Specular、Metallic

        平滑度(Smoothness):平滑度,也称为光泽度或光泽度,使镜面反射成为焦点。

3. 如何编写Shader

(1). ShaderLab

        ShaderLab 是一种在着色器源文件中使用的类C语言的声明性语言。它使用嵌套大括号语法来描述 Shader 对象。其结构如下:

Shader "Examples/ShaderSyntax"
{
    CustomEditor = "ExampleCustomEditor"

    Properties
    {
        // 此处是材质属性声明
    }
    SubShader
    {
        // 此处是定义子着色器的其余代码

        Pass
        {
           // 此处是定义通道的代码
        }
    }

    Fallback "ExampleFallbackShader"
}

ShaderLab是一种声明式语言格式来编写Shader,可在代码自由编写Shader支持的所有特性和属性,并设置回退行为。

(2). HLSL

都是着色语言,作为中间语言(Intermediate Language),即交给GPU可以理解的语言。

因为Microsoft和NVIDIA合作,所以Cg/HLSL实际上是同一种语言。而ShaderLab内部可以嵌套Cg/HLSL语言编写着色代码,需要嵌套在命令CGPROGRAM和ENDCG之间。如下:

Pass {
    // Pass 的标签和状态设置
    CGPROGRAM
    // 编译指令
    #pargma vertex vert
    #pargma fragment frag
    // CG代码
    ENDCG
    // 其他设置
}</pre>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-快速入门

MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 MyBatis是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了Google code&#xff0c;并且改名为MyBatis,2013年11月迁移到Github 使用MyBatis查询所有用户信息&#xff1a; 1.准备工作&a…

项目管理工具:实现项目科学管理的利器

什么是项目管理工具 项目管理工具是指用于协助规划、组织、执行和监控项目活动的软件或应用程序。它们提供了一系列功能和工具&#xff0c;帮助项目管理人员和团队有效地管理项目进度、资源分配、任务协作以及沟通等方面的工作。项目管理工具的目标是提高团队的工作效率、优化…

Git 基本原理和常用操作

Git Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。 Git 常用操作 git 提交流程&#xff1a;工作区 -> git add 到暂存区 -> gi…

RunnerGo——更高效、更易用的性能测试利器

随着互联网技术的迅速发展&#xff0c;性能测试已成为保障应用程序顺畅运行的关键环节。在众多性能测试工具中&#xff0c;RunnerGo以其独特的优势&#xff0c;逐渐成为了开发者和测试人员的首选。本文将详细介绍RunnerGo的特点&#xff0c;并对比其与JMeter的优势&#xff0c;…

mac开机启动项怎么设置,MAC系统启动项怎么更改

一些软件在安装的时候可能会自动添加开机启动项&#xff0c;如果觉得影响开机速度或者不再需要了该怎么删除开机启动项呢&#xff1f;如何添加删除MacBook的开机启动项。下面小编教大家如何设置开机启动项。 第一步&#xff1a;点击左上角苹果标识下拉菜单进入系统偏好设置 第…

优雅编码!Java与MongoDB的创新数据库架构

随着现代应用程序对数据存储和处理需求的不断增加&#xff0c;开发人员需要寻找更具创新性和灵活性的数据库架构来满足这些需求。在这样的背景下&#xff0c;Java与MongoDB的结合为开发人员提供了一种创新的数据库架构&#xff0c;为应用程序带来了无限可能。下面将探讨Java与M…

万宾毫米波水位监测仪:实时监测河湖水位

河湖是人类生存和发展的重要自然资源&#xff0c;保障其安全运行是维护社会稳定和生态平衡的重要任务。随着经济的发展和人口的增加&#xff0c;对水资源的需求日益增长&#xff0c;但同时也面临着洪水和干旱等自然灾害的威胁。因此&#xff0c;对河湖进行监测成为了至关重要的…

个人博客项目测试报告

目录 一. 项目背景 二. 概述 三. 功能测试用例 四. 自动化测试用例 一. 项目背景 项目链接: http://81.70.189.104:8080/login.html 个人博客系统提供了 登录、注册、写博客&发布博客、删除博客、修改博客功能。前端的页面有 登录页、注册页、个人博客列表页、博客详情…

使用docker容器内的anaconda虚拟环境启动python web项目

1、环境安装 1.1 基础镜像 这里以ubuntu18.04 cuda 11.8为基础镜像&#xff08;主机支持nvidia-gpu&#xff09; &#xff08;1&#xff09;拉取ubuntu18.4 cuda11.8镜像 docker pull nvidia/cuda:11.8.0-devel-ubuntu18.04 1.2 docker下anaconda安装 &#xff08;1&am…

10|山水诗词:给自己一座精神的“辋川”

好诗相伴&#xff0c;千金不换。你好&#xff0c;我是天博。 前面三讲中&#xff0c;我们在“见古今”的主题里&#xff0c;讨论了诗词中流传下来的三种精神&#xff0c;侠义精神、文人风骨和家国情怀。从这一讲开始&#xff0c;我们进入了“见天地”的主题&#xff0c;一起来…

Vue项目案例-头条新闻

目录 1.项目介绍 1.1项目功能 1.2数据接口 1.3设计思路 2.创建项目并安装依赖 2.1创建步骤 2.2工程目录结构 2.3配置文件代码 3.App主组件开发 3.1设计思路 3.2对应代码 4.共通组件开发 4.1设计思路 4.2对应代码 5.头条新闻组件开发 5.1设计思路 5.2对应代码 …

Android -BLE 蓝牙模块开发

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码) - 简书前言 万物互联的物联网时代的已经来临&#xff0c;ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点&#xff0c;抽时间梳理下这块的知识点。 涉及ble蓝牙通讯的客户端(开启、扫描、连接…

【OLED驱动】:stm32F103的四线模拟IIC驱动的0.96寸OLED屏幕显示数字,字母,汉字,图片的例程

文章目录 前言 一、四线OLED是什么&#xff1f; 二、IIC原理 1.四线0.96寸OLED是IIC驱动来实现显示 2.IIC协议的OLED屏幕 3.STM32驱动代码 4.IIC使用代码 总结 前言 最近在做一个开源方案 — 平衡车&#xff0c;即将开源硬件和软件&#xff0c;会在CSDN上开源&#xff0…

Vue2+Vue3基础入门到实战项目(五)——课程学习笔记

大家好&#xff0c; Capybara 继续与大家一起学习Vue框架。书读百遍其义自见。 day06 路由进阶 路由模块封装 router/index.js 所抽离内容包括&#xff1a;导入组件、&#xff08;额外需要&#xff09;导入Vue、导入VueRouter插件、 创建路由对象、导出路由对象 需要注意路径…

上线检查工具(待完善)

根据V11《CEBPM系统上线CheckList》整理而得&#xff0c;适用于V11&#xff0c;DHERP&#xff0c;Oracle和MSSQL数据库&#xff0c;检查内容还不完善。 上图&#xff1a; 1&#xff09;数据库连接 2&#xff09;双击[连接别名]&#xff0c;可选择历史连接 3&#xff09;主界面…

若依 MyBatis改为MyBatis-Plus

主要内容&#xff1a;升级成mybatis-plus&#xff0c;代码生成也是mybatis-plus版本 跟着我一步一步来&#xff0c;就可完成升级&#xff01; 检查&#xff1a;启动程序&#xff0c;先保证若依能启动 第一步&#xff1a;添加依赖 这里需要在两个地方添加&#xff0c;一个是最…

CSRF攻击原理及防护

CSRF攻击原理及防护 0x01 CSRF是什么 ssrf 服务端请求伪造 CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&#xff0c;是一种网络攻击方式&#xff0c;也被称为 one-click attack 或者 session riding。 0x02 CSRF攻击原理 CSRF攻击利用网站…

flutter架构全面解析

Flutter 是一个跨平台的 UI 工具集&#xff0c;它的设计初衷&#xff0c;就是允许在各种操作系统上复用同样的代码&#xff0c;例如 iOS 和 Android&#xff0c;同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上&#xff0c;都能交付拥…

智慧公厕三大数字化远景,畅通数字化循环、夯实数字化基建、开创数字化创新

智慧公厕&#xff1a;实现数字化远景&#xff0c;提升公厕使用、建设与管理的创新之路 在现代社会中&#xff0c;公厕作为城市基础设施的重要组成部分&#xff0c;对城市形象和居民生活质量有着重要影响。然而&#xff0c;一些传统公厕管理的繁琐和配置设施的陈旧&#xff0c;…

centos7升级openssh版本

linux升级openssh版本&#xff0c;升级到8.6p1 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载rpm包 2.编写一键安装脚本&#xff08;然后执行&#xff09; #把所有的rpm包&#xff0c;我都放到了/ydy目录&#xff0c;下面安装时&#xff0c;也指定了这个目录 #编…