Unity(2022.3.41LTS) - 着色器

news2024/11/13 15:01:30

目录

一、着色器的基本概念

二、表面着色器



一、着色器的基本概念

  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 200

        CGPROGRAM
        // 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.0

        sampler2D _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 assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

这里就是路径和名字.

给材质使用刚才新建的Shader

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

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

相关文章

某地级市攻防演练突破边界实战

0x1前言 今年某地级市的攻防中,前期通过fofa、google语法、天眼查等待信息收集获取到了某集团的单位后台后台是这样的,当看到这个后台系统时候脸上 不直接也就微笑了起来。最近风声紧,所有厚码希望大家多多理解(我也怕死啊呜呜呜…

【MRI基础】k空间基本属性

K 空间本质上是一个矩阵,用于存储从 MRI 扫描仪获得的原始数据。这些数据是在扫描过程中收集的,K 空间中的每个点代表被扫描身体发出的 MRI 信号的不同频率和相位。存储在 K 空间中的数据不是图像形式,而是包含重建图像所需的所有空间频率信息…

灵办 AI:免费智能利器,开启高效办公与智能创作学习新时代

目录 引言一、初识灵办AI—开启智能办公二、灵办 AI 的强大功能解析1. 多语言翻译2. AI 对话功能3. AI 阅读功能4. AI 代码助手功能 三、灵办 AI 的其他优点四、结语 引言 在当今快节奏的时代,技术人员们都在努力寻觅能够提高工作效率、助力学习创作的工具。我同样…

YOLO | YOLO目标检测算法(YOLO-V1)

github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 YOLO目标检测算法 YOLO V1概述(2016) YOLO V1概述(2016) 经典的One-stage方法 YOLO:You Only Look Once 把…

4.sklearn-K近邻算法、模型选择与调优

文章目录 环境配置(必看)头文件引用1.sklearn转换器和估计器1.1 转换器 - 特征工程的父类1.2 估计器(sklearn机器学习算法的实现) 2.K-近邻算法2.1 简介:2.2 K-近邻算法API2.3 K-近邻算法代码2.4 运行结果2.5 K-近邻算法优缺点 3.模型选择与调…

uni-app插槽(默认插槽,命名插槽,作用域插槽)

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中,插槽(Slot)是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…

ROS 2 Jazzy和QT组合开发教程

ROS2 Jazzy和QT组合开发教程 ROS2 和 Qt 组合开发是一个强大且灵活的组合,可以用来构建具有 GUI 的机器人应用程序。这个组合让你能够将 Qt 的图形界面与 ROS 2 的分布式通信功能结合在一起,实现数据的展示、机器人控制、调试等功能。 环境如下&#x…

掌握人事管理,这张报表帮你轻松搞定

在人事管理中,数据分析的重要性不言而喻。无论是了解员工的整体情况,还是洞察人才流失的原因,数据都能为我们提供有力的支持。但是,面对海量的数据,很多HR都会感到不知所措。那么,如何通过一张报表解决所有…

数字化转型升级探索(三)

在数字化转型升级的探索过程中,我们将通过深入应用人工智能、物联网、大数据和云计算等技术,全面重塑业务流程和运营模式,推动信息流、业务流和价值流的高度融合,实现从传统手工操作到智能自动化的全方位升级,提升业务…

【Python报错已解决】`SyntaxError`:`invalid syntax`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 在Python编程中,SyntaxError是最常见的错误类型之一,它表示代码中存在语法错误。本文将探讨一个具…

★ 算法OJ题 ★ 力扣202 - 快乐数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--快乐数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 题⽬告诉我们&#xff0c;当我们不断重复操作…

数字化转型升级探索(四)

在数字化转型升级的探索中&#xff0c;我们将致力于通过整合先进的技术手段&#xff0c;如人工智能、区块链、大数据和云计算&#xff0c;全面改造传统业务模式&#xff0c;实现智能化运营和数据驱动决策&#xff0c;从而提高企业的效率与灵活性&#xff1b;通过实施全新的数字…

【微处理器系统原理与设计应用入门】典型的微处理器及系统

一. 基于微处理器的系统结构 首先明确什么是处理器&#xff1f; 我们在设计一个系统完成一个功能时&#xff0c;必不可少的一个环节就是信息处理&#xff0c;我们人脑处理信息是依靠神经系统传递神经冲动&#xff0c;而对于机器而言需要指令来完成信息处理&#xff0c;所以一…

Golang 小项目(3)

Golang 小项目(3) 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 前往 torna.top 免费查阅 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─cmd │ └─main │ main.go │ └─pkg├─config│ app.go│…

CSDN的技术人员真牛,3分钟定位到问题所在

加密社 昨天晚上&#xff0c;我为了方便写文后一键同步至我的其他账号&#xff0c;安装了个浏览器插件 然后今天一来&#xff0c;我发现csdn的内容管理-创作者平台打不开了 我试了各种办法&#xff0c; 包括清缓存&#xff0c;换浏览器重试&#xff0c;换网络&#xff0c;重…

14%电抗器可以过滤几次谐波

14%电抗器&#xff08;也称为14%阻抗电抗器&#xff09;是一种用于限制电流谐波的设备&#xff0c;主要通过增加系统的阻抗来减少谐波电流的幅度。它的“14%”表示电抗器的阻抗相对于电力变压器的额定阻抗的比例&#xff0c;即电抗器的阻抗是变压器阻抗的14%。 一、谐波过滤能力…

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一&#xff1a;递归 class Solution { public:int fib(int n) {return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return dfs(n - 1) dfs(n - 2);} }; 解法二&#xff1a;记忆化搜索 class Solution {int nums[31]; // 备忘录 public:int fib(int …

carbonyl浏览器使用

仓库 carbonyl上提供了两种在线方式安装&#xff0c;一是docker方式 $ docker run --rm -ti fathyb/carbonyl https://youtube.com另一种是 $ npm install --global carbonyl $ carbonyl https://github.com此外还提供了mac和linux的二进制包&#xff0c;可直接下载运行。 二…

[BFS广度优先搜索] 迷宫

描述 给定一个仅由数字 0 与 1 组成的 n 行 m 列的迷宫。若你位于一格 0 上&#xff0c;那么你可以移动到相邻 4 格中的任意一格 1 上&#xff1b;同样地&#xff0c;若你位于一格 1 上, 那么你可以移动到相邻 4 格中的任意一格 0 上。 现在&#xff0c;有 q 次询问。每次询问…

11.STL

STL阶段 禁止复制 文本查询扩展作业解析 get_file函数的作用就是进行预处理操作&#xff0c;将文件中的每一行的内容放在shared_ptr<vector<string>> file里面进行存储&#xff1b;然后对每一个单词进行处理&#xff0c;将单词与行号放在map<string, shared_p…