当前位置: 首页 > news >正文

Unity(2022.3.41LTS) - 着色器

目录

一、着色器的基本概念

二、表面着色器



一、着色器的基本概念

  1. 定义与作用:

    • 着色器是一种在图形硬件上运行的程序,用于控制物体的颜色、纹理、光照、透明度等视觉属性。它通过对输入的几何数据(如顶点位置、法线、纹理坐标等)进行计算和处理,输出最终的像素颜色值。
    • 着色器的主要作用是实现各种逼真的材质效果,如金属、玻璃、木材等,以及特效,如光影、粒子效果、后处理等。它可以让游戏场景更加生动、真实,提升玩家的沉浸感。
  2. 着色器的类型:

    • 表面着色器(Surface Shader):这是一种高级的着色器类型,它提供了一种简洁的方式来实现复杂的材质效果。表面着色器自动处理了光照、阴影、反射等复杂的渲染过程,开发者只需关注材质的表面属性和光照模型的定义。表面着色器适用于大多数材质效果的实现,尤其对于初学者来说,更容易上手。
    • 顶点片段着色器(Vertex Fragment Shader):也称为可编程着色器,它提供了对渲染过程的更多控制。顶点着色器负责处理物体的顶点数据,如位置、法线、纹理坐标等的变换;片段着色器负责处理每个像素的颜色计算。开发者需要手动编写顶点着色器和片段着色器的代码,以实现特定的渲染效果。顶点片段着色器适用于需要高度定制化的材质效果和特效的实现。
    • 固定功能着色器(Fixed Function Shader):这是一种传统的着色器类型,它使用固定的渲染流程和参数来实现材质效果。在现代游戏开发中,固定功能着色器已经逐渐被表面着色器和顶点片段着色器所取代,但在一些旧项目中仍然可能会使用到。

二、表面着色器

  1. 特点与优势:

    • 简洁高效:表面着色器使用 Cg/HLSL 语言编写,它提供了一种简洁的语法和结构,使开发者可以快速实现复杂的材质效果。表面着色器自动处理了许多底层的渲染细节,如光照计算、阴影处理等,大大提高了开发效率。
    • 易于理解:对于不熟悉图形编程的开发者来说,表面着色器的语法和结构更容易理解和掌握。它提供了一种高级的抽象,使开发者可以专注于材质的表面属性和光照模型的定义,而不必关心底层的渲染过程。
    • 兼容性好:表面着色器在不同的图形硬件上具有较好的兼容性,因为它自动适应不同的硬件特性和性能。这使得开发者可以在不同的平台上实现一致的材质效果,减少了跨平台开发的难度。
  2. 结构与组成:

    • 属性定义:表面着色器的开头部分是属性定义,用于指定材质的参数,如颜色、纹理、透明度等。这些参数可以在 Unity 的材质编辑器中进行调整,以实现不同的材质效果。
    • 表面函数:表面函数是表面着色器的核心部分,它用于计算物体表面的颜色和属性。表面函数接收输入数据,如顶点位置、法线、纹理坐标等,并根据光照模型和材质属性计算出最终的颜色值。表面函数可以使用内置的光照模型,也可以自定义光照模型,以实现特定的材质效果。
    • 光照模型:光照模型用于定义物体在不同光照条件下的外观。表面着色器提供了一些内置的光照模型,如 Lambert 光照模型、Blinn-Phong 光照模型等,开发者也可以自定义光照模型,以实现更复杂的材质效果。
  3. 示例与应用:

    • 金属材质:使用表面着色器可以很容易地实现金属材质的效果。通过调整材质的颜色、光泽度、反射率等参数,可以模拟出不同种类的金属,如铜、铁、铝等。金属材质通常需要较强的高光和反射效果,表面着色器可以自动处理这些效果,使金属看起来更加真实。
    • 玻璃材质:玻璃材质是一种具有透明和折射效果的材质,使用表面着色器可以实现逼真的玻璃效果。通过调整材质的透明度、折射率、反射率等参数,可以模拟出不同种类的玻璃,如透明玻璃、彩色玻璃、磨砂玻璃等。表面着色器可以自动处理玻璃的折射和反射效果,使玻璃看起来更加真实。
    • 皮肤材质:皮肤材质是一种具有复杂纹理和颜色变化的材质,使用表面着色器可以实现逼真的皮肤效果。通过调整材质的颜色、纹理、粗糙度等参数,可以模拟出不同肤色和肤质的皮肤。表面着色器可以自动处理皮肤的光照和阴影效果,使皮肤看起来更加真实。

三、顶点片段着色器

  1. 特点与优势:

    • 高度定制化:顶点片段着色器提供了对渲染过程的完全控制,开发者可以根据自己的需求编写任意的顶点和片段处理代码。这使得顶点片段着色器可以实现非常复杂和独特的材质效果和特效,如自定义的光照模型、粒子效果、后处理等。
    • 性能优化:由于顶点片段着色器可以手动控制渲染过程中的各个阶段,开发者可以根据硬件性能和项目需求进行优化。例如,可以减少不必要的计算,使用纹理压缩,优化顶点和片段处理代码等,以提高渲染性能。
    • 学习价值:编写顶点片段着色器需要对图形编程有更深入的理解,因此它是学习图形编程的一个很好的途径。通过编写顶点片段着色器,开发者可以深入了解图形硬件的工作原理和渲染过程,提高自己的图形编程能力。
  2. 结构与组成:

    • 顶点着色器:顶点着色器是顶点片段着色器的第一部分,它负责处理物体的顶点数据。顶点着色器接收输入的顶点数据,如位置、法线、纹理坐标等,并进行一系列的变换和计算,最终输出顶点的最终位置和其他属性。顶点着色器可以使用内置的函数和变量,也可以自定义函数和变量,以实现特定的顶点处理效果。
    • 片段着色器:片段着色器是顶点片段着色器的第二部分,它负责处理每个像素的颜色计算。片段着色器接收顶点着色器输出的属性,如位置、法线、纹理坐标等,并根据光照模型和材质属性计算出每个像素的最终颜色值。片段着色器可以使用内置的函数和变量,也可以自定义函数和变量,以实现特定的片段处理效果。
  3. 示例与应用:

    • 自定义光照模型:顶点片段着色器可以实现自定义的光照模型,以实现更加逼真的材质效果。例如,可以实现基于物理的光照模型,如 PBR(Physically Based Rendering)光照模型,以模拟真实世界中的光照效果。自定义光照模型需要对光照原理和物理特性有深入的了解,同时需要进行大量的计算和优化,以保证渲染性能。
    • 粒子效果:顶点片段着色器可以实现各种粒子效果,如火焰、烟雾、爆炸等。通过编写顶点着色器和片段着色器,可以控制粒子的位置、速度、颜色、大小等属性,以及实现粒子的动画效果。粒子效果通常需要大量的计算和优化,以保证渲染性能和效果的真实性。
    • 后处理效果:顶点片段着色器可以实现各种后处理效果,如颜色调整、模糊、景深等。通过在渲染完成后对图像进行进一步的处理,可以增强画面的表现力和真实感。后处理效果通常需要在片段着色器中进行处理,对图像的每个像素进行计算和调整。

四、固定功能着色器

  1. 特点与优势:

    • 简单易用:固定功能着色器使用固定的渲染流程和参数来实现材质效果,不需要开发者编写复杂的着色器代码。这使得固定功能着色器非常容易上手,适合初学者和快速开发。
    • 兼容性好:由于固定功能着色器使用固定的渲染流程和参数,它在不同的图形硬件上具有较好的兼容性。这使得开发者可以在不同的平台上实现一致的材质效果,减少了跨平台开发的难度。
  2. 结构与组成:

    • 材质参数:固定功能着色器通过调整材质的参数来实现不同的材质效果,如颜色、纹理、透明度、光照模型等。这些参数可以在 Unity 的材质编辑器中进行调整,以实现不同的材质效果。
    • 渲染流程:固定功能着色器使用固定的渲染流程来处理物体的几何数据和材质参数,如顶点变换、光照计算、纹理采样等。这些流程是固定的,开发者无法进行修改和定制。
  3. 示例与应用:

    • 简单材质效果:固定功能着色器适用于实现一些简单的材质效果,如纯色材质、纹理材质、透明材质等。这些材质效果不需要复杂的光照计算和特效,使用固定功能着色器可以快速实现。
    • 旧项目维护:在一些旧项目中,可能仍然使用了固定功能着色器。如果需要对这些项目进行维护和更新,可以继续使用固定功能着色器,以保证项目的稳定性和兼容性。

五、着色器的创建和使用

  1. 创建着色器:

    • 在 Unity 中,可以使用内置的着色器编辑器或者外部的文本编辑器来创建着色器。内置的着色器编辑器提供了一种可视化的方式来编写着色器代码,方便开发者进行调试和优化。外部的文本编辑器则提供了更多的功能和灵活性,适合有经验的开发者使用。
    • 着色器文件通常以 “.shader” 为扩展名,它使用 Cg/HLSL 语言编写。着色器文件中包含了着色器的代码和属性定义,可以在 Unity 的材质编辑器中进行引用和调整。
  2. 应用着色器:

    • 创建好着色器后,可以将其应用到材质上。在 Unity 的材质编辑器中,可以选择不同的着色器类型,并调整材质的参数来实现所需的外观效果。材质可以应用到游戏场景中的物体上,使物体具有特定的材质效果。
    • 可以通过脚本动态地切换和调整材质的着色器,以实现不同的效果和动画。例如,可以在游戏中根据不同的场景和状态切换不同的着色器,或者通过调整着色器的参数来实现动态的材质效果。
  3. 优化着色器:

    • 为了提高渲染性能,可以对着色器进行优化。优化的方法包括减少计算量、使用纹理压缩、避免不必要的光照计算等。
    • 可以使用 Unity 的性能分析工具来分析着色器的性能,找出性能瓶颈并进行优化。性能分析工具可以提供着色器的执行时间、内存占用、GPU 使用率等信息,帮助开发者进行优化。

代码

Shader "Custom/NewSurfaceShader"
{Properties{_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}SubShader{Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows// Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input{float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.// #pragma instancing_options assumeuniformscalingUNITY_INSTANCING_BUFFER_START(Props)// put more per-instance properties hereUNITY_INSTANCING_BUFFER_END(Props)void surf (Input IN, inout SurfaceOutputStandard o){// Albedo comes from a texture tinted by colorfixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;// Metallic and smoothness come from slider variableso.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

这里就是路径和名字.

给材质使用刚才新建的Shader

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vulnhub靶场-DC2
  • 使用Blender云渲染的好处是什么?
  • 滚雪球学MyBatis-Plus(04):基础配置
  • 如何用Java SpringBoot打造助农捐赠平台?2025年25届毕业生必看+最新设计实现攻略!
  • Spring Cloud Gateway整合基于STOMP协议的WebSocket实战及遇到问题解决
  • Catia二次开发“CAAV5-ERROR: unauthorized API for CAA V5”错误
  • Docker 修改镜像源
  • 公司电脑的敏感文件怎么审查?分为六步,步步为营,保护文件不泄密
  • 联蔚盘云亮相CDIE消费品行业峰会
  • LABVIEW数据保存文件
  • springboot整合logback进行日志管理(下篇)
  • 连接型CRM+智能制造,助力医疗器械企业高质量发展
  • 搜维尔科技:数据手套+机械手遥操作,五指触感灵巧手解决方案!
  • 数据传输安全——混合加解密(国密)
  • C/C++内存详解
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 08.Android之View事件问题
  • C++11: atomic 头文件
  • classpath对获取配置文件的影响
  • JavaScript HTML DOM
  • JavaScript异步流程控制的前世今生
  • Java多线程(4):使用线程池执行定时任务
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Mysql优化
  • python 学习笔记 - Queue Pipes,进程间通讯
  • tensorflow学习笔记3——MNIST应用篇
  • VUE es6技巧写法(持续更新中~~~)
  • Vue实战(四)登录/注册页的实现
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对JS继承的一点思考
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 面试遇到的一些题
  • 模型微调
  • 前端之React实战:创建跨平台的项目架构
  • 如何设计一个微型分布式架构?
  • 学习JavaScript数据结构与算法 — 树
  • 在Mac OS X上安装 Ruby运行环境
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • MyCAT水平分库
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (C11) 泛型表达式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (TOJ2804)Even? Odd?
  • (四)进入MySQL 【事务】
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)大道至简,职场上做人做事做管理
  • .NET CORE Aws S3 使用
  • .NET Core中如何集成RabbitMQ
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)